Current section

Files

Jump to
snowhite priv static js app.js
Raw

priv/static/js/app.js

/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "/js/";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ({
/***/ "../deps/phoenix/priv/static/phoenix.js":
/*!**********************************************!*\
!*** ../deps/phoenix/priv/static/phoenix.js ***!
\**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("!function (e, t) {\n true ? module.exports = t() : undefined;\n}(this, function () {\n return function (e) {\n var t = {};\n\n function n(i) {\n if (t[i]) return t[i].exports;\n var o = t[i] = {\n i: i,\n l: !1,\n exports: {}\n };\n return e[i].call(o.exports, o, o.exports, n), o.l = !0, o.exports;\n }\n\n return n.m = e, n.c = t, n.d = function (e, t, i) {\n n.o(e, t) || Object.defineProperty(e, t, {\n enumerable: !0,\n get: i\n });\n }, n.r = function (e) {\n \"undefined\" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {\n value: \"Module\"\n }), Object.defineProperty(e, \"__esModule\", {\n value: !0\n });\n }, n.t = function (e, t) {\n if (1 & t && (e = n(e)), 8 & t) return e;\n if (4 & t && \"object\" == typeof e && e && e.__esModule) return e;\n var i = Object.create(null);\n if (n.r(i), Object.defineProperty(i, \"default\", {\n enumerable: !0,\n value: e\n }), 2 & t && \"string\" != typeof e) for (var o in e) n.d(i, o, function (t) {\n return e[t];\n }.bind(null, o));\n return i;\n }, n.n = function (e) {\n var t = e && e.__esModule ? function () {\n return e.default;\n } : function () {\n return e;\n };\n return n.d(t, \"a\", t), t;\n }, n.o = function (e, t) {\n return Object.prototype.hasOwnProperty.call(e, t);\n }, n.p = \"\", n(n.s = 0);\n }([function (e, t, n) {\n (function (t) {\n e.exports = t.Phoenix = n(2);\n }).call(this, n(1));\n }, function (e, t) {\n var n;\n\n n = function () {\n return this;\n }();\n\n try {\n n = n || new Function(\"return this\")();\n } catch (e) {\n \"object\" == typeof window && (n = window);\n }\n\n e.exports = n;\n }, function (e, t, n) {\n \"use strict\";\n\n function i(e) {\n return function (e) {\n if (Array.isArray(e)) return a(e);\n }(e) || function (e) {\n if (\"undefined\" != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e);\n }(e) || s(e) || function () {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }();\n }\n\n function o(e) {\n return (o = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (e) {\n return typeof e;\n } : function (e) {\n return e && \"function\" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e;\n })(e);\n }\n\n function r(e, t) {\n return function (e) {\n if (Array.isArray(e)) return e;\n }(e) || function (e, t) {\n if (\"undefined\" == typeof Symbol || !(Symbol.iterator in Object(e))) return;\n var n = [],\n i = !0,\n o = !1,\n r = void 0;\n\n try {\n for (var s, a = e[Symbol.iterator](); !(i = (s = a.next()).done) && (n.push(s.value), !t || n.length !== t); i = !0);\n } catch (e) {\n o = !0, r = e;\n } finally {\n try {\n i || null == a.return || a.return();\n } finally {\n if (o) throw r;\n }\n }\n\n return n;\n }(e, t) || s(e, t) || function () {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }();\n }\n\n function s(e, t) {\n if (e) {\n if (\"string\" == typeof e) return a(e, t);\n var n = Object.prototype.toString.call(e).slice(8, -1);\n return \"Object\" === n && e.constructor && (n = e.constructor.name), \"Map\" === n || \"Set\" === n ? Array.from(n) : \"Arguments\" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? a(e, t) : void 0;\n }\n }\n\n function a(e, t) {\n (null == t || t > e.length) && (t = e.length);\n\n for (var n = 0, i = new Array(t); n < t; n++) i[n] = e[n];\n\n return i;\n }\n\n function c(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }\n\n function u(e, t) {\n for (var n = 0; n < t.length; n++) {\n var i = t[n];\n i.enumerable = i.enumerable || !1, i.configurable = !0, \"value\" in i && (i.writable = !0), Object.defineProperty(e, i.key, i);\n }\n }\n\n function h(e, t, n) {\n return t && u(e.prototype, t), n && u(e, n), e;\n }\n\n n.r(t), n.d(t, \"Channel\", function () {\n return A;\n }), n.d(t, \"Serializer\", function () {\n return M;\n }), n.d(t, \"Socket\", function () {\n return J;\n }), n.d(t, \"LongPoll\", function () {\n return H;\n }), n.d(t, \"Ajax\", function () {\n return D;\n }), n.d(t, \"Presence\", function () {\n return B;\n });\n\n var l = \"undefined\" != typeof self ? self : null,\n f = \"undefined\" != typeof window ? window : null,\n d = l || f || void 0,\n p = 0,\n v = 1,\n y = 2,\n m = 3,\n g = \"closed\",\n k = \"errored\",\n b = \"joined\",\n j = \"joining\",\n C = \"leaving\",\n R = \"phx_close\",\n S = \"phx_error\",\n T = \"phx_join\",\n w = \"phx_reply\",\n E = \"phx_leave\",\n x = [R, S, T, w, E],\n O = \"longpoll\",\n P = \"websocket\",\n L = function (e) {\n if (\"function\" == typeof e) return e;\n return function () {\n return e;\n };\n },\n _ = function () {\n function e(t, n, i, o) {\n c(this, e), this.channel = t, this.event = n, this.payload = i || function () {\n return {};\n }, this.receivedResp = null, this.timeout = o, this.timeoutTimer = null, this.recHooks = [], this.sent = !1;\n }\n\n return h(e, [{\n key: \"resend\",\n value: function (e) {\n this.timeout = e, this.reset(), this.send();\n }\n }, {\n key: \"send\",\n value: function () {\n this.hasReceived(\"timeout\") || (this.startTimeout(), this.sent = !0, this.channel.socket.push({\n topic: this.channel.topic,\n event: this.event,\n payload: this.payload(),\n ref: this.ref,\n join_ref: this.channel.joinRef()\n }));\n }\n }, {\n key: \"receive\",\n value: function (e, t) {\n return this.hasReceived(e) && t(this.receivedResp.response), this.recHooks.push({\n status: e,\n callback: t\n }), this;\n }\n }, {\n key: \"reset\",\n value: function () {\n this.cancelRefEvent(), this.ref = null, this.refEvent = null, this.receivedResp = null, this.sent = !1;\n }\n }, {\n key: \"matchReceive\",\n value: function (e) {\n var t = e.status,\n n = e.response;\n e.ref;\n this.recHooks.filter(function (e) {\n return e.status === t;\n }).forEach(function (e) {\n return e.callback(n);\n });\n }\n }, {\n key: \"cancelRefEvent\",\n value: function () {\n this.refEvent && this.channel.off(this.refEvent);\n }\n }, {\n key: \"cancelTimeout\",\n value: function () {\n clearTimeout(this.timeoutTimer), this.timeoutTimer = null;\n }\n }, {\n key: \"startTimeout\",\n value: function () {\n var e = this;\n this.timeoutTimer && this.cancelTimeout(), this.ref = this.channel.socket.makeRef(), this.refEvent = this.channel.replyEventName(this.ref), this.channel.on(this.refEvent, function (t) {\n e.cancelRefEvent(), e.cancelTimeout(), e.receivedResp = t, e.matchReceive(t);\n }), this.timeoutTimer = setTimeout(function () {\n e.trigger(\"timeout\", {});\n }, this.timeout);\n }\n }, {\n key: \"hasReceived\",\n value: function (e) {\n return this.receivedResp && this.receivedResp.status === e;\n }\n }, {\n key: \"trigger\",\n value: function (e, t) {\n this.channel.trigger(this.refEvent, {\n status: e,\n response: t\n });\n }\n }]), e;\n }(),\n A = function () {\n function e(t, n, i) {\n var o = this;\n c(this, e), this.state = g, this.topic = t, this.params = L(n || {}), this.socket = i, this.bindings = [], this.bindingRef = 0, this.timeout = this.socket.timeout, this.joinedOnce = !1, this.joinPush = new _(this, T, this.params, this.timeout), this.pushBuffer = [], this.stateChangeRefs = [], this.rejoinTimer = new I(function () {\n o.socket.isConnected() && o.rejoin();\n }, this.socket.rejoinAfterMs), this.stateChangeRefs.push(this.socket.onError(function () {\n return o.rejoinTimer.reset();\n })), this.stateChangeRefs.push(this.socket.onOpen(function () {\n o.rejoinTimer.reset(), o.isErrored() && o.rejoin();\n })), this.joinPush.receive(\"ok\", function () {\n o.state = b, o.rejoinTimer.reset(), o.pushBuffer.forEach(function (e) {\n return e.send();\n }), o.pushBuffer = [];\n }), this.joinPush.receive(\"error\", function () {\n o.state = k, o.socket.isConnected() && o.rejoinTimer.scheduleTimeout();\n }), this.onClose(function () {\n o.rejoinTimer.reset(), o.socket.hasLogger() && o.socket.log(\"channel\", \"close \".concat(o.topic, \" \").concat(o.joinRef())), o.state = g, o.socket.remove(o);\n }), this.onError(function (e) {\n o.socket.hasLogger() && o.socket.log(\"channel\", \"error \".concat(o.topic), e), o.isJoining() && o.joinPush.reset(), o.state = k, o.socket.isConnected() && o.rejoinTimer.scheduleTimeout();\n }), this.joinPush.receive(\"timeout\", function () {\n o.socket.hasLogger() && o.socket.log(\"channel\", \"timeout \".concat(o.topic, \" (\").concat(o.joinRef(), \")\"), o.joinPush.timeout), new _(o, E, L({}), o.timeout).send(), o.state = k, o.joinPush.reset(), o.socket.isConnected() && o.rejoinTimer.scheduleTimeout();\n }), this.on(w, function (e, t) {\n o.trigger(o.replyEventName(t), e);\n });\n }\n\n return h(e, [{\n key: \"join\",\n value: function () {\n var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.timeout;\n if (this.joinedOnce) throw new Error(\"tried to join multiple times. 'join' can only be called a single time per channel instance\");\n return this.timeout = e, this.joinedOnce = !0, this.rejoin(), this.joinPush;\n }\n }, {\n key: \"onClose\",\n value: function (e) {\n this.on(R, e);\n }\n }, {\n key: \"onError\",\n value: function (e) {\n return this.on(S, function (t) {\n return e(t);\n });\n }\n }, {\n key: \"on\",\n value: function (e, t) {\n var n = this.bindingRef++;\n return this.bindings.push({\n event: e,\n ref: n,\n callback: t\n }), n;\n }\n }, {\n key: \"off\",\n value: function (e, t) {\n this.bindings = this.bindings.filter(function (n) {\n return !(n.event === e && (void 0 === t || t === n.ref));\n });\n }\n }, {\n key: \"canPush\",\n value: function () {\n return this.socket.isConnected() && this.isJoined();\n }\n }, {\n key: \"push\",\n value: function (e, t) {\n var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : this.timeout;\n if (!this.joinedOnce) throw new Error(\"tried to push '\".concat(e, \"' to '\").concat(this.topic, \"' before joining. Use channel.join() before pushing events\"));\n var i = new _(this, e, function () {\n return t;\n }, n);\n return this.canPush() ? i.send() : (i.startTimeout(), this.pushBuffer.push(i)), i;\n }\n }, {\n key: \"leave\",\n value: function () {\n var e = this,\n t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.timeout;\n this.rejoinTimer.reset(), this.joinPush.cancelTimeout(), this.state = C;\n\n var n = function () {\n e.socket.hasLogger() && e.socket.log(\"channel\", \"leave \".concat(e.topic)), e.trigger(R, \"leave\");\n },\n i = new _(this, E, L({}), t);\n\n return i.receive(\"ok\", function () {\n return n();\n }).receive(\"timeout\", function () {\n return n();\n }), i.send(), this.canPush() || i.trigger(\"ok\", {}), i;\n }\n }, {\n key: \"onMessage\",\n value: function (e, t, n) {\n return t;\n }\n }, {\n key: \"isLifecycleEvent\",\n value: function (e) {\n return x.indexOf(e) >= 0;\n }\n }, {\n key: \"isMember\",\n value: function (e, t, n, i) {\n return this.topic === e && (!i || i === this.joinRef() || !this.isLifecycleEvent(t) || (this.socket.hasLogger() && this.socket.log(\"channel\", \"dropping outdated message\", {\n topic: e,\n event: t,\n payload: n,\n joinRef: i\n }), !1));\n }\n }, {\n key: \"joinRef\",\n value: function () {\n return this.joinPush.ref;\n }\n }, {\n key: \"rejoin\",\n value: function () {\n var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.timeout;\n this.isLeaving() || (this.socket.leaveOpenTopic(this.topic), this.state = j, this.joinPush.resend(e));\n }\n }, {\n key: \"trigger\",\n value: function (e, t, n, i) {\n var o = this.onMessage(e, t, n, i);\n if (t && !o) throw new Error(\"channel onMessage callbacks must return the payload, modified or unmodified\");\n\n for (var r = this.bindings.filter(function (t) {\n return t.event === e;\n }), s = 0; s < r.length; s++) {\n r[s].callback(o, n, i || this.joinRef());\n }\n }\n }, {\n key: \"replyEventName\",\n value: function (e) {\n return \"chan_reply_\".concat(e);\n }\n }, {\n key: \"isClosed\",\n value: function () {\n return this.state === g;\n }\n }, {\n key: \"isErrored\",\n value: function () {\n return this.state === k;\n }\n }, {\n key: \"isJoined\",\n value: function () {\n return this.state === b;\n }\n }, {\n key: \"isJoining\",\n value: function () {\n return this.state === j;\n }\n }, {\n key: \"isLeaving\",\n value: function () {\n return this.state === C;\n }\n }]), e;\n }(),\n M = {\n encode: function (e, t) {\n var n = [e.join_ref, e.ref, e.topic, e.event, e.payload];\n return t(JSON.stringify(n));\n },\n decode: function (e, t) {\n var n = r(JSON.parse(e), 5);\n return t({\n join_ref: n[0],\n ref: n[1],\n topic: n[2],\n event: n[3],\n payload: n[4]\n });\n }\n },\n J = function () {\n function e(t) {\n var n = this,\n i = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};\n c(this, e), this.stateChangeCallbacks = {\n open: [],\n close: [],\n error: [],\n message: []\n }, this.channels = [], this.sendBuffer = [], this.ref = 0, this.timeout = i.timeout || 1e4, this.transport = i.transport || d.WebSocket || H, this.defaultEncoder = M.encode, this.defaultDecoder = M.decode, this.closeWasClean = !1, this.unloaded = !1, this.binaryType = i.binaryType || \"arraybuffer\", this.transport !== H ? (this.encode = i.encode || this.defaultEncoder, this.decode = i.decode || this.defaultDecoder) : (this.encode = this.defaultEncoder, this.decode = this.defaultDecoder), f && f.addEventListener && f.addEventListener(\"unload\", function (e) {\n n.conn && (n.unloaded = !0, n.abnormalClose(\"unloaded\"));\n }), this.heartbeatIntervalMs = i.heartbeatIntervalMs || 3e4, this.rejoinAfterMs = function (e) {\n return i.rejoinAfterMs ? i.rejoinAfterMs(e) : [1e3, 2e3, 5e3][e - 1] || 1e4;\n }, this.reconnectAfterMs = function (e) {\n return n.unloaded ? 100 : i.reconnectAfterMs ? i.reconnectAfterMs(e) : [10, 50, 100, 150, 200, 250, 500, 1e3, 2e3][e - 1] || 5e3;\n }, this.logger = i.logger || null, this.longpollerTimeout = i.longpollerTimeout || 2e4, this.params = L(i.params || {}), this.endPoint = \"\".concat(t, \"/\").concat(P), this.vsn = i.vsn || \"2.0.0\", this.heartbeatTimer = null, this.pendingHeartbeatRef = null, this.reconnectTimer = new I(function () {\n n.teardown(function () {\n return n.connect();\n });\n }, this.reconnectAfterMs);\n }\n\n return h(e, [{\n key: \"protocol\",\n value: function () {\n return location.protocol.match(/^https/) ? \"wss\" : \"ws\";\n }\n }, {\n key: \"endPointURL\",\n value: function () {\n var e = D.appendParams(D.appendParams(this.endPoint, this.params()), {\n vsn: this.vsn\n });\n return \"/\" !== e.charAt(0) ? e : \"/\" === e.charAt(1) ? \"\".concat(this.protocol(), \":\").concat(e) : \"\".concat(this.protocol(), \"://\").concat(location.host).concat(e);\n }\n }, {\n key: \"disconnect\",\n value: function (e, t, n) {\n this.closeWasClean = !0, this.reconnectTimer.reset(), this.teardown(e, t, n);\n }\n }, {\n key: \"connect\",\n value: function (e) {\n var t = this;\n e && (console && console.log(\"passing params to connect is deprecated. Instead pass :params to the Socket constructor\"), this.params = L(e)), this.conn || (this.closeWasClean = !1, this.conn = new this.transport(this.endPointURL()), this.conn.binaryType = this.binaryType, this.conn.timeout = this.longpollerTimeout, this.conn.onopen = function () {\n return t.onConnOpen();\n }, this.conn.onerror = function (e) {\n return t.onConnError(e);\n }, this.conn.onmessage = function (e) {\n return t.onConnMessage(e);\n }, this.conn.onclose = function (e) {\n return t.onConnClose(e);\n });\n }\n }, {\n key: \"log\",\n value: function (e, t, n) {\n this.logger(e, t, n);\n }\n }, {\n key: \"hasLogger\",\n value: function () {\n return null !== this.logger;\n }\n }, {\n key: \"onOpen\",\n value: function (e) {\n var t = this.makeRef();\n return this.stateChangeCallbacks.open.push([t, e]), t;\n }\n }, {\n key: \"onClose\",\n value: function (e) {\n var t = this.makeRef();\n return this.stateChangeCallbacks.close.push([t, e]), t;\n }\n }, {\n key: \"onError\",\n value: function (e) {\n var t = this.makeRef();\n return this.stateChangeCallbacks.error.push([t, e]), t;\n }\n }, {\n key: \"onMessage\",\n value: function (e) {\n var t = this.makeRef();\n return this.stateChangeCallbacks.message.push([t, e]), t;\n }\n }, {\n key: \"onConnOpen\",\n value: function () {\n this.hasLogger() && this.log(\"transport\", \"connected to \".concat(this.endPointURL())), this.unloaded = !1, this.closeWasClean = !1, this.flushSendBuffer(), this.reconnectTimer.reset(), this.resetHeartbeat(), this.stateChangeCallbacks.open.forEach(function (e) {\n return (0, r(e, 2)[1])();\n });\n }\n }, {\n key: \"resetHeartbeat\",\n value: function () {\n var e = this;\n this.conn && this.conn.skipHeartbeat || (this.pendingHeartbeatRef = null, clearInterval(this.heartbeatTimer), this.heartbeatTimer = setInterval(function () {\n return e.sendHeartbeat();\n }, this.heartbeatIntervalMs));\n }\n }, {\n key: \"teardown\",\n value: function (e, t, n) {\n var i = this;\n if (!this.conn) return e && e();\n this.waitForBufferDone(function () {\n i.conn && (t ? i.conn.close(t, n || \"\") : i.conn.close()), i.waitForSocketClosed(function () {\n i.conn && (i.conn.onclose = function () {}, i.conn = null), e && e();\n });\n });\n }\n }, {\n key: \"waitForBufferDone\",\n value: function (e) {\n var t = this,\n n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 1;\n 5 !== n && this.conn && this.conn.bufferedAmount ? setTimeout(function () {\n t.waitForBufferDone(e, n + 1);\n }, 150 * n) : e();\n }\n }, {\n key: \"waitForSocketClosed\",\n value: function (e) {\n var t = this,\n n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 1;\n 5 !== n && this.conn && this.conn.readyState !== m ? setTimeout(function () {\n t.waitForSocketClosed(e, n + 1);\n }, 150 * n) : e();\n }\n }, {\n key: \"onConnClose\",\n value: function (e) {\n this.hasLogger() && this.log(\"transport\", \"close\", e), this.triggerChanError(), clearInterval(this.heartbeatTimer), this.closeWasClean || this.reconnectTimer.scheduleTimeout(), this.stateChangeCallbacks.close.forEach(function (t) {\n return (0, r(t, 2)[1])(e);\n });\n }\n }, {\n key: \"onConnError\",\n value: function (e) {\n this.hasLogger() && this.log(\"transport\", e), this.triggerChanError(), this.stateChangeCallbacks.error.forEach(function (t) {\n return (0, r(t, 2)[1])(e);\n });\n }\n }, {\n key: \"triggerChanError\",\n value: function () {\n this.channels.forEach(function (e) {\n e.isErrored() || e.isLeaving() || e.isClosed() || e.trigger(S);\n });\n }\n }, {\n key: \"connectionState\",\n value: function () {\n switch (this.conn && this.conn.readyState) {\n case p:\n return \"connecting\";\n\n case v:\n return \"open\";\n\n case y:\n return \"closing\";\n\n default:\n return \"closed\";\n }\n }\n }, {\n key: \"isConnected\",\n value: function () {\n return \"open\" === this.connectionState();\n }\n }, {\n key: \"remove\",\n value: function (e) {\n this.off(e.stateChangeRefs), this.channels = this.channels.filter(function (t) {\n return t.joinRef() !== e.joinRef();\n });\n }\n }, {\n key: \"off\",\n value: function (e) {\n for (var t in this.stateChangeCallbacks) this.stateChangeCallbacks[t] = this.stateChangeCallbacks[t].filter(function (t) {\n var n = r(t, 1)[0];\n return -1 === e.indexOf(n);\n });\n }\n }, {\n key: \"channel\",\n value: function (e) {\n var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {},\n n = new A(e, t, this);\n return this.channels.push(n), n;\n }\n }, {\n key: \"push\",\n value: function (e) {\n var t = this;\n\n if (this.hasLogger()) {\n var n = e.topic,\n i = e.event,\n o = e.payload,\n r = e.ref,\n s = e.join_ref;\n this.log(\"push\", \"\".concat(n, \" \").concat(i, \" (\").concat(s, \", \").concat(r, \")\"), o);\n }\n\n this.isConnected() ? this.encode(e, function (e) {\n return t.conn.send(e);\n }) : this.sendBuffer.push(function () {\n return t.encode(e, function (e) {\n return t.conn.send(e);\n });\n });\n }\n }, {\n key: \"makeRef\",\n value: function () {\n var e = this.ref + 1;\n return e === this.ref ? this.ref = 0 : this.ref = e, this.ref.toString();\n }\n }, {\n key: \"sendHeartbeat\",\n value: function () {\n if (this.isConnected()) {\n if (this.pendingHeartbeatRef) return this.pendingHeartbeatRef = null, this.hasLogger() && this.log(\"transport\", \"heartbeat timeout. Attempting to re-establish connection\"), void this.abnormalClose(\"heartbeat timeout\");\n this.pendingHeartbeatRef = this.makeRef(), this.push({\n topic: \"phoenix\",\n event: \"heartbeat\",\n payload: {},\n ref: this.pendingHeartbeatRef\n });\n }\n }\n }, {\n key: \"abnormalClose\",\n value: function (e) {\n this.closeWasClean = !1, this.conn.close(1e3, e);\n }\n }, {\n key: \"flushSendBuffer\",\n value: function () {\n this.isConnected() && this.sendBuffer.length > 0 && (this.sendBuffer.forEach(function (e) {\n return e();\n }), this.sendBuffer = []);\n }\n }, {\n key: \"onConnMessage\",\n value: function (e) {\n var t = this;\n this.decode(e.data, function (e) {\n var n = e.topic,\n i = e.event,\n o = e.payload,\n s = e.ref,\n a = e.join_ref;\n s && s === t.pendingHeartbeatRef && (t.pendingHeartbeatRef = null), t.hasLogger() && t.log(\"receive\", \"\".concat(o.status || \"\", \" \").concat(n, \" \").concat(i, \" \").concat(s && \"(\" + s + \")\" || \"\"), o);\n\n for (var c = 0; c < t.channels.length; c++) {\n var u = t.channels[c];\n u.isMember(n, i, o, a) && u.trigger(i, o, s, a);\n }\n\n for (var h = 0; h < t.stateChangeCallbacks.message.length; h++) {\n (0, r(t.stateChangeCallbacks.message[h], 2)[1])(e);\n }\n });\n }\n }, {\n key: \"leaveOpenTopic\",\n value: function (e) {\n var t = this.channels.find(function (t) {\n return t.topic === e && (t.isJoined() || t.isJoining());\n });\n t && (this.hasLogger() && this.log(\"transport\", 'leaving duplicate topic \"'.concat(e, '\"')), t.leave());\n }\n }]), e;\n }(),\n H = function () {\n function e(t) {\n c(this, e), this.endPoint = null, this.token = null, this.skipHeartbeat = !0, this.onopen = function () {}, this.onerror = function () {}, this.onmessage = function () {}, this.onclose = function () {}, this.pollEndpoint = this.normalizeEndpoint(t), this.readyState = p, this.poll();\n }\n\n return h(e, [{\n key: \"normalizeEndpoint\",\n value: function (e) {\n return e.replace(\"ws://\", \"http://\").replace(\"wss://\", \"https://\").replace(new RegExp(\"(.*)/\" + P), \"$1/\" + O);\n }\n }, {\n key: \"endpointURL\",\n value: function () {\n return D.appendParams(this.pollEndpoint, {\n token: this.token\n });\n }\n }, {\n key: \"closeAndRetry\",\n value: function () {\n this.close(), this.readyState = p;\n }\n }, {\n key: \"ontimeout\",\n value: function () {\n this.onerror(\"timeout\"), this.closeAndRetry();\n }\n }, {\n key: \"poll\",\n value: function () {\n var e = this;\n this.readyState !== v && this.readyState !== p || D.request(\"GET\", this.endpointURL(), \"application/json\", null, this.timeout, this.ontimeout.bind(this), function (t) {\n if (t) {\n var n = t.status,\n i = t.token,\n o = t.messages;\n e.token = i;\n } else n = 0;\n\n switch (n) {\n case 200:\n o.forEach(function (t) {\n return e.onmessage({\n data: t\n });\n }), e.poll();\n break;\n\n case 204:\n e.poll();\n break;\n\n case 410:\n e.readyState = v, e.onopen(), e.poll();\n break;\n\n case 403:\n e.onerror(), e.close();\n break;\n\n case 0:\n case 500:\n e.onerror(), e.closeAndRetry();\n break;\n\n default:\n throw new Error(\"unhandled poll status \".concat(n));\n }\n });\n }\n }, {\n key: \"send\",\n value: function (e) {\n var t = this;\n D.request(\"POST\", this.endpointURL(), \"application/json\", e, this.timeout, this.onerror.bind(this, \"timeout\"), function (e) {\n e && 200 === e.status || (t.onerror(e && e.status), t.closeAndRetry());\n });\n }\n }, {\n key: \"close\",\n value: function (e, t) {\n this.readyState = m, this.onclose();\n }\n }]), e;\n }(),\n D = function () {\n function e() {\n c(this, e);\n }\n\n return h(e, null, [{\n key: \"request\",\n value: function (e, t, n, i, o, r, s) {\n if (d.XDomainRequest) {\n var a = new XDomainRequest();\n this.xdomainRequest(a, e, t, i, o, r, s);\n } else {\n var c = new d.XMLHttpRequest();\n this.xhrRequest(c, e, t, n, i, o, r, s);\n }\n }\n }, {\n key: \"xdomainRequest\",\n value: function (e, t, n, i, o, r, s) {\n var a = this;\n e.timeout = o, e.open(t, n), e.onload = function () {\n var t = a.parseJSON(e.responseText);\n s && s(t);\n }, r && (e.ontimeout = r), e.onprogress = function () {}, e.send(i);\n }\n }, {\n key: \"xhrRequest\",\n value: function (e, t, n, i, o, r, s, a) {\n var c = this;\n e.open(t, n, !0), e.timeout = r, e.setRequestHeader(\"Content-Type\", i), e.onerror = function () {\n a && a(null);\n }, e.onreadystatechange = function () {\n if (e.readyState === c.states.complete && a) {\n var t = c.parseJSON(e.responseText);\n a(t);\n }\n }, s && (e.ontimeout = s), e.send(o);\n }\n }, {\n key: \"parseJSON\",\n value: function (e) {\n if (!e || \"\" === e) return null;\n\n try {\n return JSON.parse(e);\n } catch (t) {\n return console && console.log(\"failed to parse JSON response\", e), null;\n }\n }\n }, {\n key: \"serialize\",\n value: function (e, t) {\n var n = [];\n\n for (var i in e) if (e.hasOwnProperty(i)) {\n var r = t ? \"\".concat(t, \"[\").concat(i, \"]\") : i,\n s = e[i];\n \"object\" === o(s) ? n.push(this.serialize(s, r)) : n.push(encodeURIComponent(r) + \"=\" + encodeURIComponent(s));\n }\n\n return n.join(\"&\");\n }\n }, {\n key: \"appendParams\",\n value: function (e, t) {\n if (0 === Object.keys(t).length) return e;\n var n = e.match(/\\?/) ? \"&\" : \"?\";\n return \"\".concat(e).concat(n).concat(this.serialize(t));\n }\n }]), e;\n }();\n\n D.states = {\n complete: 4\n };\n\n var B = function () {\n function e(t) {\n var n = this,\n i = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};\n c(this, e);\n var o = i.events || {\n state: \"presence_state\",\n diff: \"presence_diff\"\n };\n this.state = {}, this.pendingDiffs = [], this.channel = t, this.joinRef = null, this.caller = {\n onJoin: function () {},\n onLeave: function () {},\n onSync: function () {}\n }, this.channel.on(o.state, function (t) {\n var i = n.caller,\n o = i.onJoin,\n r = i.onLeave,\n s = i.onSync;\n n.joinRef = n.channel.joinRef(), n.state = e.syncState(n.state, t, o, r), n.pendingDiffs.forEach(function (t) {\n n.state = e.syncDiff(n.state, t, o, r);\n }), n.pendingDiffs = [], s();\n }), this.channel.on(o.diff, function (t) {\n var i = n.caller,\n o = i.onJoin,\n r = i.onLeave,\n s = i.onSync;\n n.inPendingSyncState() ? n.pendingDiffs.push(t) : (n.state = e.syncDiff(n.state, t, o, r), s());\n });\n }\n\n return h(e, [{\n key: \"onJoin\",\n value: function (e) {\n this.caller.onJoin = e;\n }\n }, {\n key: \"onLeave\",\n value: function (e) {\n this.caller.onLeave = e;\n }\n }, {\n key: \"onSync\",\n value: function (e) {\n this.caller.onSync = e;\n }\n }, {\n key: \"list\",\n value: function (t) {\n return e.list(this.state, t);\n }\n }, {\n key: \"inPendingSyncState\",\n value: function () {\n return !this.joinRef || this.joinRef !== this.channel.joinRef();\n }\n }], [{\n key: \"syncState\",\n value: function (e, t, n, i) {\n var o = this,\n r = this.clone(e),\n s = {},\n a = {};\n return this.map(r, function (e, n) {\n t[e] || (a[e] = n);\n }), this.map(t, function (e, t) {\n var n = r[e];\n\n if (n) {\n var i = t.metas.map(function (e) {\n return e.phx_ref;\n }),\n c = n.metas.map(function (e) {\n return e.phx_ref;\n }),\n u = t.metas.filter(function (e) {\n return c.indexOf(e.phx_ref) < 0;\n }),\n h = n.metas.filter(function (e) {\n return i.indexOf(e.phx_ref) < 0;\n });\n u.length > 0 && (s[e] = t, s[e].metas = u), h.length > 0 && (a[e] = o.clone(n), a[e].metas = h);\n } else s[e] = t;\n }), this.syncDiff(r, {\n joins: s,\n leaves: a\n }, n, i);\n }\n }, {\n key: \"syncDiff\",\n value: function (e, t, n, o) {\n var r = t.joins,\n s = t.leaves,\n a = this.clone(e);\n return n || (n = function () {}), o || (o = function () {}), this.map(r, function (e, t) {\n var o = a[e];\n\n if (a[e] = t, o) {\n var r,\n s = a[e].metas.map(function (e) {\n return e.phx_ref;\n }),\n c = o.metas.filter(function (e) {\n return s.indexOf(e.phx_ref) < 0;\n });\n (r = a[e].metas).unshift.apply(r, i(c));\n }\n\n n(e, o, t);\n }), this.map(s, function (e, t) {\n var n = a[e];\n\n if (n) {\n var i = t.metas.map(function (e) {\n return e.phx_ref;\n });\n n.metas = n.metas.filter(function (e) {\n return i.indexOf(e.phx_ref) < 0;\n }), o(e, n, t), 0 === n.metas.length && delete a[e];\n }\n }), a;\n }\n }, {\n key: \"list\",\n value: function (e, t) {\n return t || (t = function (e, t) {\n return t;\n }), this.map(e, function (e, n) {\n return t(e, n);\n });\n }\n }, {\n key: \"map\",\n value: function (e, t) {\n return Object.getOwnPropertyNames(e).map(function (n) {\n return t(n, e[n]);\n });\n }\n }, {\n key: \"clone\",\n value: function (e) {\n return JSON.parse(JSON.stringify(e));\n }\n }]), e;\n }(),\n I = function () {\n function e(t, n) {\n c(this, e), this.callback = t, this.timerCalc = n, this.timer = null, this.tries = 0;\n }\n\n return h(e, [{\n key: \"reset\",\n value: function () {\n this.tries = 0, clearTimeout(this.timer);\n }\n }, {\n key: \"scheduleTimeout\",\n value: function () {\n var e = this;\n clearTimeout(this.timer), this.timer = setTimeout(function () {\n e.tries = e.tries + 1, e.callback();\n }, this.timerCalc(this.tries + 1));\n }\n }]), e;\n }();\n }]);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vZGVwcy9waG9lbml4L3ByaXYvc3RhdGljL3Bob2VuaXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vZGVwcy9waG9lbml4L3ByaXYvc3RhdGljL3Bob2VuaXguanM/MzFiYiJdLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSx0KTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLlBob2VuaXg9dCgpOmUuUGhvZW5peD10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIG4oaSl7aWYodFtpXSlyZXR1cm4gdFtpXS5leHBvcnRzO3ZhciBvPXRbaV09e2k6aSxsOiExLGV4cG9ydHM6e319O3JldHVybiBlW2ldLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIG4ubT1lLG4uYz10LG4uZD1mdW5jdGlvbihlLHQsaSl7bi5vKGUsdCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsZ2V0Oml9KX0sbi5yPWZ1bmN0aW9uKGUpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbihlLHQpe2lmKDEmdCYmKGU9bihlKSksOCZ0KXJldHVybiBlO2lmKDQmdCYmXCJvYmplY3RcIj09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZ0JiZcInN0cmluZ1wiIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSluLmQoaSxvLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsbykpO3JldHVybiBpfSxuLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIG4uZCh0LFwiYVwiLHQpLHR9LG4ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sbi5wPVwiXCIsbihuLnM9MCl9KFtmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKHQpe2UuZXhwb3J0cz10LlBob2VuaXg9bigyKX0pLmNhbGwodGhpcyxuKDEpKX0sZnVuY3Rpb24oZSx0KXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKX1jYXRjaChlKXtcIm9iamVjdFwiPT10eXBlb2Ygd2luZG93JiYobj13aW5kb3cpfWUuZXhwb3J0cz1ufSxmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gYShlKX0oZSl8fGZ1bmN0aW9uKGUpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpcmV0dXJuIEFycmF5LmZyb20oZSl9KGUpfHxzKGUpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpfSgpfWZ1bmN0aW9uIG8oZSl7cmV0dXJuKG89XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgZX0pKGUpfWZ1bmN0aW9uIHIoZSx0KXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZX0oZSl8fGZ1bmN0aW9uKGUsdCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFN5bWJvbHx8IShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSlyZXR1cm47dmFyIG49W10saT0hMCxvPSExLHI9dm9pZCAwO3RyeXtmb3IodmFyIHMsYT1lW1N5bWJvbC5pdGVyYXRvcl0oKTshKGk9KHM9YS5uZXh0KCkpLmRvbmUpJiYobi5wdXNoKHMudmFsdWUpLCF0fHxuLmxlbmd0aCE9PXQpO2k9ITApO31jYXRjaChlKXtvPSEwLHI9ZX1maW5hbGx5e3RyeXtpfHxudWxsPT1hLnJldHVybnx8YS5yZXR1cm4oKX1maW5hbGx5e2lmKG8pdGhyb3cgcn19cmV0dXJuIG59KGUsdCl8fHMoZSx0KXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpfSgpfWZ1bmN0aW9uIHMoZSx0KXtpZihlKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZSlyZXR1cm4gYShlLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm5cIk9iamVjdFwiPT09biYmZS5jb25zdHJ1Y3RvciYmKG49ZS5jb25zdHJ1Y3Rvci5uYW1lKSxcIk1hcFwiPT09bnx8XCJTZXRcIj09PW4/QXJyYXkuZnJvbShuKTpcIkFyZ3VtZW50c1wiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/YShlLHQpOnZvaWQgMH19ZnVuY3Rpb24gYShlLHQpeyhudWxsPT10fHx0PmUubGVuZ3RoKSYmKHQ9ZS5sZW5ndGgpO2Zvcih2YXIgbj0wLGk9bmV3IEFycmF5KHQpO248dDtuKyspaVtuXT1lW25dO3JldHVybiBpfWZ1bmN0aW9uIGMoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIHUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dFtuXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBpJiYoaS53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaS5rZXksaSl9fWZ1bmN0aW9uIGgoZSx0LG4pe3JldHVybiB0JiZ1KGUucHJvdG90eXBlLHQpLG4mJnUoZSxuKSxlfW4ucih0KSxuLmQodCxcIkNoYW5uZWxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gQX0pKSxuLmQodCxcIlNlcmlhbGl6ZXJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTX0pKSxuLmQodCxcIlNvY2tldFwiLChmdW5jdGlvbigpe3JldHVybiBKfSkpLG4uZCh0LFwiTG9uZ1BvbGxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSH0pKSxuLmQodCxcIkFqYXhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRH0pKSxuLmQodCxcIlByZXNlbmNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEJ9KSk7dmFyIGw9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjpudWxsLGY9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6bnVsbCxkPWx8fGZ8fHZvaWQgMCxwPTAsdj0xLHk9MixtPTMsZz1cImNsb3NlZFwiLGs9XCJlcnJvcmVkXCIsYj1cImpvaW5lZFwiLGo9XCJqb2luaW5nXCIsQz1cImxlYXZpbmdcIixSPVwicGh4X2Nsb3NlXCIsUz1cInBoeF9lcnJvclwiLFQ9XCJwaHhfam9pblwiLHc9XCJwaHhfcmVwbHlcIixFPVwicGh4X2xlYXZlXCIseD1bUixTLFQsdyxFXSxPPVwibG9uZ3BvbGxcIixQPVwid2Vic29ja2V0XCIsTD1mdW5jdGlvbihlKXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBlKXJldHVybiBlO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlfX0sXz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuLGksbyl7Yyh0aGlzLGUpLHRoaXMuY2hhbm5lbD10LHRoaXMuZXZlbnQ9bix0aGlzLnBheWxvYWQ9aXx8ZnVuY3Rpb24oKXtyZXR1cm57fX0sdGhpcy5yZWNlaXZlZFJlc3A9bnVsbCx0aGlzLnRpbWVvdXQ9byx0aGlzLnRpbWVvdXRUaW1lcj1udWxsLHRoaXMucmVjSG9va3M9W10sdGhpcy5zZW50PSExfXJldHVybiBoKGUsW3trZXk6XCJyZXNlbmRcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnRpbWVvdXQ9ZSx0aGlzLnJlc2V0KCksdGhpcy5zZW5kKCl9fSx7a2V5Olwic2VuZFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5oYXNSZWNlaXZlZChcInRpbWVvdXRcIil8fCh0aGlzLnN0YXJ0VGltZW91dCgpLHRoaXMuc2VudD0hMCx0aGlzLmNoYW5uZWwuc29ja2V0LnB1c2goe3RvcGljOnRoaXMuY2hhbm5lbC50b3BpYyxldmVudDp0aGlzLmV2ZW50LHBheWxvYWQ6dGhpcy5wYXlsb2FkKCkscmVmOnRoaXMucmVmLGpvaW5fcmVmOnRoaXMuY2hhbm5lbC5qb2luUmVmKCl9KSl9fSx7a2V5OlwicmVjZWl2ZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuaGFzUmVjZWl2ZWQoZSkmJnQodGhpcy5yZWNlaXZlZFJlc3AucmVzcG9uc2UpLHRoaXMucmVjSG9va3MucHVzaCh7c3RhdHVzOmUsY2FsbGJhY2s6dH0pLHRoaXN9fSx7a2V5OlwicmVzZXRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuY2FuY2VsUmVmRXZlbnQoKSx0aGlzLnJlZj1udWxsLHRoaXMucmVmRXZlbnQ9bnVsbCx0aGlzLnJlY2VpdmVkUmVzcD1udWxsLHRoaXMuc2VudD0hMX19LHtrZXk6XCJtYXRjaFJlY2VpdmVcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXR1cyxuPWUucmVzcG9uc2U7ZS5yZWY7dGhpcy5yZWNIb29rcy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN0YXR1cz09PXR9KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2FsbGJhY2sobil9KSl9fSx7a2V5OlwiY2FuY2VsUmVmRXZlbnRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucmVmRXZlbnQmJnRoaXMuY2hhbm5lbC5vZmYodGhpcy5yZWZFdmVudCl9fSx7a2V5OlwiY2FuY2VsVGltZW91dFwiLHZhbHVlOmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFRpbWVyKSx0aGlzLnRpbWVvdXRUaW1lcj1udWxsfX0se2tleTpcInN0YXJ0VGltZW91dFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnRpbWVvdXRUaW1lciYmdGhpcy5jYW5jZWxUaW1lb3V0KCksdGhpcy5yZWY9dGhpcy5jaGFubmVsLnNvY2tldC5tYWtlUmVmKCksdGhpcy5yZWZFdmVudD10aGlzLmNoYW5uZWwucmVwbHlFdmVudE5hbWUodGhpcy5yZWYpLHRoaXMuY2hhbm5lbC5vbih0aGlzLnJlZkV2ZW50LChmdW5jdGlvbih0KXtlLmNhbmNlbFJlZkV2ZW50KCksZS5jYW5jZWxUaW1lb3V0KCksZS5yZWNlaXZlZFJlc3A9dCxlLm1hdGNoUmVjZWl2ZSh0KX0pKSx0aGlzLnRpbWVvdXRUaW1lcj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2UudHJpZ2dlcihcInRpbWVvdXRcIix7fSl9KSx0aGlzLnRpbWVvdXQpfX0se2tleTpcImhhc1JlY2VpdmVkXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVjZWl2ZWRSZXNwJiZ0aGlzLnJlY2VpdmVkUmVzcC5zdGF0dXM9PT1lfX0se2tleTpcInRyaWdnZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMuY2hhbm5lbC50cmlnZ2VyKHRoaXMucmVmRXZlbnQse3N0YXR1czplLHJlc3BvbnNlOnR9KX19XSksZX0oKSxBPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4saSl7dmFyIG89dGhpcztjKHRoaXMsZSksdGhpcy5zdGF0ZT1nLHRoaXMudG9waWM9dCx0aGlzLnBhcmFtcz1MKG58fHt9KSx0aGlzLnNvY2tldD1pLHRoaXMuYmluZGluZ3M9W10sdGhpcy5iaW5kaW5nUmVmPTAsdGhpcy50aW1lb3V0PXRoaXMuc29ja2V0LnRpbWVvdXQsdGhpcy5qb2luZWRPbmNlPSExLHRoaXMuam9pblB1c2g9bmV3IF8odGhpcyxULHRoaXMucGFyYW1zLHRoaXMudGltZW91dCksdGhpcy5wdXNoQnVmZmVyPVtdLHRoaXMuc3RhdGVDaGFuZ2VSZWZzPVtdLHRoaXMucmVqb2luVGltZXI9bmV3IEkoKGZ1bmN0aW9uKCl7by5zb2NrZXQuaXNDb25uZWN0ZWQoKSYmby5yZWpvaW4oKX0pLHRoaXMuc29ja2V0LnJlam9pbkFmdGVyTXMpLHRoaXMuc3RhdGVDaGFuZ2VSZWZzLnB1c2godGhpcy5zb2NrZXQub25FcnJvcigoZnVuY3Rpb24oKXtyZXR1cm4gby5yZWpvaW5UaW1lci5yZXNldCgpfSkpKSx0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uT3BlbigoZnVuY3Rpb24oKXtvLnJlam9pblRpbWVyLnJlc2V0KCksby5pc0Vycm9yZWQoKSYmby5yZWpvaW4oKX0pKSksdGhpcy5qb2luUHVzaC5yZWNlaXZlKFwib2tcIiwoZnVuY3Rpb24oKXtvLnN0YXRlPWIsby5yZWpvaW5UaW1lci5yZXNldCgpLG8ucHVzaEJ1ZmZlci5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gZS5zZW5kKCl9KSksby5wdXNoQnVmZmVyPVtdfSkpLHRoaXMuam9pblB1c2gucmVjZWl2ZShcImVycm9yXCIsKGZ1bmN0aW9uKCl7by5zdGF0ZT1rLG8uc29ja2V0LmlzQ29ubmVjdGVkKCkmJm8ucmVqb2luVGltZXIuc2NoZWR1bGVUaW1lb3V0KCl9KSksdGhpcy5vbkNsb3NlKChmdW5jdGlvbigpe28ucmVqb2luVGltZXIucmVzZXQoKSxvLnNvY2tldC5oYXNMb2dnZXIoKSYmby5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLFwiY2xvc2UgXCIuY29uY2F0KG8udG9waWMsXCIgXCIpLmNvbmNhdChvLmpvaW5SZWYoKSkpLG8uc3RhdGU9ZyxvLnNvY2tldC5yZW1vdmUobyl9KSksdGhpcy5vbkVycm9yKChmdW5jdGlvbihlKXtvLnNvY2tldC5oYXNMb2dnZXIoKSYmby5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLFwiZXJyb3IgXCIuY29uY2F0KG8udG9waWMpLGUpLG8uaXNKb2luaW5nKCkmJm8uam9pblB1c2gucmVzZXQoKSxvLnN0YXRlPWssby5zb2NrZXQuaXNDb25uZWN0ZWQoKSYmby5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKX0pKSx0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJ0aW1lb3V0XCIsKGZ1bmN0aW9uKCl7by5zb2NrZXQuaGFzTG9nZ2VyKCkmJm8uc29ja2V0LmxvZyhcImNoYW5uZWxcIixcInRpbWVvdXQgXCIuY29uY2F0KG8udG9waWMsXCIgKFwiKS5jb25jYXQoby5qb2luUmVmKCksXCIpXCIpLG8uam9pblB1c2gudGltZW91dCksbmV3IF8obyxFLEwoe30pLG8udGltZW91dCkuc2VuZCgpLG8uc3RhdGU9ayxvLmpvaW5QdXNoLnJlc2V0KCksby5zb2NrZXQuaXNDb25uZWN0ZWQoKSYmby5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKX0pKSx0aGlzLm9uKHcsKGZ1bmN0aW9uKGUsdCl7by50cmlnZ2VyKG8ucmVwbHlFdmVudE5hbWUodCksZSl9KSl9cmV0dXJuIGgoZSxbe2tleTpcImpvaW5cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp0aGlzLnRpbWVvdXQ7aWYodGhpcy5qb2luZWRPbmNlKXRocm93IG5ldyBFcnJvcihcInRyaWVkIHRvIGpvaW4gbXVsdGlwbGUgdGltZXMuICdqb2luJyBjYW4gb25seSBiZSBjYWxsZWQgYSBzaW5nbGUgdGltZSBwZXIgY2hhbm5lbCBpbnN0YW5jZVwiKTtyZXR1cm4gdGhpcy50aW1lb3V0PWUsdGhpcy5qb2luZWRPbmNlPSEwLHRoaXMucmVqb2luKCksdGhpcy5qb2luUHVzaH19LHtrZXk6XCJvbkNsb3NlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vbihSLGUpfX0se2tleTpcIm9uRXJyb3JcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbihTLChmdW5jdGlvbih0KXtyZXR1cm4gZSh0KX0pKX19LHtrZXk6XCJvblwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5iaW5kaW5nUmVmKys7cmV0dXJuIHRoaXMuYmluZGluZ3MucHVzaCh7ZXZlbnQ6ZSxyZWY6bixjYWxsYmFjazp0fSksbn19LHtrZXk6XCJvZmZcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMuYmluZGluZ3M9dGhpcy5iaW5kaW5ncy5maWx0ZXIoKGZ1bmN0aW9uKG4pe3JldHVybiEobi5ldmVudD09PWUmJih2b2lkIDA9PT10fHx0PT09bi5yZWYpKX0pKX19LHtrZXk6XCJjYW5QdXNoXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSYmdGhpcy5pc0pvaW5lZCgpfX0se2tleTpcInB1c2hcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp0aGlzLnRpbWVvdXQ7aWYoIXRoaXMuam9pbmVkT25jZSl0aHJvdyBuZXcgRXJyb3IoXCJ0cmllZCB0byBwdXNoICdcIi5jb25jYXQoZSxcIicgdG8gJ1wiKS5jb25jYXQodGhpcy50b3BpYyxcIicgYmVmb3JlIGpvaW5pbmcuIFVzZSBjaGFubmVsLmpvaW4oKSBiZWZvcmUgcHVzaGluZyBldmVudHNcIikpO3ZhciBpPW5ldyBfKHRoaXMsZSwoZnVuY3Rpb24oKXtyZXR1cm4gdH0pLG4pO3JldHVybiB0aGlzLmNhblB1c2goKT9pLnNlbmQoKTooaS5zdGFydFRpbWVvdXQoKSx0aGlzLnB1c2hCdWZmZXIucHVzaChpKSksaX19LHtrZXk6XCJsZWF2ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp0aGlzLnRpbWVvdXQ7dGhpcy5yZWpvaW5UaW1lci5yZXNldCgpLHRoaXMuam9pblB1c2guY2FuY2VsVGltZW91dCgpLHRoaXMuc3RhdGU9Qzt2YXIgbj1mdW5jdGlvbigpe2Uuc29ja2V0Lmhhc0xvZ2dlcigpJiZlLnNvY2tldC5sb2coXCJjaGFubmVsXCIsXCJsZWF2ZSBcIi5jb25jYXQoZS50b3BpYykpLGUudHJpZ2dlcihSLFwibGVhdmVcIil9LGk9bmV3IF8odGhpcyxFLEwoe30pLHQpO3JldHVybiBpLnJlY2VpdmUoXCJva1wiLChmdW5jdGlvbigpe3JldHVybiBuKCl9KSkucmVjZWl2ZShcInRpbWVvdXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbigpfSkpLGkuc2VuZCgpLHRoaXMuY2FuUHVzaCgpfHxpLnRyaWdnZXIoXCJva1wiLHt9KSxpfX0se2tleTpcIm9uTWVzc2FnZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdH19LHtrZXk6XCJpc0xpZmVjeWNsZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHguaW5kZXhPZihlKT49MH19LHtrZXk6XCJpc01lbWJlclwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGkpe3JldHVybiB0aGlzLnRvcGljPT09ZSYmKCFpfHxpPT09dGhpcy5qb2luUmVmKCl8fCF0aGlzLmlzTGlmZWN5Y2xlRXZlbnQodCl8fCh0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSYmdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLFwiZHJvcHBpbmcgb3V0ZGF0ZWQgbWVzc2FnZVwiLHt0b3BpYzplLGV2ZW50OnQscGF5bG9hZDpuLGpvaW5SZWY6aX0pLCExKSl9fSx7a2V5Olwiam9pblJlZlwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam9pblB1c2gucmVmfX0se2tleTpcInJlam9pblwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnRoaXMudGltZW91dDt0aGlzLmlzTGVhdmluZygpfHwodGhpcy5zb2NrZXQubGVhdmVPcGVuVG9waWModGhpcy50b3BpYyksdGhpcy5zdGF0ZT1qLHRoaXMuam9pblB1c2gucmVzZW5kKGUpKX19LHtrZXk6XCJ0cmlnZ2VyXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIG89dGhpcy5vbk1lc3NhZ2UoZSx0LG4saSk7aWYodCYmIW8pdGhyb3cgbmV3IEVycm9yKFwiY2hhbm5lbCBvbk1lc3NhZ2UgY2FsbGJhY2tzIG11c3QgcmV0dXJuIHRoZSBwYXlsb2FkLCBtb2RpZmllZCBvciB1bm1vZGlmaWVkXCIpO2Zvcih2YXIgcj10aGlzLmJpbmRpbmdzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuZXZlbnQ9PT1lfSkpLHM9MDtzPHIubGVuZ3RoO3MrKyl7cltzXS5jYWxsYmFjayhvLG4saXx8dGhpcy5qb2luUmVmKCkpfX19LHtrZXk6XCJyZXBseUV2ZW50TmFtZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVyblwiY2hhbl9yZXBseV9cIi5jb25jYXQoZSl9fSx7a2V5OlwiaXNDbG9zZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlPT09Z319LHtrZXk6XCJpc0Vycm9yZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlPT09a319LHtrZXk6XCJpc0pvaW5lZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGU9PT1ifX0se2tleTpcImlzSm9pbmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGU9PT1qfX0se2tleTpcImlzTGVhdmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGU9PT1DfX1dKSxlfSgpLE09e2VuY29kZTpmdW5jdGlvbihlLHQpe3ZhciBuPVtlLmpvaW5fcmVmLGUucmVmLGUudG9waWMsZS5ldmVudCxlLnBheWxvYWRdO3JldHVybiB0KEpTT04uc3RyaW5naWZ5KG4pKX0sZGVjb2RlOmZ1bmN0aW9uKGUsdCl7dmFyIG49cihKU09OLnBhcnNlKGUpLDUpO3JldHVybiB0KHtqb2luX3JlZjpuWzBdLHJlZjpuWzFdLHRvcGljOm5bMl0sZXZlbnQ6blszXSxwYXlsb2FkOm5bNF19KX19LEo9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3ZhciBuPXRoaXMsaT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307Yyh0aGlzLGUpLHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3M9e29wZW46W10sY2xvc2U6W10sZXJyb3I6W10sbWVzc2FnZTpbXX0sdGhpcy5jaGFubmVscz1bXSx0aGlzLnNlbmRCdWZmZXI9W10sdGhpcy5yZWY9MCx0aGlzLnRpbWVvdXQ9aS50aW1lb3V0fHwxZTQsdGhpcy50cmFuc3BvcnQ9aS50cmFuc3BvcnR8fGQuV2ViU29ja2V0fHxILHRoaXMuZGVmYXVsdEVuY29kZXI9TS5lbmNvZGUsdGhpcy5kZWZhdWx0RGVjb2Rlcj1NLmRlY29kZSx0aGlzLmNsb3NlV2FzQ2xlYW49ITEsdGhpcy51bmxvYWRlZD0hMSx0aGlzLmJpbmFyeVR5cGU9aS5iaW5hcnlUeXBlfHxcImFycmF5YnVmZmVyXCIsdGhpcy50cmFuc3BvcnQhPT1IPyh0aGlzLmVuY29kZT1pLmVuY29kZXx8dGhpcy5kZWZhdWx0RW5jb2Rlcix0aGlzLmRlY29kZT1pLmRlY29kZXx8dGhpcy5kZWZhdWx0RGVjb2Rlcik6KHRoaXMuZW5jb2RlPXRoaXMuZGVmYXVsdEVuY29kZXIsdGhpcy5kZWNvZGU9dGhpcy5kZWZhdWx0RGVjb2RlciksZiYmZi5hZGRFdmVudExpc3RlbmVyJiZmLmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmxvYWRcIiwoZnVuY3Rpb24oZSl7bi5jb25uJiYobi51bmxvYWRlZD0hMCxuLmFibm9ybWFsQ2xvc2UoXCJ1bmxvYWRlZFwiKSl9KSksdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zPWkuaGVhcnRiZWF0SW50ZXJ2YWxNc3x8M2U0LHRoaXMucmVqb2luQWZ0ZXJNcz1mdW5jdGlvbihlKXtyZXR1cm4gaS5yZWpvaW5BZnRlck1zP2kucmVqb2luQWZ0ZXJNcyhlKTpbMWUzLDJlMyw1ZTNdW2UtMV18fDFlNH0sdGhpcy5yZWNvbm5lY3RBZnRlck1zPWZ1bmN0aW9uKGUpe3JldHVybiBuLnVubG9hZGVkPzEwMDppLnJlY29ubmVjdEFmdGVyTXM/aS5yZWNvbm5lY3RBZnRlck1zKGUpOlsxMCw1MCwxMDAsMTUwLDIwMCwyNTAsNTAwLDFlMywyZTNdW2UtMV18fDVlM30sdGhpcy5sb2dnZXI9aS5sb2dnZXJ8fG51bGwsdGhpcy5sb25ncG9sbGVyVGltZW91dD1pLmxvbmdwb2xsZXJUaW1lb3V0fHwyZTQsdGhpcy5wYXJhbXM9TChpLnBhcmFtc3x8e30pLHRoaXMuZW5kUG9pbnQ9XCJcIi5jb25jYXQodCxcIi9cIikuY29uY2F0KFApLHRoaXMudnNuPWkudnNufHxcIjIuMC4wXCIsdGhpcy5oZWFydGJlYXRUaW1lcj1udWxsLHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZj1udWxsLHRoaXMucmVjb25uZWN0VGltZXI9bmV3IEkoKGZ1bmN0aW9uKCl7bi50ZWFyZG93bigoZnVuY3Rpb24oKXtyZXR1cm4gbi5jb25uZWN0KCl9KSl9KSx0aGlzLnJlY29ubmVjdEFmdGVyTXMpfXJldHVybiBoKGUsW3trZXk6XCJwcm90b2NvbFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGxvY2F0aW9uLnByb3RvY29sLm1hdGNoKC9eaHR0cHMvKT9cIndzc1wiOlwid3NcIn19LHtrZXk6XCJlbmRQb2ludFVSTFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9RC5hcHBlbmRQYXJhbXMoRC5hcHBlbmRQYXJhbXModGhpcy5lbmRQb2ludCx0aGlzLnBhcmFtcygpKSx7dnNuOnRoaXMudnNufSk7cmV0dXJuXCIvXCIhPT1lLmNoYXJBdCgwKT9lOlwiL1wiPT09ZS5jaGFyQXQoMSk/XCJcIi5jb25jYXQodGhpcy5wcm90b2NvbCgpLFwiOlwiKS5jb25jYXQoZSk6XCJcIi5jb25jYXQodGhpcy5wcm90b2NvbCgpLFwiOi8vXCIpLmNvbmNhdChsb2NhdGlvbi5ob3N0KS5jb25jYXQoZSl9fSx7a2V5OlwiZGlzY29ubmVjdFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLmNsb3NlV2FzQ2xlYW49ITAsdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpLHRoaXMudGVhcmRvd24oZSx0LG4pfX0se2tleTpcImNvbm5lY3RcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2UmJihjb25zb2xlJiZjb25zb2xlLmxvZyhcInBhc3NpbmcgcGFyYW1zIHRvIGNvbm5lY3QgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBwYXNzIDpwYXJhbXMgdG8gdGhlIFNvY2tldCBjb25zdHJ1Y3RvclwiKSx0aGlzLnBhcmFtcz1MKGUpKSx0aGlzLmNvbm58fCh0aGlzLmNsb3NlV2FzQ2xlYW49ITEsdGhpcy5jb25uPW5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZFBvaW50VVJMKCkpLHRoaXMuY29ubi5iaW5hcnlUeXBlPXRoaXMuYmluYXJ5VHlwZSx0aGlzLmNvbm4udGltZW91dD10aGlzLmxvbmdwb2xsZXJUaW1lb3V0LHRoaXMuY29ubi5vbm9wZW49ZnVuY3Rpb24oKXtyZXR1cm4gdC5vbkNvbm5PcGVuKCl9LHRoaXMuY29ubi5vbmVycm9yPWZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uQ29ubkVycm9yKGUpfSx0aGlzLmNvbm4ub25tZXNzYWdlPWZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uQ29ubk1lc3NhZ2UoZSl9LHRoaXMuY29ubi5vbmNsb3NlPWZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uQ29ubkNsb3NlKGUpfSl9fSx7a2V5OlwibG9nXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3RoaXMubG9nZ2VyKGUsdCxuKX19LHtrZXk6XCJoYXNMb2dnZXJcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5sb2dnZXJ9fSx7a2V5Olwib25PcGVuXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5tYWtlUmVmKCk7cmV0dXJuIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5wdXNoKFt0LGVdKSx0fX0se2tleTpcIm9uQ2xvc2VcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLm1ha2VSZWYoKTtyZXR1cm4gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5wdXNoKFt0LGVdKSx0fX0se2tleTpcIm9uRXJyb3JcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLm1ha2VSZWYoKTtyZXR1cm4gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5lcnJvci5wdXNoKFt0LGVdKSx0fX0se2tleTpcIm9uTWVzc2FnZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubWFrZVJlZigpO3JldHVybiB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UucHVzaChbdCxlXSksdH19LHtrZXk6XCJvbkNvbm5PcGVuXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmhhc0xvZ2dlcigpJiZ0aGlzLmxvZyhcInRyYW5zcG9ydFwiLFwiY29ubmVjdGVkIHRvIFwiLmNvbmNhdCh0aGlzLmVuZFBvaW50VVJMKCkpKSx0aGlzLnVubG9hZGVkPSExLHRoaXMuY2xvc2VXYXNDbGVhbj0hMSx0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpLHRoaXMucmVjb25uZWN0VGltZXIucmVzZXQoKSx0aGlzLnJlc2V0SGVhcnRiZWF0KCksdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5vcGVuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybigwLHIoZSwyKVsxXSkoKX0pKX19LHtrZXk6XCJyZXNldEhlYXJ0YmVhdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmNvbm4mJnRoaXMuY29ubi5za2lwSGVhcnRiZWF0fHwodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmPW51bGwsY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0YmVhdFRpbWVyKSx0aGlzLmhlYXJ0YmVhdFRpbWVyPXNldEludGVydmFsKChmdW5jdGlvbigpe3JldHVybiBlLnNlbmRIZWFydGJlYXQoKX0pLHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcykpfX0se2tleTpcInRlYXJkb3duXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXM7aWYoIXRoaXMuY29ubilyZXR1cm4gZSYmZSgpO3RoaXMud2FpdEZvckJ1ZmZlckRvbmUoKGZ1bmN0aW9uKCl7aS5jb25uJiYodD9pLmNvbm4uY2xvc2UodCxufHxcIlwiKTppLmNvbm4uY2xvc2UoKSksaS53YWl0Rm9yU29ja2V0Q2xvc2VkKChmdW5jdGlvbigpe2kuY29ubiYmKGkuY29ubi5vbmNsb3NlPWZ1bmN0aW9uKCl7fSxpLmNvbm49bnVsbCksZSYmZSgpfSkpfSkpfX0se2tleTpcIndhaXRGb3JCdWZmZXJEb25lXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToxOzUhPT1uJiZ0aGlzLmNvbm4mJnRoaXMuY29ubi5idWZmZXJlZEFtb3VudD9zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Qud2FpdEZvckJ1ZmZlckRvbmUoZSxuKzEpfSksMTUwKm4pOmUoKX19LHtrZXk6XCJ3YWl0Rm9yU29ja2V0Q2xvc2VkXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToxOzUhPT1uJiZ0aGlzLmNvbm4mJnRoaXMuY29ubi5yZWFkeVN0YXRlIT09bT9zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Qud2FpdEZvclNvY2tldENsb3NlZChlLG4rMSl9KSwxNTAqbik6ZSgpfX0se2tleTpcIm9uQ29ubkNsb3NlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5oYXNMb2dnZXIoKSYmdGhpcy5sb2coXCJ0cmFuc3BvcnRcIixcImNsb3NlXCIsZSksdGhpcy50cmlnZ2VyQ2hhbkVycm9yKCksY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0YmVhdFRpbWVyKSx0aGlzLmNsb3NlV2FzQ2xlYW58fHRoaXMucmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCksdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4oMCxyKHQsMilbMV0pKGUpfSkpfX0se2tleTpcIm9uQ29ubkVycm9yXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5oYXNMb2dnZXIoKSYmdGhpcy5sb2coXCJ0cmFuc3BvcnRcIixlKSx0aGlzLnRyaWdnZXJDaGFuRXJyb3IoKSx0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLmVycm9yLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybigwLHIodCwyKVsxXSkoZSl9KSl9fSx7a2V5OlwidHJpZ2dlckNoYW5FcnJvclwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jaGFubmVscy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmlzRXJyb3JlZCgpfHxlLmlzTGVhdmluZygpfHxlLmlzQ2xvc2VkKCl8fGUudHJpZ2dlcihTKX0pKX19LHtrZXk6XCJjb25uZWN0aW9uU3RhdGVcIix2YWx1ZTpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLmNvbm4mJnRoaXMuY29ubi5yZWFkeVN0YXRlKXtjYXNlIHA6cmV0dXJuXCJjb25uZWN0aW5nXCI7Y2FzZSB2OnJldHVyblwib3BlblwiO2Nhc2UgeTpyZXR1cm5cImNsb3NpbmdcIjtkZWZhdWx0OnJldHVyblwiY2xvc2VkXCJ9fX0se2tleTpcImlzQ29ubmVjdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cIm9wZW5cIj09PXRoaXMuY29ubmVjdGlvblN0YXRlKCl9fSx7a2V5OlwicmVtb3ZlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vZmYoZS5zdGF0ZUNoYW5nZVJlZnMpLHRoaXMuY2hhbm5lbHM9dGhpcy5jaGFubmVscy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmpvaW5SZWYoKSE9PWUuam9pblJlZigpfSkpfX0se2tleTpcIm9mZlwiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzKXRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3NbdF09dGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1t0XS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciBuPXIodCwxKVswXTtyZXR1cm4tMT09PWUuaW5kZXhPZihuKX0pKX19LHtrZXk6XCJjaGFubmVsXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49bmV3IEEoZSx0LHRoaXMpO3JldHVybiB0aGlzLmNoYW5uZWxzLnB1c2gobiksbn19LHtrZXk6XCJwdXNoXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZih0aGlzLmhhc0xvZ2dlcigpKXt2YXIgbj1lLnRvcGljLGk9ZS5ldmVudCxvPWUucGF5bG9hZCxyPWUucmVmLHM9ZS5qb2luX3JlZjt0aGlzLmxvZyhcInB1c2hcIixcIlwiLmNvbmNhdChuLFwiIFwiKS5jb25jYXQoaSxcIiAoXCIpLmNvbmNhdChzLFwiLCBcIikuY29uY2F0KHIsXCIpXCIpLG8pfXRoaXMuaXNDb25uZWN0ZWQoKT90aGlzLmVuY29kZShlLChmdW5jdGlvbihlKXtyZXR1cm4gdC5jb25uLnNlbmQoZSl9KSk6dGhpcy5zZW5kQnVmZmVyLnB1c2goKGZ1bmN0aW9uKCl7cmV0dXJuIHQuZW5jb2RlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0LmNvbm4uc2VuZChlKX0pKX0pKX19LHtrZXk6XCJtYWtlUmVmXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlZisxO3JldHVybiBlPT09dGhpcy5yZWY/dGhpcy5yZWY9MDp0aGlzLnJlZj1lLHRoaXMucmVmLnRvU3RyaW5nKCl9fSx7a2V5Olwic2VuZEhlYXJ0YmVhdFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0Nvbm5lY3RlZCgpKXtpZih0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpcmV0dXJuIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZj1udWxsLHRoaXMuaGFzTG9nZ2VyKCkmJnRoaXMubG9nKFwidHJhbnNwb3J0XCIsXCJoZWFydGJlYXQgdGltZW91dC4gQXR0ZW1wdGluZyB0byByZS1lc3RhYmxpc2ggY29ubmVjdGlvblwiKSx2b2lkIHRoaXMuYWJub3JtYWxDbG9zZShcImhlYXJ0YmVhdCB0aW1lb3V0XCIpO3RoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZj10aGlzLm1ha2VSZWYoKSx0aGlzLnB1c2goe3RvcGljOlwicGhvZW5peFwiLGV2ZW50OlwiaGVhcnRiZWF0XCIscGF5bG9hZDp7fSxyZWY6dGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmfSl9fX0se2tleTpcImFibm9ybWFsQ2xvc2VcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmNsb3NlV2FzQ2xlYW49ITEsdGhpcy5jb25uLmNsb3NlKDFlMyxlKX19LHtrZXk6XCJmbHVzaFNlbmRCdWZmZXJcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuaXNDb25uZWN0ZWQoKSYmdGhpcy5zZW5kQnVmZmVyLmxlbmd0aD4wJiYodGhpcy5zZW5kQnVmZmVyLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiBlKCl9KSksdGhpcy5zZW5kQnVmZmVyPVtdKX19LHtrZXk6XCJvbkNvbm5NZXNzYWdlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLmRlY29kZShlLmRhdGEsKGZ1bmN0aW9uKGUpe3ZhciBuPWUudG9waWMsaT1lLmV2ZW50LG89ZS5wYXlsb2FkLHM9ZS5yZWYsYT1lLmpvaW5fcmVmO3MmJnM9PT10LnBlbmRpbmdIZWFydGJlYXRSZWYmJih0LnBlbmRpbmdIZWFydGJlYXRSZWY9bnVsbCksdC5oYXNMb2dnZXIoKSYmdC5sb2coXCJyZWNlaXZlXCIsXCJcIi5jb25jYXQoby5zdGF0dXN8fFwiXCIsXCIgXCIpLmNvbmNhdChuLFwiIFwiKS5jb25jYXQoaSxcIiBcIikuY29uY2F0KHMmJlwiKFwiK3MrXCIpXCJ8fFwiXCIpLG8pO2Zvcih2YXIgYz0wO2M8dC5jaGFubmVscy5sZW5ndGg7YysrKXt2YXIgdT10LmNoYW5uZWxzW2NdO3UuaXNNZW1iZXIobixpLG8sYSkmJnUudHJpZ2dlcihpLG8scyxhKX1mb3IodmFyIGg9MDtoPHQuc3RhdGVDaGFuZ2VDYWxsYmFja3MubWVzc2FnZS5sZW5ndGg7aCsrKXsoMCxyKHQuc3RhdGVDaGFuZ2VDYWxsYmFja3MubWVzc2FnZVtoXSwyKVsxXSkoZSl9fSkpfX0se2tleTpcImxlYXZlT3BlblRvcGljXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jaGFubmVscy5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gdC50b3BpYz09PWUmJih0LmlzSm9pbmVkKCl8fHQuaXNKb2luaW5nKCkpfSkpO3QmJih0aGlzLmhhc0xvZ2dlcigpJiZ0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCdsZWF2aW5nIGR1cGxpY2F0ZSB0b3BpYyBcIicuY29uY2F0KGUsJ1wiJykpLHQubGVhdmUoKSl9fV0pLGV9KCksSD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7Yyh0aGlzLGUpLHRoaXMuZW5kUG9pbnQ9bnVsbCx0aGlzLnRva2VuPW51bGwsdGhpcy5za2lwSGVhcnRiZWF0PSEwLHRoaXMub25vcGVuPWZ1bmN0aW9uKCl7fSx0aGlzLm9uZXJyb3I9ZnVuY3Rpb24oKXt9LHRoaXMub25tZXNzYWdlPWZ1bmN0aW9uKCl7fSx0aGlzLm9uY2xvc2U9ZnVuY3Rpb24oKXt9LHRoaXMucG9sbEVuZHBvaW50PXRoaXMubm9ybWFsaXplRW5kcG9pbnQodCksdGhpcy5yZWFkeVN0YXRlPXAsdGhpcy5wb2xsKCl9cmV0dXJuIGgoZSxbe2tleTpcIm5vcm1hbGl6ZUVuZHBvaW50XCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShcIndzOi8vXCIsXCJodHRwOi8vXCIpLnJlcGxhY2UoXCJ3c3M6Ly9cIixcImh0dHBzOi8vXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIiguKikvXCIrUCksXCIkMS9cIitPKX19LHtrZXk6XCJlbmRwb2ludFVSTFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIEQuYXBwZW5kUGFyYW1zKHRoaXMucG9sbEVuZHBvaW50LHt0b2tlbjp0aGlzLnRva2VufSl9fSx7a2V5OlwiY2xvc2VBbmRSZXRyeVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZSgpLHRoaXMucmVhZHlTdGF0ZT1wfX0se2tleTpcIm9udGltZW91dFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5vbmVycm9yKFwidGltZW91dFwiKSx0aGlzLmNsb3NlQW5kUmV0cnkoKX19LHtrZXk6XCJwb2xsXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMucmVhZHlTdGF0ZSE9PXYmJnRoaXMucmVhZHlTdGF0ZSE9PXB8fEQucmVxdWVzdChcIkdFVFwiLHRoaXMuZW5kcG9pbnRVUkwoKSxcImFwcGxpY2F0aW9uL2pzb25cIixudWxsLHRoaXMudGltZW91dCx0aGlzLm9udGltZW91dC5iaW5kKHRoaXMpLChmdW5jdGlvbih0KXtpZih0KXt2YXIgbj10LnN0YXR1cyxpPXQudG9rZW4sbz10Lm1lc3NhZ2VzO2UudG9rZW49aX1lbHNlIG49MDtzd2l0Y2gobil7Y2FzZSAyMDA6by5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5vbm1lc3NhZ2Uoe2RhdGE6dH0pfSkpLGUucG9sbCgpO2JyZWFrO2Nhc2UgMjA0OmUucG9sbCgpO2JyZWFrO2Nhc2UgNDEwOmUucmVhZHlTdGF0ZT12LGUub25vcGVuKCksZS5wb2xsKCk7YnJlYWs7Y2FzZSA0MDM6ZS5vbmVycm9yKCksZS5jbG9zZSgpO2JyZWFrO2Nhc2UgMDpjYXNlIDUwMDplLm9uZXJyb3IoKSxlLmNsb3NlQW5kUmV0cnkoKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcInVuaGFuZGxlZCBwb2xsIHN0YXR1cyBcIi5jb25jYXQobikpfX0pKX19LHtrZXk6XCJzZW5kXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztELnJlcXVlc3QoXCJQT1NUXCIsdGhpcy5lbmRwb2ludFVSTCgpLFwiYXBwbGljYXRpb24vanNvblwiLGUsdGhpcy50aW1lb3V0LHRoaXMub25lcnJvci5iaW5kKHRoaXMsXCJ0aW1lb3V0XCIpLChmdW5jdGlvbihlKXtlJiYyMDA9PT1lLnN0YXR1c3x8KHQub25lcnJvcihlJiZlLnN0YXR1cyksdC5jbG9zZUFuZFJldHJ5KCkpfSkpfX0se2tleTpcImNsb3NlXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt0aGlzLnJlYWR5U3RhdGU9bSx0aGlzLm9uY2xvc2UoKX19XSksZX0oKSxEPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe2ModGhpcyxlKX1yZXR1cm4gaChlLG51bGwsW3trZXk6XCJyZXF1ZXN0XCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSxvLHIscyl7aWYoZC5YRG9tYWluUmVxdWVzdCl7dmFyIGE9bmV3IFhEb21haW5SZXF1ZXN0O3RoaXMueGRvbWFpblJlcXVlc3QoYSxlLHQsaSxvLHIscyl9ZWxzZXt2YXIgYz1uZXcgZC5YTUxIdHRwUmVxdWVzdDt0aGlzLnhoclJlcXVlc3QoYyxlLHQsbixpLG8scixzKX19fSx7a2V5OlwieGRvbWFpblJlcXVlc3RcIix2YWx1ZTpmdW5jdGlvbihlLHQsbixpLG8scixzKXt2YXIgYT10aGlzO2UudGltZW91dD1vLGUub3Blbih0LG4pLGUub25sb2FkPWZ1bmN0aW9uKCl7dmFyIHQ9YS5wYXJzZUpTT04oZS5yZXNwb25zZVRleHQpO3MmJnModCl9LHImJihlLm9udGltZW91dD1yKSxlLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24oKXt9LGUuc2VuZChpKX19LHtrZXk6XCJ4aHJSZXF1ZXN0XCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSxvLHIscyxhKXt2YXIgYz10aGlzO2Uub3Blbih0LG4sITApLGUudGltZW91dD1yLGUuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLGkpLGUub25lcnJvcj1mdW5jdGlvbigpe2EmJmEobnVsbCl9LGUub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoZS5yZWFkeVN0YXRlPT09Yy5zdGF0ZXMuY29tcGxldGUmJmEpe3ZhciB0PWMucGFyc2VKU09OKGUucmVzcG9uc2VUZXh0KTthKHQpfX0scyYmKGUub250aW1lb3V0PXMpLGUuc2VuZChvKX19LHtrZXk6XCJwYXJzZUpTT05cIix2YWx1ZTpmdW5jdGlvbihlKXtpZighZXx8XCJcIj09PWUpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKHQpe3JldHVybiBjb25zb2xlJiZjb25zb2xlLmxvZyhcImZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlXCIsZSksbnVsbH19fSx7a2V5Olwic2VyaWFsaXplXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXTtmb3IodmFyIGkgaW4gZSlpZihlLmhhc093blByb3BlcnR5KGkpKXt2YXIgcj10P1wiXCIuY29uY2F0KHQsXCJbXCIpLmNvbmNhdChpLFwiXVwiKTppLHM9ZVtpXTtcIm9iamVjdFwiPT09byhzKT9uLnB1c2godGhpcy5zZXJpYWxpemUocyxyKSk6bi5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChyKStcIj1cIitlbmNvZGVVUklDb21wb25lbnQocykpfXJldHVybiBuLmpvaW4oXCImXCIpfX0se2tleTpcImFwcGVuZFBhcmFtc1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7aWYoMD09PU9iamVjdC5rZXlzKHQpLmxlbmd0aClyZXR1cm4gZTt2YXIgbj1lLm1hdGNoKC9cXD8vKT9cIiZcIjpcIj9cIjtyZXR1cm5cIlwiLmNvbmNhdChlKS5jb25jYXQobikuY29uY2F0KHRoaXMuc2VyaWFsaXplKHQpKX19XSksZX0oKTtELnN0YXRlcz17Y29tcGxldGU6NH07dmFyIEI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3ZhciBuPXRoaXMsaT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307Yyh0aGlzLGUpO3ZhciBvPWkuZXZlbnRzfHx7c3RhdGU6XCJwcmVzZW5jZV9zdGF0ZVwiLGRpZmY6XCJwcmVzZW5jZV9kaWZmXCJ9O3RoaXMuc3RhdGU9e30sdGhpcy5wZW5kaW5nRGlmZnM9W10sdGhpcy5jaGFubmVsPXQsdGhpcy5qb2luUmVmPW51bGwsdGhpcy5jYWxsZXI9e29uSm9pbjpmdW5jdGlvbigpe30sb25MZWF2ZTpmdW5jdGlvbigpe30sb25TeW5jOmZ1bmN0aW9uKCl7fX0sdGhpcy5jaGFubmVsLm9uKG8uc3RhdGUsKGZ1bmN0aW9uKHQpe3ZhciBpPW4uY2FsbGVyLG89aS5vbkpvaW4scj1pLm9uTGVhdmUscz1pLm9uU3luYztuLmpvaW5SZWY9bi5jaGFubmVsLmpvaW5SZWYoKSxuLnN0YXRlPWUuc3luY1N0YXRlKG4uc3RhdGUsdCxvLHIpLG4ucGVuZGluZ0RpZmZzLmZvckVhY2goKGZ1bmN0aW9uKHQpe24uc3RhdGU9ZS5zeW5jRGlmZihuLnN0YXRlLHQsbyxyKX0pKSxuLnBlbmRpbmdEaWZmcz1bXSxzKCl9KSksdGhpcy5jaGFubmVsLm9uKG8uZGlmZiwoZnVuY3Rpb24odCl7dmFyIGk9bi5jYWxsZXIsbz1pLm9uSm9pbixyPWkub25MZWF2ZSxzPWkub25TeW5jO24uaW5QZW5kaW5nU3luY1N0YXRlKCk/bi5wZW5kaW5nRGlmZnMucHVzaCh0KToobi5zdGF0ZT1lLnN5bmNEaWZmKG4uc3RhdGUsdCxvLHIpLHMoKSl9KSl9cmV0dXJuIGgoZSxbe2tleTpcIm9uSm9pblwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuY2FsbGVyLm9uSm9pbj1lfX0se2tleTpcIm9uTGVhdmVcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmNhbGxlci5vbkxlYXZlPWV9fSx7a2V5Olwib25TeW5jXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5jYWxsZXIub25TeW5jPWV9fSx7a2V5OlwibGlzdFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBlLmxpc3QodGhpcy5zdGF0ZSx0KX19LHtrZXk6XCJpblBlbmRpbmdTeW5jU3RhdGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLmpvaW5SZWZ8fHRoaXMuam9pblJlZiE9PXRoaXMuY2hhbm5lbC5qb2luUmVmKCl9fV0sW3trZXk6XCJzeW5jU3RhdGVcIix2YWx1ZTpmdW5jdGlvbihlLHQsbixpKXt2YXIgbz10aGlzLHI9dGhpcy5jbG9uZShlKSxzPXt9LGE9e307cmV0dXJuIHRoaXMubWFwKHIsKGZ1bmN0aW9uKGUsbil7dFtlXXx8KGFbZV09bil9KSksdGhpcy5tYXAodCwoZnVuY3Rpb24oZSx0KXt2YXIgbj1yW2VdO2lmKG4pe3ZhciBpPXQubWV0YXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5waHhfcmVmfSkpLGM9bi5tZXRhcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBoeF9yZWZ9KSksdT10Lm1ldGFzLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGMuaW5kZXhPZihlLnBoeF9yZWYpPDB9KSksaD1uLm1ldGFzLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGkuaW5kZXhPZihlLnBoeF9yZWYpPDB9KSk7dS5sZW5ndGg+MCYmKHNbZV09dCxzW2VdLm1ldGFzPXUpLGgubGVuZ3RoPjAmJihhW2VdPW8uY2xvbmUobiksYVtlXS5tZXRhcz1oKX1lbHNlIHNbZV09dH0pKSx0aGlzLnN5bmNEaWZmKHIse2pvaW5zOnMsbGVhdmVzOmF9LG4saSl9fSx7a2V5Olwic3luY0RpZmZcIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXt2YXIgcj10LmpvaW5zLHM9dC5sZWF2ZXMsYT10aGlzLmNsb25lKGUpO3JldHVybiBufHwobj1mdW5jdGlvbigpe30pLG98fChvPWZ1bmN0aW9uKCl7fSksdGhpcy5tYXAociwoZnVuY3Rpb24oZSx0KXt2YXIgbz1hW2VdO2lmKGFbZV09dCxvKXt2YXIgcixzPWFbZV0ubWV0YXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5waHhfcmVmfSkpLGM9by5tZXRhcy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBzLmluZGV4T2YoZS5waHhfcmVmKTwwfSkpOyhyPWFbZV0ubWV0YXMpLnVuc2hpZnQuYXBwbHkocixpKGMpKX1uKGUsbyx0KX0pKSx0aGlzLm1hcChzLChmdW5jdGlvbihlLHQpe3ZhciBuPWFbZV07aWYobil7dmFyIGk9dC5tZXRhcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBoeF9yZWZ9KSk7bi5tZXRhcz1uLm1ldGFzLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGkuaW5kZXhPZihlLnBoeF9yZWYpPDB9KSksbyhlLG4sdCksMD09PW4ubWV0YXMubGVuZ3RoJiZkZWxldGUgYVtlXX19KSksYX19LHtrZXk6XCJsaXN0XCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdH0pLHRoaXMubWFwKGUsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQoZSxuKX0pKX19LHtrZXk6XCJtYXBcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZVtuXSl9KSl9fSx7a2V5OlwiY2xvbmVcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSl9fV0pLGV9KCksST1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXtjKHRoaXMsZSksdGhpcy5jYWxsYmFjaz10LHRoaXMudGltZXJDYWxjPW4sdGhpcy50aW1lcj1udWxsLHRoaXMudHJpZXM9MH1yZXR1cm4gaChlLFt7a2V5OlwicmVzZXRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMudHJpZXM9MCxjbGVhclRpbWVvdXQodGhpcy50aW1lcil9fSx7a2V5Olwic2NoZWR1bGVUaW1lb3V0XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2NsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS50cmllcz1lLnRyaWVzKzEsZS5jYWxsYmFjaygpfSksdGhpcy50aW1lckNhbGModGhpcy50cmllcysxKSl9fV0pLGV9KCl9XSl9KSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../deps/phoenix/priv/static/phoenix.js\n");
/***/ }),
/***/ "../deps/phoenix_live_view/priv/static/phoenix_live_view.js":
/*!******************************************************************!*\
!*** ../deps/phoenix_live_view/priv/static/phoenix_live_view.js ***!
\******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("!function (e, t) {\n true ? module.exports = t() : undefined;\n}(this, function () {\n return function (e) {\n var t = {};\n\n function n(i) {\n if (t[i]) return t[i].exports;\n var r = t[i] = {\n i: i,\n l: !1,\n exports: {}\n };\n return e[i].call(r.exports, r, r.exports, n), r.l = !0, r.exports;\n }\n\n return n.m = e, n.c = t, n.d = function (e, t, i) {\n n.o(e, t) || Object.defineProperty(e, t, {\n configurable: !1,\n enumerable: !0,\n get: i\n });\n }, n.r = function (e) {\n Object.defineProperty(e, \"__esModule\", {\n value: !0\n });\n }, n.n = function (e) {\n var t = e && e.__esModule ? function () {\n return e.default;\n } : function () {\n return e;\n };\n return n.d(t, \"a\", t), t;\n }, n.o = function (e, t) {\n return Object.prototype.hasOwnProperty.call(e, t);\n }, n.p = \"\", n(n.s = 2);\n }([function (e, t, n) {\n \"use strict\";\n\n n.r(t);\n var i,\n r = 11;\n var o = \"http://www.w3.org/1999/xhtml\",\n a = \"undefined\" == typeof document ? void 0 : document,\n u = !!a && \"content\" in a.createElement(\"template\"),\n c = !!a && a.createRange && \"createContextualFragment\" in a.createRange();\n\n function s(e) {\n return e = e.trim(), u ? function (e) {\n var t = a.createElement(\"template\");\n return t.innerHTML = e, t.content.childNodes[0];\n }(e) : c ? function (e) {\n return i || (i = a.createRange()).selectNode(a.body), i.createContextualFragment(e).childNodes[0];\n }(e) : function (e) {\n var t = a.createElement(\"body\");\n return t.innerHTML = e, t.childNodes[0];\n }(e);\n }\n\n function l(e, t) {\n var n,\n i,\n r = e.nodeName,\n o = t.nodeName;\n return r === o || (n = r.charCodeAt(0), i = o.charCodeAt(0), n <= 90 && i >= 97 ? r === o.toUpperCase() : i <= 90 && n >= 97 && o === r.toUpperCase());\n }\n\n function d(e, t, n) {\n e[n] !== t[n] && (e[n] = t[n], e[n] ? e.setAttribute(n, \"\") : e.removeAttribute(n));\n }\n\n var h = {\n OPTION: function (e, t) {\n var n = e.parentNode;\n\n if (n) {\n var i = n.nodeName.toUpperCase();\n \"OPTGROUP\" === i && (i = (n = n.parentNode) && n.nodeName.toUpperCase()), \"SELECT\" !== i || n.hasAttribute(\"multiple\") || (e.hasAttribute(\"selected\") && !t.selected && (e.setAttribute(\"selected\", \"selected\"), e.removeAttribute(\"selected\")), n.selectedIndex = -1);\n }\n\n d(e, t, \"selected\");\n },\n INPUT: function (e, t) {\n d(e, t, \"checked\"), d(e, t, \"disabled\"), e.value !== t.value && (e.value = t.value), t.hasAttribute(\"value\") || e.removeAttribute(\"value\");\n },\n TEXTAREA: function (e, t) {\n var n = t.value;\n e.value !== n && (e.value = n);\n var i = e.firstChild;\n\n if (i) {\n var r = i.nodeValue;\n if (r == n || !n && r == e.placeholder) return;\n i.nodeValue = n;\n }\n },\n SELECT: function (e, t) {\n if (!t.hasAttribute(\"multiple\")) {\n for (var n, i, r = -1, o = 0, a = e.firstChild; a;) if (\"OPTGROUP\" === (i = a.nodeName && a.nodeName.toUpperCase())) a = (n = a).firstChild;else {\n if (\"OPTION\" === i) {\n if (a.hasAttribute(\"selected\")) {\n r = o;\n break;\n }\n\n o++;\n }\n\n !(a = a.nextSibling) && n && (a = n.nextSibling, n = null);\n }\n\n e.selectedIndex = r;\n }\n }\n },\n f = 1,\n v = 11,\n p = 3,\n g = 8;\n\n function m() {}\n\n function y(e) {\n if (e) return e.getAttribute && e.getAttribute(\"id\") || e.id;\n }\n\n var b = function (e) {\n return function (t, n, i) {\n if (i || (i = {}), \"string\" == typeof n) if (\"#document\" === t.nodeName || \"HTML\" === t.nodeName || \"BODY\" === t.nodeName) {\n var r = n;\n (n = a.createElement(\"html\")).innerHTML = r;\n } else n = s(n);\n var u = i.getNodeKey || y,\n c = i.onBeforeNodeAdded || m,\n d = i.onNodeAdded || m,\n b = i.onBeforeElUpdated || m,\n k = i.onElUpdated || m,\n w = i.onBeforeNodeDiscarded || m,\n x = i.onNodeDiscarded || m,\n A = i.onBeforeElChildrenUpdated || m,\n C = !0 === i.childrenOnly,\n E = Object.create(null),\n S = [];\n\n function P(e) {\n S.push(e);\n }\n\n function L(e, t, n) {\n !1 !== w(e) && (t && t.removeChild(e), x(e), function e(t, n) {\n if (t.nodeType === f) for (var i = t.firstChild; i;) {\n var r = void 0;\n n && (r = u(i)) ? P(r) : (x(i), i.firstChild && e(i, n)), i = i.nextSibling;\n }\n }(e, n));\n }\n\n function T(e) {\n d(e);\n\n for (var t = e.firstChild; t;) {\n var n = t.nextSibling,\n i = u(t);\n\n if (i) {\n var r = E[i];\n r && l(t, r) ? (t.parentNode.replaceChild(r, t), I(r, t)) : T(t);\n } else T(t);\n\n t = n;\n }\n }\n\n function I(t, n, i) {\n var r = u(n);\n\n if (r && delete E[r], !i) {\n if (!1 === b(t, n)) return;\n if (e(t, n), k(t), !1 === A(t, n)) return;\n }\n\n \"TEXTAREA\" !== t.nodeName ? function (e, t) {\n var n,\n i,\n r,\n o,\n s,\n d = t.firstChild,\n v = e.firstChild;\n\n e: for (; d;) {\n for (o = d.nextSibling, n = u(d); v;) {\n if (r = v.nextSibling, d.isSameNode && d.isSameNode(v)) {\n d = o, v = r;\n continue e;\n }\n\n i = u(v);\n var m = v.nodeType,\n y = void 0;\n\n if (m === d.nodeType && (m === f ? (n ? n !== i && ((s = E[n]) ? r === s ? y = !1 : (e.insertBefore(s, v), i ? P(i) : L(v, e, !0), v = s) : y = !1) : i && (y = !1), (y = !1 !== y && l(v, d)) && I(v, d)) : m !== p && m != g || (y = !0, v.nodeValue !== d.nodeValue && (v.nodeValue = d.nodeValue))), y) {\n d = o, v = r;\n continue e;\n }\n\n i ? P(i) : L(v, e, !0), v = r;\n }\n\n if (n && (s = E[n]) && l(s, d)) e.appendChild(s), I(s, d);else {\n var b = c(d);\n !1 !== b && (b && (d = b), d.actualize && (d = d.actualize(e.ownerDocument || a)), e.appendChild(d), T(d));\n }\n d = o, v = r;\n }\n\n !function (e, t, n) {\n for (; t;) {\n var i = t.nextSibling;\n (n = u(t)) ? P(n) : L(t, e, !0), t = i;\n }\n }(e, v, i);\n var k = h[e.nodeName];\n k && k(e, t);\n }(t, n) : h.TEXTAREA(t, n);\n }\n\n !function e(t) {\n if (t.nodeType === f || t.nodeType === v) for (var n = t.firstChild; n;) {\n var i = u(n);\n i && (E[i] = n), e(n), n = n.nextSibling;\n }\n }(t);\n var N = t,\n D = N.nodeType,\n O = n.nodeType;\n if (!C) if (D === f) O === f ? l(t, n) || (x(t), N = function (e, t) {\n for (var n = e.firstChild; n;) {\n var i = n.nextSibling;\n t.appendChild(n), n = i;\n }\n\n return t;\n }(t, function (e, t) {\n return t && t !== o ? a.createElementNS(t, e) : a.createElement(e);\n }(n.nodeName, n.namespaceURI))) : N = n;else if (D === p || D === g) {\n if (O === D) return N.nodeValue !== n.nodeValue && (N.nodeValue = n.nodeValue), N;\n N = n;\n }\n if (N === n) x(t);else {\n if (n.isSameNode && n.isSameNode(N)) return;\n if (I(N, n, C), S) for (var R = 0, _ = S.length; R < _; R++) {\n var j = E[S[R]];\n j && L(j, j.parentNode, !1);\n }\n }\n return !C && N !== t && t.parentNode && (N.actualize && (N = N.actualize(t.ownerDocument || a)), t.parentNode.replaceChild(N, t)), N;\n };\n }(function (e, t) {\n var n,\n i,\n o,\n a,\n u = t.attributes;\n\n if (t.nodeType !== r && e.nodeType !== r) {\n for (var c = u.length - 1; c >= 0; c--) i = (n = u[c]).name, o = n.namespaceURI, a = n.value, o ? (i = n.localName || i, e.getAttributeNS(o, i) !== a && (\"xmlns\" === n.prefix && (i = n.name), e.setAttributeNS(o, i, a))) : e.getAttribute(i) !== a && e.setAttribute(i, a);\n\n for (var s = e.attributes, l = s.length - 1; l >= 0; l--) i = (n = s[l]).name, (o = n.namespaceURI) ? (i = n.localName || i, t.hasAttributeNS(o, i) || e.removeAttributeNS(o, i)) : t.hasAttribute(i) || e.removeAttribute(i);\n }\n });\n\n function k(e) {\n return I(e) || C(e) || N(e) || T();\n }\n\n function w(e, t) {\n var n = Object.keys(e);\n\n if (Object.getOwnPropertySymbols) {\n var i = Object.getOwnPropertySymbols(e);\n t && (i = i.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, i);\n }\n\n return n;\n }\n\n function x(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n }\n\n function A(e) {\n return function (e) {\n if (Array.isArray(e)) return D(e);\n }(e) || C(e) || N(e) || function () {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }();\n }\n\n function C(e) {\n if (\"undefined\" != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e);\n }\n\n function E(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }\n\n function S(e, t) {\n for (var n = 0; n < t.length; n++) {\n var i = t[n];\n i.enumerable = i.enumerable || !1, i.configurable = !0, \"value\" in i && (i.writable = !0), Object.defineProperty(e, i.key, i);\n }\n }\n\n function P(e, t, n) {\n return t && S(e.prototype, t), n && S(e, n), e;\n }\n\n function L(e, t) {\n return I(e) || function (e, t) {\n if (\"undefined\" == typeof Symbol || !(Symbol.iterator in Object(e))) return;\n var n = [],\n i = !0,\n r = !1,\n o = void 0;\n\n try {\n for (var a, u = e[Symbol.iterator](); !(i = (a = u.next()).done) && (n.push(a.value), !t || n.length !== t); i = !0);\n } catch (e) {\n r = !0, o = e;\n } finally {\n try {\n i || null == u.return || u.return();\n } finally {\n if (r) throw o;\n }\n }\n\n return n;\n }(e, t) || N(e, t) || T();\n }\n\n function T() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n function I(e) {\n if (Array.isArray(e)) return e;\n }\n\n function N(e, t) {\n if (e) {\n if (\"string\" == typeof e) return D(e, t);\n var n = Object.prototype.toString.call(e).slice(8, -1);\n return \"Object\" === n && e.constructor && (n = e.constructor.name), \"Map\" === n || \"Set\" === n ? Array.from(e) : \"Arguments\" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? D(e, t) : void 0;\n }\n }\n\n function D(e, t) {\n (null == t || t > e.length) && (t = e.length);\n\n for (var n = 0, i = new Array(t); n < t; n++) i[n] = e[n];\n\n return i;\n }\n\n function O(e) {\n \"@babel/helpers - typeof\";\n\n return (O = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (e) {\n return typeof e;\n } : function (e) {\n return e && \"function\" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e;\n })(e);\n }\n\n n.d(t, \"debug\", function () {\n return K;\n }), n.d(t, \"Rendered\", function () {\n return ee;\n }), n.d(t, \"LiveSocket\", function () {\n return te;\n }), n.d(t, \"Browser\", function () {\n return ne;\n }), n.d(t, \"DOM\", function () {\n return ie;\n }), n.d(t, \"View\", function () {\n return oe;\n });\n\n var R = [1e3, 3e3],\n _ = \"data-phx-view\",\n j = [\"phx-click-loading\", \"phx-change-loading\", \"phx-submit-loading\", \"phx-keydown-loading\", \"phx-keyup-loading\", \"phx-blur-loading\", \"phx-focus-loading\"],\n H = \"data-phx-component\",\n M = \"data-phx-ref\",\n B = \"[\".concat(_, \"]\"),\n J = [\"text\", \"textarea\", \"number\", \"email\", \"password\", \"search\", \"tel\", \"url\", \"date\", \"time\"],\n U = [\"checkbox\", \"radio\"],\n F = 1,\n V = \"phx-\",\n q = {\n debounce: 300,\n throttle: 300\n },\n W = function (e, t) {\n return console.error && console.error(e, t);\n };\n\n var K = function (e, t, n, i) {\n e.liveSocket.isDebugEnabled() && console.log(\"\".concat(e.id, \" \").concat(t, \": \").concat(n, \" - \"), i);\n },\n $ = function (e) {\n return \"function\" == typeof e ? e : function () {\n return e;\n };\n },\n z = function (e) {\n return JSON.parse(JSON.stringify(e));\n },\n X = function (e, t, n) {\n do {\n if (e.matches(\"[\".concat(t, \"]\"))) return e;\n e = e.parentElement || e.parentNode;\n } while (null !== e && 1 === e.nodeType && !(n && n.isSameNode(e) || e.matches(B)));\n\n return null;\n },\n G = function (e) {\n return null !== e && \"object\" === O(e) && !(e instanceof Array);\n },\n Y = function (e) {\n for (var t in e) return !1;\n\n return !0;\n },\n Q = function (e, t) {\n return e && t(e);\n },\n Z = function (e) {\n var t,\n n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {},\n i = new FormData(e),\n r = new URLSearchParams(),\n o = function (e) {\n if (\"undefined\" == typeof Symbol || null == e[Symbol.iterator]) {\n if (Array.isArray(e) || (e = N(e))) {\n var t = 0,\n n = function () {};\n\n return {\n s: n,\n n: function () {\n return t >= e.length ? {\n done: !0\n } : {\n done: !1,\n value: e[t++]\n };\n },\n e: function (e) {\n throw e;\n },\n f: n\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var i,\n r,\n o = !0,\n a = !1;\n return {\n s: function () {\n i = e[Symbol.iterator]();\n },\n n: function () {\n var e = i.next();\n return o = e.done, e;\n },\n e: function (e) {\n a = !0, r = e;\n },\n f: function () {\n try {\n o || null == i.return || i.return();\n } finally {\n if (a) throw r;\n }\n }\n };\n }(i.entries());\n\n try {\n for (o.s(); !(t = o.n()).done;) {\n var a = L(t.value, 2),\n u = a[0],\n c = a[1];\n r.append(u, c);\n }\n } catch (e) {\n o.e(e);\n } finally {\n o.f();\n }\n\n for (var s in n) r.append(s, n[s]);\n\n return r.toString();\n },\n ee = function () {\n function e(t, n) {\n E(this, e), this.viewId = t, this.replaceRendered(n);\n }\n\n return P(e, [{\n key: \"parentViewId\",\n value: function () {\n return this.viewId;\n }\n }, {\n key: \"toString\",\n value: function (e) {\n return this.recursiveToString(this.rendered, this.rendered.c, e);\n }\n }, {\n key: \"recursiveToString\",\n value: function (e) {\n var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : e.c || {},\n n = arguments.length > 2 ? arguments[2] : void 0,\n i = {\n buffer: \"\",\n components: t,\n onlyCids: n = n ? new Set(n) : null\n };\n return this.toOutputBuffer(e, i), i.buffer;\n }\n }, {\n key: \"componentCIDs\",\n value: function (e) {\n return Object.keys(e.c || {}).map(function (e) {\n return parseInt(e);\n });\n }\n }, {\n key: \"isComponentOnlyDiff\",\n value: function (e) {\n return !!e.c && 0 === Object.keys(e).filter(function (e) {\n return \"title\" !== e && \"c\" !== e;\n }).length;\n }\n }, {\n key: \"mergeDiff\",\n value: function (e) {\n !e.c && this.isNewFingerprint(e) ? this.replaceRendered(e) : (this.recursiveMerge(this.rendered, e), this.expandStatics(e));\n }\n }, {\n key: \"expandStatics\",\n value: function (e) {\n if (!Y(this.rendered.c)) for (var t in e.c) {\n var n = e.c[t].s;\n\n if (\"number\" == typeof n) {\n for (; \"number\" == typeof n;) n = this.rendered.c[n].s;\n\n this.rendered.c[t].s = n;\n }\n }\n }\n }, {\n key: \"recursiveMerge\",\n value: function (e, t) {\n for (var n in t) {\n var i = t[n],\n r = e[n];\n G(i) && G(r) ? (r.d && !i.d && delete r.d, this.recursiveMerge(r, i)) : e[n] = i;\n }\n }\n }, {\n key: \"componentToString\",\n value: function (e) {\n return this.recursiveCIDToString(this.rendered.c, e);\n }\n }, {\n key: \"pruneCIDs\",\n value: function (e) {\n var t = this;\n e.forEach(function (e) {\n return delete t.rendered.c[e];\n });\n }\n }, {\n key: \"get\",\n value: function () {\n return this.rendered;\n }\n }, {\n key: \"replaceRendered\",\n value: function (e) {\n this.rendered = e, this.rendered.c = this.rendered.c || {}, this.expandStatics(e);\n }\n }, {\n key: \"isNewFingerprint\",\n value: function () {\n return !!(arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).s;\n }\n }, {\n key: \"toOutputBuffer\",\n value: function (e, t) {\n if (e.d) return this.comprehensionToBuffer(e, t);\n var n = e.s;\n t.buffer += n[0];\n\n for (var i = 1; i < n.length; i++) this.dynamicToBuffer(e[i - 1], t), t.buffer += n[i];\n }\n }, {\n key: \"comprehensionToBuffer\",\n value: function (e, t) {\n for (var n = e.d, i = e.s, r = 0; r < n.length; r++) {\n var o = n[r];\n t.buffer += i[0];\n\n for (var a = 1; a < i.length; a++) this.dynamicToBuffer(o[a - 1], t), t.buffer += i[a];\n }\n }\n }, {\n key: \"dynamicToBuffer\",\n value: function (e, t) {\n \"number\" == typeof e ? t.buffer += this.recursiveCIDToString(t.components, e, t.onlyCids) : G(e) ? this.toOutputBuffer(e, t) : t.buffer += e;\n }\n }, {\n key: \"recursiveCIDToString\",\n value: function (e, t, n) {\n var i = this,\n r = e[t] || W(\"no component for CID \".concat(t), e),\n o = document.createElement(\"template\");\n o.innerHTML = this.recursiveToString(r, e, n);\n var a = o.content,\n u = n && !n.has(t);\n return Array.from(a.childNodes).forEach(function (e, n) {\n if (e.nodeType === Node.ELEMENT_NODE) e.setAttribute(H, t), e.id || (e.id = \"\".concat(i.parentViewId(), \"-\").concat(t, \"-\").concat(n)), u && (e.setAttribute(\"data-phx-skip\", \"\"), e.innerHTML = \"\");else if (\"\" !== e.nodeValue.trim()) {\n W(\"only HTML element tags are allowed at the root of components.\\n\\n\" + 'got: \"'.concat(e.nodeValue.trim(), '\"\\n\\n') + \"within:\\n\", o.innerHTML.trim());\n var r = document.createElement(\"span\");\n r.innerText = e.nodeValue, r.setAttribute(H, t), e.replaceWith(r);\n } else e.remove();\n }), o.innerHTML;\n }\n }]), e;\n }(),\n te = function () {\n function e(t, n) {\n var i = this,\n r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {};\n if (E(this, e), this.unloaded = !1, !n || \"Object\" === n.constructor.name) throw new Error('\\n a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example:\\n\\n import {Socket} from \"phoenix\"\\n import {LiveSocket} from \"phoenix_live_view\"\\n let liveSocket = new LiveSocket(\"/live\", Socket, {...})\\n ');\n this.socket = new n(t, r), this.bindingPrefix = r.bindingPrefix || V, this.opts = r, this.params = $(r.params || {}), this.viewLogger = r.viewLogger, this.metadataCallbacks = r.metadata || {}, this.defaults = Object.assign(z(q), r.defaults || {}), this.activeElement = null, this.prevActive = null, this.silenced = !1, this.main = null, this.linkRef = 0, this.roots = {}, this.href = window.location.href, this.pendingLink = null, this.currentLocation = z(window.location), this.hooks = r.hooks || {}, this.loaderTimeout = r.loaderTimeout || F, this.boundTopLevelEvents = !1, this.domCallbacks = r.dom || {\n onBeforeElUpdated: $()\n }, window.addEventListener(\"unload\", function (e) {\n i.unloaded = !0;\n }), this.socket.onOpen(function () {\n i.isUnloaded() && window.location.reload();\n });\n }\n\n return P(e, [{\n key: \"isProfileEnabled\",\n value: function () {\n return \"true\" === sessionStorage.getItem(\"phx:live-socket:profiling\");\n }\n }, {\n key: \"isDebugEnabled\",\n value: function () {\n return \"true\" === sessionStorage.getItem(\"phx:live-socket:debug\");\n }\n }, {\n key: \"enableDebug\",\n value: function () {\n sessionStorage.setItem(\"phx:live-socket:debug\", \"true\");\n }\n }, {\n key: \"enableProfiling\",\n value: function () {\n sessionStorage.setItem(\"phx:live-socket:profiling\", \"true\");\n }\n }, {\n key: \"disableDebug\",\n value: function () {\n sessionStorage.removeItem(\"phx:live-socket:debug\");\n }\n }, {\n key: \"disableProfiling\",\n value: function () {\n sessionStorage.removeItem(\"phx:live-socket:profiling\");\n }\n }, {\n key: \"enableLatencySim\",\n value: function (e) {\n this.enableDebug(), console.log(\"latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable\"), sessionStorage.setItem(\"phx:live-socket:latency-sim\", e);\n }\n }, {\n key: \"disableLatencySim\",\n value: function () {\n sessionStorage.removeItem(\"phx:live-socket:latency-sim\");\n }\n }, {\n key: \"getLatencySim\",\n value: function () {\n var e = sessionStorage.getItem(\"phx:live-socket:latency-sim\");\n return e ? parseInt(e) : null;\n }\n }, {\n key: \"getSocket\",\n value: function () {\n return this.socket;\n }\n }, {\n key: \"connect\",\n value: function () {\n var e = this,\n t = function () {\n e.joinRootViews() && (e.bindTopLevelEvents(), e.socket.connect());\n };\n\n [\"complete\", \"loaded\", \"interactive\"].indexOf(document.readyState) >= 0 ? t() : document.addEventListener(\"DOMContentLoaded\", function () {\n return t();\n });\n }\n }, {\n key: \"disconnect\",\n value: function (e) {\n this.socket.disconnect(e);\n }\n }, {\n key: \"triggerDOM\",\n value: function (e, t) {\n var n;\n (n = this.domCallbacks)[e].apply(n, A(t));\n }\n }, {\n key: \"time\",\n value: function (e, t) {\n if (!this.isProfileEnabled() || !console.time) return t();\n console.time(e);\n var n = t();\n return console.timeEnd(e), n;\n }\n }, {\n key: \"log\",\n value: function (e, t, n) {\n if (this.viewLogger) {\n var i = L(n(), 2),\n r = i[0],\n o = i[1];\n this.viewLogger(e, t, r, o);\n } else if (this.isDebugEnabled()) {\n var a = L(n(), 2),\n u = a[0],\n c = a[1];\n K(e, t, u, c);\n }\n }\n }, {\n key: \"onChannel\",\n value: function (e, t, n) {\n var i = this;\n e.on(t, function (e) {\n var t = i.getLatencySim();\n t ? (console.log(\"simulating \".concat(t, \"ms of latency from server to client\")), setTimeout(function () {\n return n(e);\n }, t)) : n(e);\n });\n }\n }, {\n key: \"wrapPush\",\n value: function (e) {\n var t = this.getLatencySim();\n if (!t) return e();\n console.log(\"simulating \".concat(t, \"ms of latency from client to server\"));\n var n = {\n receives: [],\n receive: function (e, t) {\n this.receives.push([e, t]);\n }\n };\n return setTimeout(function () {\n n.receives.reduce(function (e, t) {\n var n = L(t, 2),\n i = n[0],\n r = n[1];\n return e.receive(i, r);\n }, e());\n }, t), n;\n }\n }, {\n key: \"reloadWithJitter\",\n value: function (e) {\n var t = this;\n this.disconnect();\n var n = R[0],\n i = R[1],\n r = Math.floor(Math.random() * (i - n + 1)) + n,\n o = ne.updateLocal(e.name(), \"consecutive-reloads\", 0, function (e) {\n return e + 1;\n });\n this.log(e, \"join\", function () {\n return [\"encountered \".concat(o, \" consecutive reloads\")];\n }), o > 10 && (this.log(e, \"join\", function () {\n return [\"exceeded \".concat(10, \" consecutive reloads. Entering failsafe mode\")];\n }), r = 3e4), setTimeout(function () {\n t.hasPendingLink() ? window.location = t.pendingLink : window.location.reload();\n }, r);\n }\n }, {\n key: \"getHookCallbacks\",\n value: function (e) {\n return this.hooks[e];\n }\n }, {\n key: \"isUnloaded\",\n value: function () {\n return this.unloaded;\n }\n }, {\n key: \"isConnected\",\n value: function () {\n return this.socket.isConnected();\n }\n }, {\n key: \"getBindingPrefix\",\n value: function () {\n return this.bindingPrefix;\n }\n }, {\n key: \"binding\",\n value: function (e) {\n return \"\".concat(this.getBindingPrefix()).concat(e);\n }\n }, {\n key: \"channel\",\n value: function (e, t) {\n return this.socket.channel(e, t);\n }\n }, {\n key: \"joinRootViews\",\n value: function () {\n var e = this,\n t = !1;\n return ie.all(document, \"\".concat(B, \":not([\").concat(\"data-phx-parent-id\", \"])\"), function (n) {\n var i = e.joinRootView(n, e.getHref());\n e.root = e.root || i, n.getAttribute(\"data-phx-main\") && (e.main = i), t = !0;\n }), t;\n }\n }, {\n key: \"redirect\",\n value: function (e, t) {\n this.disconnect(), ne.redirect(e, t);\n }\n }, {\n key: \"replaceMain\",\n value: function (e, t) {\n var n = this,\n i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null,\n r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : this.setPendingLink(e),\n o = this.main.el;\n this.main.showLoader(this.loaderTimeout), this.main.destroy(), ne.fetchPage(e, function (a, u) {\n if (200 !== a) return n.redirect(e);\n var c = document.createElement(\"template\");\n c.innerHTML = u;\n var s = c.content.childNodes[0];\n if (!s || !n.isPhxView(s)) return n.redirect(e);\n n.joinRootView(s, e, t, function (e, t) {\n 1 === t && (n.commitPendingLink(r) ? (o.replaceWith(e.el), n.main = e, i && i()) : e.destroy());\n });\n });\n }\n }, {\n key: \"isPhxView\",\n value: function (e) {\n return e.getAttribute && null !== e.getAttribute(_);\n }\n }, {\n key: \"joinRootView\",\n value: function (e, t, n, i) {\n var r = new oe(e, this, null, t, n);\n return this.roots[r.id] = r, r.join(i), r;\n }\n }, {\n key: \"owner\",\n value: function (e, t) {\n var n = this,\n i = Q(e.closest(B), function (e) {\n return n.getViewByEl(e);\n });\n i && t(i);\n }\n }, {\n key: \"withinTargets\",\n value: function (e, t, n) {\n var i = this;\n\n if (/^(0|[1-9](\\d?)+)$/.test(t)) {\n var r = e || ie.findFirstComponentNode(document, t);\n if (!r) throw new Error(\"no phx-target's found matching @myself of \".concat(t));\n this.owner(r, function (e) {\n return n(e, r);\n });\n } else {\n var o = Array.from(document.querySelectorAll(t));\n if (0 === o.length) throw new Error(\"no phx-target's found for selector \\\"\".concat(t, '\"'));\n o.forEach(function (e) {\n i.owner(e, function (t) {\n return n(t, e);\n });\n });\n }\n }\n }, {\n key: \"withinOwners\",\n value: function (e, t) {\n var n = e.getAttribute(this.binding(\"target\"));\n null === n ? this.owner(e, function (n) {\n return t(n, e);\n }) : this.withinTargets(e, n, t);\n }\n }, {\n key: \"getViewByEl\",\n value: function (e) {\n var t = e.getAttribute(\"data-phx-root-id\");\n return this.getRootById(t).getDescendentByEl(e);\n }\n }, {\n key: \"getRootById\",\n value: function (e) {\n return this.roots[e];\n }\n }, {\n key: \"onViewError\",\n value: function (e) {\n this.dropActiveElement(e);\n }\n }, {\n key: \"destroyAllViews\",\n value: function () {\n for (var e in this.roots) this.roots[e].destroy(), delete this.roots[e];\n }\n }, {\n key: \"destroyViewByEl\",\n value: function (e) {\n this.getRootById(e.getAttribute(\"data-phx-root-id\")).destroyDescendent(e.id);\n }\n }, {\n key: \"setActiveElement\",\n value: function (e) {\n var t = this;\n\n if (this.activeElement !== e) {\n this.activeElement = e;\n\n var n = function () {\n e === t.activeElement && (t.activeElement = null), e.removeEventListener(\"mouseup\", t), e.removeEventListener(\"touchend\", t);\n };\n\n e.addEventListener(\"mouseup\", n), e.addEventListener(\"touchend\", n);\n }\n }\n }, {\n key: \"getActiveElement\",\n value: function () {\n return document.activeElement === document.body && this.activeElement || document.activeElement;\n }\n }, {\n key: \"dropActiveElement\",\n value: function (e) {\n this.prevActive && e.ownsElement(this.prevActive) && (this.prevActive = null);\n }\n }, {\n key: \"restorePreviouslyActiveFocus\",\n value: function () {\n this.prevActive && this.prevActive !== document.body && this.prevActive.focus();\n }\n }, {\n key: \"blurActiveElement\",\n value: function () {\n this.prevActive = this.getActiveElement(), this.prevActive !== document.body && this.prevActive.blur();\n }\n }, {\n key: \"bindTopLevelEvents\",\n value: function () {\n var e = this;\n this.boundTopLevelEvents || (this.boundTopLevelEvents = !0, window.addEventListener(\"pageshow\", function (t) {\n t.persisted && (e.withPageLoading({\n to: window.location.href,\n kind: \"redirect\"\n }), window.location.reload());\n }), this.bindClicks(), this.bindNav(), this.bindForms(), this.bind({\n keyup: \"keyup\",\n keydown: \"keydown\"\n }, function (t, n, i, r, o, a, u) {\n var c = r.getAttribute(e.binding(\"key\")),\n s = t.key && t.key.toLowerCase();\n c && c.toLowerCase() !== s || i.pushKey(r, o, n, a, function (e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? w(Object(n), !0).forEach(function (t) {\n x(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : w(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n\n return e;\n }({\n key: t.key\n }, e.eventMeta(n, t, r)));\n }), this.bind({\n blur: \"focusout\",\n focus: \"focusin\"\n }, function (t, n, i, r, o, a, u) {\n u || i.pushEvent(n, r, o, a, e.eventMeta(n, t, r));\n }), this.bind({\n blur: \"blur\",\n focus: \"focus\"\n }, function (t, n, i, r, o, a, u) {\n u && \"window\" !== !u && i.pushEvent(n, r, o, a, e.eventMeta(n, t, r));\n }));\n }\n }, {\n key: \"eventMeta\",\n value: function (e, t, n) {\n var i = this.metadataCallbacks[e];\n return i ? i(t, n) : {};\n }\n }, {\n key: \"setPendingLink\",\n value: function (e) {\n return this.linkRef++, this.pendingLink = e, this.linkRef;\n }\n }, {\n key: \"commitPendingLink\",\n value: function (e) {\n return this.linkRef === e && (this.href = this.pendingLink, this.pendingLink = null, !0);\n }\n }, {\n key: \"getHref\",\n value: function () {\n return this.href;\n }\n }, {\n key: \"hasPendingLink\",\n value: function () {\n return !!this.pendingLink;\n }\n }, {\n key: \"bind\",\n value: function (e, t) {\n var n = this,\n i = function (i) {\n var r = e[i];\n n.on(r, function (e) {\n var r = n.binding(i),\n o = n.binding(\"window-\".concat(i)),\n a = e.target.getAttribute && e.target.getAttribute(r);\n a ? n.debounce(e.target, e, function () {\n n.withinOwners(e.target, function (n, r) {\n t(e, i, n, e.target, r, a, null);\n });\n }) : ie.all(document, \"[\".concat(o, \"]\"), function (r) {\n var a = r.getAttribute(o);\n n.debounce(r, e, function () {\n n.withinOwners(r, function (n, o) {\n t(e, i, n, r, o, a, \"window\");\n });\n });\n });\n });\n };\n\n for (var r in e) i(r);\n }\n }, {\n key: \"bindClicks\",\n value: function () {\n var e = this;\n [!0, !1].forEach(function (t) {\n var n = t ? e.binding(\"capture-click\") : e.binding(\"click\");\n window.addEventListener(\"click\", function (i) {\n var r = null,\n o = (r = t ? i.target.matches(\"[\".concat(n, \"]\")) ? i.target : i.target.querySelector(\"[\".concat(n, \"]\")) : X(i.target, n)) && r.getAttribute(n);\n o && (\"#\" === r.getAttribute(\"href\") && i.preventDefault(), e.debounce(r, i, function () {\n e.withinOwners(r, function (t, n) {\n t.pushEvent(\"click\", r, n, o, e.eventMeta(\"click\", i, r));\n });\n }));\n }, t);\n });\n }\n }, {\n key: \"bindNav\",\n value: function () {\n var e = this;\n ne.canPushState() && (window.onpopstate = function (t) {\n if (e.registerNewLocation(window.location)) {\n var n = t.state || {},\n i = n.type,\n r = n.id,\n o = n.root,\n a = window.location.href;\n e.main.isConnected() && \"patch\" === i && r === e.main.id ? e.main.pushLinkPatch(a, null) : e.replaceMain(a, null, function () {\n o && e.replaceRootHistory();\n });\n }\n }, window.addEventListener(\"click\", function (t) {\n var n = X(t.target, \"data-phx-link\"),\n i = n && n.getAttribute(\"data-phx-link\"),\n r = t.metaKey || t.ctrlKey || 1 === t.button;\n\n if (i && e.isConnected() && e.main && !r) {\n var o = n.href,\n a = n.getAttribute(\"data-phx-link-state\");\n if (t.preventDefault(), e.pendingLink !== o) if (\"patch\" === i) e.pushHistoryPatch(o, a, n);else {\n if (\"redirect\" !== i) throw new Error(\"expected \".concat(\"data-phx-link\", ' to be \"patch\" or \"redirect\", got: ').concat(i));\n e.historyRedirect(o, a);\n }\n }\n }, !1));\n }\n }, {\n key: \"withPageLoading\",\n value: function (e, t) {\n ie.dispatchEvent(window, \"phx:page-loading-start\", e);\n\n var n = function () {\n return ie.dispatchEvent(window, \"phx:page-loading-stop\", e);\n };\n\n return t ? t(n) : n;\n }\n }, {\n key: \"pushHistoryPatch\",\n value: function (e, t, n) {\n var i = this;\n this.withPageLoading({\n to: e,\n kind: \"patch\"\n }, function (r) {\n i.main.pushLinkPatch(e, n, function () {\n i.historyPatch(e, t), r();\n });\n });\n }\n }, {\n key: \"historyPatch\",\n value: function (e, t) {\n ne.pushState(t, {\n type: \"patch\",\n id: this.main.id\n }, e), this.registerNewLocation(window.location);\n }\n }, {\n key: \"historyRedirect\",\n value: function (e, t, n) {\n var i = this;\n this.withPageLoading({\n to: e,\n kind: \"redirect\"\n }, function (r) {\n i.replaceMain(e, n, function () {\n ne.pushState(t, {\n type: \"redirect\",\n id: i.main.id\n }, e), i.registerNewLocation(window.location), r();\n });\n });\n }\n }, {\n key: \"replaceRootHistory\",\n value: function () {\n ne.pushState(\"replace\", {\n root: !0,\n type: \"patch\",\n id: this.main.id\n });\n }\n }, {\n key: \"registerNewLocation\",\n value: function (e) {\n var t = this.currentLocation;\n return t.pathname + t.search !== e.pathname + e.search && (this.currentLocation = z(e), !0);\n }\n }, {\n key: \"bindForms\",\n value: function () {\n var e = this,\n t = 0;\n this.on(\"submit\", function (t) {\n var n = t.target.getAttribute(e.binding(\"submit\"));\n n && (t.preventDefault(), t.target.disabled = !0, e.withinOwners(t.target, function (e, i) {\n return e.submitForm(t.target, i, n);\n }));\n }, !1);\n\n for (var n = function () {\n var n = r[i];\n e.on(n, function (i) {\n var r = i.target,\n o = r.form && r.form.getAttribute(e.binding(\"change\"));\n\n if (o && (\"number\" !== r.type || !r.validity || !r.validity.badInput)) {\n var a = t;\n t++;\n var u = ie.private(r, \"prev-iteration\") || {},\n c = u.at,\n s = u.type;\n c === a - 1 && n !== s || (ie.putPrivate(r, \"prev-iteration\", {\n at: a,\n type: n\n }), e.debounce(r, i, function () {\n e.withinOwners(r.form, function (t, n) {\n ie.isTextualInput(r) ? ie.putPrivate(r, \"phx-has-focused\", !0) : e.setActiveElement(r), t.pushInput(r, n, o, i.target);\n });\n }));\n }\n }, !1);\n }, i = 0, r = [\"change\", \"input\"]; i < r.length; i++) n();\n }\n }, {\n key: \"debounce\",\n value: function (e, t, n) {\n var i = this.binding(\"debounce\"),\n r = this.binding(\"throttle\"),\n o = this.defaults.debounce.toString(),\n a = this.defaults.throttle.toString();\n ie.debounce(e, t, i, o, r, a, n);\n }\n }, {\n key: \"silenceEvents\",\n value: function (e) {\n this.silenced = !0, e(), this.silenced = !1;\n }\n }, {\n key: \"on\",\n value: function (e, t) {\n var n = this;\n window.addEventListener(e, function (e) {\n n.silenced || t(e);\n });\n }\n }]), e;\n }(),\n ne = {\n canPushState: function () {\n return void 0 !== history.pushState;\n },\n dropLocal: function (e, t) {\n return window.localStorage.removeItem(this.localKey(e, t));\n },\n updateLocal: function (e, t, n, i) {\n var r = this.getLocal(e, t),\n o = this.localKey(e, t),\n a = null === r ? n : i(r);\n return window.localStorage.setItem(o, JSON.stringify(a)), a;\n },\n getLocal: function (e, t) {\n return JSON.parse(window.localStorage.getItem(this.localKey(e, t)));\n },\n fetchPage: function (e, t) {\n var n = new XMLHttpRequest();\n n.open(\"GET\", e, !0), n.timeout = 3e4, n.setRequestHeader(\"content-type\", \"text/html\"), n.setRequestHeader(\"cache-control\", \"max-age=0, no-cache, no-store, must-revalidate, post-check=0, pre-check=0\"), n.setRequestHeader(\"x-requested-with\", \"live-link\"), n.onerror = function () {\n return t(400);\n }, n.ontimeout = function () {\n return t(504);\n }, n.onreadystatechange = function () {\n if (4 === n.readyState) {\n var i = new URL(e),\n r = i.pathname + i.search,\n o = Q(n.getResponseHeader(\"x-response-url\") || n.responseURL, function (e) {\n return new URL(e);\n }),\n a = o ? o.pathname + o.search : null;\n return \"live-link\" !== n.getResponseHeader(\"x-requested-with\") ? t(400) : null === o || a != r ? t(302) : 200 !== n.status ? t(n.status) : void t(200, n.responseText);\n }\n }, n.send();\n },\n pushState: function (e, t, n) {\n if (this.canPushState()) {\n if (n !== window.location.href) {\n history[e + \"State\"](t, \"\", n || null);\n var i = this.getHashTargetEl(window.location.hash);\n i ? i.scrollIntoView() : \"redirect\" === t.type && window.scroll(0, 0);\n }\n } else this.redirect(n);\n },\n setCookie: function (e, t) {\n document.cookie = \"\".concat(e, \"=\").concat(t);\n },\n getCookie: function (e) {\n return document.cookie.replace(new RegExp(\"(?:(?:^|.*;s*)\".concat(e, \"s*=s*([^;]*).*$)|^.*$\")), \"$1\");\n },\n redirect: function (e, t) {\n t && ne.setCookie(\"__phoenix_flash__\", t + \"; max-age=60000; path=/\"), window.location = e;\n },\n localKey: function (e, t) {\n return \"\".concat(e, \"-\").concat(t);\n },\n getHashTargetEl: function (e) {\n if (\"\" !== e.toString()) return document.getElementById(e) || document.querySelector('a[name=\"'.concat(e.substring(1), '\"]'));\n }\n },\n ie = {\n byId: function (e) {\n return document.getElementById(e) || W(\"no id found for \".concat(e));\n },\n removeClass: function (e, t) {\n e.classList.remove(t), 0 === e.classList.length && e.removeAttribute(\"class\");\n },\n all: function (e, t, n) {\n var i = Array.from(e.querySelectorAll(t));\n return n ? i.forEach(n) : i;\n },\n findFirstComponentNode: function (e, t) {\n return e.querySelector(\"[\".concat(H, '=\"').concat(t, '\"]'));\n },\n findComponentNodeList: function (e, t) {\n return this.all(e, \"[\".concat(H, '=\"').concat(t, '\"]'));\n },\n findPhxChildrenInFragment: function (e, t) {\n var n = document.createElement(\"template\");\n return n.innerHTML = e, this.findPhxChildren(n.content, t);\n },\n isPhxUpdate: function (e, t, n) {\n return e.getAttribute && n.indexOf(e.getAttribute(t)) >= 0;\n },\n findPhxChildren: function (e, t) {\n return this.all(e, \"\".concat(B, \"[\").concat(\"data-phx-parent-id\", '=\"').concat(t, '\"]'));\n },\n findParentCIDs: function (e, t) {\n var n = this,\n i = new Set(t);\n return t.reduce(function (t, i) {\n var r = \"[\".concat(H, '=\"').concat(i, '\"] [').concat(H, \"]\");\n return n.all(e, r).map(function (e) {\n return parseInt(e.getAttribute(H));\n }).forEach(function (e) {\n return t.delete(e);\n }), t;\n }, i);\n },\n private: function (e, t) {\n return e.phxPrivate && e.phxPrivate[t];\n },\n deletePrivate: function (e, t) {\n e.phxPrivate && delete e.phxPrivate[t];\n },\n putPrivate: function (e, t, n) {\n e.phxPrivate || (e.phxPrivate = {}), e.phxPrivate[t] = n;\n },\n copyPrivates: function (e, t) {\n t.phxPrivate && (e.phxPrivate = z(t.phxPrivate));\n },\n putTitle: function (e) {\n var t = document.querySelector(\"title\").dataset,\n n = t.prefix,\n i = t.suffix;\n document.title = \"\".concat(n || \"\").concat(e).concat(i || \"\");\n },\n debounce: function (e, t, n, i, r, o, a) {\n var u = this,\n c = e.getAttribute(n),\n s = e.getAttribute(r);\n \"\" === c && (c = i), \"\" === s && (s = o);\n var l = c || s;\n\n switch (l) {\n case null:\n return a();\n\n case \"blur\":\n return void (this.once(e, \"debounce-blur\") && e.addEventListener(\"blur\", function () {\n return a();\n }));\n\n default:\n var d = parseInt(l),\n h = this.incCycle(e, \"debounce-trigger\", function () {\n return s ? u.deletePrivate(e, \"throttled\") : a();\n });\n if (isNaN(d)) return W(\"invalid throttle/debounce value: \".concat(l));\n if (s) {\n if (\"keydown\" === t.type) {\n var f = this.private(e, \"debounce-prev-key\");\n if (this.putPrivate(e, \"debounce-prev-key\", t.which), f !== t.which) return a();\n } else {\n if (this.private(e, \"throttled\")) return !1;\n a(), this.putPrivate(e, \"throttled\", !0), setTimeout(function () {\n return u.triggerCycle(e, \"debounce-trigger\");\n }, d);\n }\n } else setTimeout(function () {\n return u.triggerCycle(e, \"debounce-trigger\", h);\n }, d);\n e.form && this.once(e.form, \"bind-debounce\") && e.form.addEventListener(\"submit\", function (t) {\n Array.from(new FormData(e.form).entries(), function (t) {\n var n = L(t, 2),\n i = n[0],\n r = (n[1], e.form.querySelector('[name=\"'.concat(i, '\"]')));\n u.incCycle(r, \"debounce-trigger\"), u.deletePrivate(r, \"throttled\");\n });\n }), this.once(e, \"bind-debounce\") && e.addEventListener(\"blur\", function (t) {\n return u.triggerCycle(e, \"debounce-trigger\");\n });\n }\n },\n triggerCycle: function (e, t, n) {\n var i = L(this.private(e, t), 2),\n r = i[0],\n o = i[1];\n n || (n = r), n === r && (this.incCycle(e, t), o());\n },\n once: function (e, t) {\n return !0 !== this.private(e, t) && (this.putPrivate(e, t, !0), !0);\n },\n incCycle: function (e, t) {\n var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : function () {},\n i = L(this.private(e, t) || [0, n], 2),\n r = i[0];\n i[1];\n return r++, this.putPrivate(e, t, [r, n]), r;\n },\n discardError: function (e, t, n) {\n var i = t.getAttribute && t.getAttribute(n),\n r = i && e.querySelector(\"#\".concat(i));\n r && (this.private(r, \"phx-has-focused\") || this.private(r.form, \"phx-has-submitted\") || t.classList.add(\"phx-no-feedback\"));\n },\n isPhxChild: function (e) {\n return e.getAttribute && e.getAttribute(\"data-phx-parent-id\");\n },\n dispatchEvent: function (e, t) {\n var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {},\n i = new CustomEvent(t, {\n bubbles: !0,\n cancelable: !0,\n detail: n\n });\n e.dispatchEvent(i);\n },\n cloneNode: function (e, t) {\n if (void 0 === t) return e.cloneNode(!0);\n var n = e.cloneNode(!1);\n return n.innerHTML = t, n;\n },\n mergeAttrs: function (e, t) {\n for (var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : [], i = t.attributes, r = i.length - 1; r >= 0; r--) {\n var o = i[r].name;\n n.indexOf(o) < 0 && e.setAttribute(o, t.getAttribute(o));\n }\n\n for (var a = e.attributes, u = a.length - 1; u >= 0; u--) {\n var c = a[u].name;\n t.hasAttribute(c) || e.removeAttribute(c);\n }\n },\n mergeFocusedInput: function (e, t) {\n e instanceof HTMLSelectElement || ie.mergeAttrs(e, t, [\"value\"]), t.readOnly ? e.setAttribute(\"readonly\", !0) : e.removeAttribute(\"readonly\");\n },\n restoreFocus: function (e, t, n) {\n if (ie.isTextualInput(e)) {\n var i = e.matches(\":focus\");\n e.readOnly && e.blur(), i || e.focus(), (e.setSelectionRange && \"text\" === e.type || \"textarea\" === e.type) && e.setSelectionRange(t, n);\n }\n },\n isFormInput: function (e) {\n return /^(?:input|select|textarea)$/i.test(e.tagName);\n },\n syncAttrsToProps: function (e) {\n e instanceof HTMLInputElement && U.indexOf(e.type.toLocaleLowerCase()) >= 0 && (e.checked = null !== e.getAttribute(\"checked\"));\n },\n isTextualInput: function (e) {\n return J.indexOf(e.type) >= 0;\n },\n isNowTriggerFormExternal: function (e, t) {\n return e.getAttribute && null !== e.getAttribute(t);\n },\n undoRefs: function (e, t) {\n var n = this;\n ie.all(t, \"[\".concat(M, \"]\"), function (t) {\n return n.syncPendingRef(e, t, t);\n });\n },\n syncPendingRef: function (e, t, n) {\n var i = t.getAttribute && t.getAttribute(M);\n if (null === i) return !0;\n var r = parseInt(i);\n return null !== e && e >= r ? ([t, n].forEach(function (e) {\n e.removeAttribute(M), null !== e.getAttribute(\"data-phx-readonly\") && (e.readOnly = !1, e.removeAttribute(\"data-phx-readonly\")), null !== e.getAttribute(\"data-phx-disabled\") && (e.disabled = !1, e.removeAttribute(\"data-phx-disabled\")), j.forEach(function (t) {\n return ie.removeClass(e, t);\n });\n var t = e.getAttribute(\"data-phx-disable-with-restore\");\n null !== t && (e.innerText = t, e.removeAttribute(\"data-phx-disable-with-restore\"));\n }), !0) : (j.forEach(function (e) {\n t.classList.contains(e) && n.classList.add(e);\n }), n.setAttribute(M, t.getAttribute(M)), !ie.isFormInput(t) && !/submit/i.test(t.type));\n }\n },\n re = function () {\n function e(t, n, i, r, o, a) {\n E(this, e), this.view = t, this.liveSocket = t.liveSocket, this.container = n, this.id = i, this.rootID = t.root.id, this.html = r, this.targetCID = o, this.ref = a, this.cidPatch = \"number\" == typeof this.targetCID, this.callbacks = {\n beforeadded: [],\n beforeupdated: [],\n beforediscarded: [],\n beforephxChildAdded: [],\n afteradded: [],\n afterupdated: [],\n afterdiscarded: [],\n afterphxChildAdded: []\n };\n }\n\n return P(e, [{\n key: \"before\",\n value: function (e, t) {\n this.callbacks[\"before\".concat(e)].push(t);\n }\n }, {\n key: \"after\",\n value: function (e, t) {\n this.callbacks[\"after\".concat(e)].push(t);\n }\n }, {\n key: \"trackBefore\",\n value: function (e) {\n for (var t = arguments.length, n = new Array(t > 1 ? t - 1 : 0), i = 1; i < t; i++) n[i - 1] = arguments[i];\n\n this.callbacks[\"before\".concat(e)].forEach(function (e) {\n return e.apply(void 0, n);\n });\n }\n }, {\n key: \"trackAfter\",\n value: function (e) {\n for (var t = arguments.length, n = new Array(t > 1 ? t - 1 : 0), i = 1; i < t; i++) n[i - 1] = arguments[i];\n\n this.callbacks[\"after\".concat(e)].forEach(function (e) {\n return e.apply(void 0, n);\n });\n }\n }, {\n key: \"markPrunableContentForRemoval\",\n value: function () {\n ie.all(this.container, \"[phx-update=append] > *, [phx-update=prepend] > *\", function (e) {\n e.setAttribute(\"data-phx-remove\", \"\");\n });\n }\n }, {\n key: \"perform\",\n value: function () {\n var e = this,\n t = this.view,\n n = this.liveSocket,\n i = this.container,\n r = this.html,\n o = this.isCIDPatch() ? this.targetCIDContainer() : i;\n\n if (!this.isCIDPatch() || o) {\n var a = n.getActiveElement(),\n u = a && ie.isTextualInput(a) ? a : {},\n c = u.selectionStart,\n s = u.selectionEnd,\n l = n.binding(\"update\"),\n d = n.binding(\"feedback-for\"),\n h = n.binding(\"trigger-action\"),\n f = [],\n v = [],\n p = [],\n g = n.time(\"premorph container prep\", function () {\n return e.buildDiffHTML(i, r, l, o);\n });\n return this.trackBefore(\"added\", i), this.trackBefore(\"updated\", i, i), n.time(\"morphdom\", function () {\n b(o, g, {\n childrenOnly: null === o.getAttribute(H),\n onBeforeNodeAdded: function (t) {\n return ie.discardError(o, t, d), e.trackBefore(\"added\", t), t;\n },\n onNodeAdded: function (n) {\n ie.isNowTriggerFormExternal(n, h) && n.submit(), ie.isPhxChild(n) && t.ownsElement(n) && e.trackAfter(\"phxChildAdded\", n), f.push(n);\n },\n onNodeDiscarded: function (t) {\n e.trackAfter(\"discarded\", t);\n },\n onBeforeNodeDiscarded: function (t) {\n return !(!t.getAttribute || null === t.getAttribute(\"data-phx-remove\")) || (null === t.parentNode || !ie.isPhxUpdate(t.parentNode, l, [\"append\", \"prepend\"])) && !e.skipCIDSibling(t) && (e.trackBefore(\"discarded\", t), ie.isPhxChild(t) ? (n.destroyViewByEl(t), !0) : void 0);\n },\n onElUpdated: function (e) {\n ie.isNowTriggerFormExternal(e, h) && e.submit(), v.push(e);\n },\n onBeforeElUpdated: function (t, n) {\n if (e.skipCIDSibling(n)) return !1;\n if (\"ignore\" === t.getAttribute(l)) return e.trackBefore(\"updated\", t, n), ie.mergeAttrs(t, n), v.push(t), !1;\n if (\"number\" === t.type && t.validity && t.validity.badInput) return !1;\n if (!ie.syncPendingRef(e.ref, t, n)) return !1;\n\n if (ie.isPhxChild(n)) {\n var i = t.getAttribute(\"data-phx-static\");\n return ie.mergeAttrs(t, n), t.setAttribute(\"data-phx-static\", i), t.setAttribute(\"data-phx-root-id\", e.rootID), !1;\n }\n\n if (ie.copyPrivates(n, t), ie.discardError(o, n, d), a && t.isSameNode(a) && ie.isFormInput(t) && !e.forceFocusedSelectUpdate(t, n)) return e.trackBefore(\"updated\", t, n), ie.mergeFocusedInput(t, n), ie.syncAttrsToProps(t), v.push(t), !1;\n\n if (ie.isPhxUpdate(n, l, [\"append\", \"prepend\"])) {\n var r = \"append\" === n.getAttribute(l),\n u = Array.from(t.children).map(function (e) {\n return e.id;\n }),\n c = Array.from(n.children).map(function (e) {\n return e.id;\n });\n r && !c.find(function (e) {\n return u.indexOf(e) >= 0;\n }) || p.push([n.id, u]);\n }\n\n return ie.syncAttrsToProps(n), e.trackBefore(\"updated\", t, n), !0;\n }\n });\n }), n.isDebugEnabled() && function () {\n for (var e = new Set(), t = document.querySelectorAll(\"*[id]\"), n = 0, i = t.length; n < i; n++) e.has(t[n].id) ? console.error(\"Multiple IDs detected: \".concat(t[n].id, \". Ensure unique element ids.\")) : e.add(t[n].id);\n }(), p.length > 0 && n.time(\"post-morph append/prepend restoration\", function () {\n p.forEach(function (e) {\n var t = L(e, 2),\n n = t[0],\n i = t[1],\n r = ie.byId(n);\n \"append\" === r.getAttribute(l) ? i.reverse().forEach(function (e) {\n Q(document.getElementById(e), function (e) {\n return r.insertBefore(e, r.firstChild);\n });\n }) : i.forEach(function (e) {\n Q(document.getElementById(e), function (e) {\n return r.appendChild(e);\n });\n });\n });\n }), n.silenceEvents(function () {\n return ie.restoreFocus(a, c, s);\n }), ie.dispatchEvent(document, \"phx:update\"), f.forEach(function (t) {\n return e.trackAfter(\"added\", t);\n }), v.forEach(function (t) {\n return e.trackAfter(\"updated\", t);\n }), !0;\n }\n }\n }, {\n key: \"forceFocusedSelectUpdate\",\n value: function (e, t) {\n return !0 === e.multiple || e.innerHTML != t.innerHTML;\n }\n }, {\n key: \"isCIDPatch\",\n value: function () {\n return this.cidPatch;\n }\n }, {\n key: \"skipCIDSibling\",\n value: function (e) {\n return e.nodeType === Node.ELEMENT_NODE && null !== e.getAttribute(\"data-phx-skip\");\n }\n }, {\n key: \"targetCIDContainer\",\n value: function () {\n if (this.isCIDPatch()) {\n var e = k(ie.findComponentNodeList(this.container, this.targetCID)),\n t = e[0];\n return 0 === e.slice(1).length ? t : t && t.parentNode;\n }\n }\n }, {\n key: \"buildDiffHTML\",\n value: function (e, t, n, i) {\n var r = this,\n o = this.isCIDPatch(),\n a = o && i.getAttribute(H) === this.targetCID.toString();\n if (!o || a) return t;\n var u = null,\n c = document.createElement(\"template\");\n u = ie.cloneNode(i);\n var s = k(ie.findComponentNodeList(u, this.targetCID)),\n l = s[0],\n d = s.slice(1);\n return c.innerHTML = t, d.forEach(function (e) {\n return e.remove();\n }), Array.from(u.childNodes).forEach(function (e) {\n e.id && e.nodeType === Node.ELEMENT_NODE && e.getAttribute(H) !== r.targetCID.toString() && (e.setAttribute(\"data-phx-skip\", \"\"), e.innerHTML = \"\");\n }), Array.from(c.content.childNodes).forEach(function (e) {\n return u.insertBefore(e, l);\n }), l.remove(), u.outerHTML;\n }\n }]), e;\n }(),\n oe = function () {\n function e(t, n, i, r, o) {\n var a = this;\n E(this, e), this.liveSocket = n, this.flash = o, this.parent = i, this.root = i ? i.root : this, this.el = t, this.id = this.el.id, this.view = this.el.getAttribute(_), this.ref = 0, this.childJoins = 0, this.loaderTimer = null, this.pendingDiffs = [], this.href = r, this.joinCount = this.parent ? this.parent.joinCount - 1 : 0, this.joinPending = !0, this.destroyed = !1, this.joinCallback = function () {}, this.stopCallback = function () {}, this.pendingJoinOps = this.parent ? null : [], this.viewHooks = {}, this.children = this.parent ? null : {}, this.root.children[this.id] = {}, this.channel = this.liveSocket.channel(\"lv:\".concat(this.id), function () {\n return {\n url: a.href,\n params: a.connectParams(),\n session: a.getSession(),\n static: a.getStatic(),\n flash: a.flash\n };\n }), this.showLoader(this.liveSocket.loaderTimeout), this.bindChannel();\n }\n\n return P(e, [{\n key: \"isMain\",\n value: function () {\n return this.liveSocket.main === this;\n }\n }, {\n key: \"connectParams\",\n value: function () {\n var e = this.liveSocket.params(this.view),\n t = ie.all(document, \"[\".concat(this.binding(\"track-static\"), \"]\")).map(function (e) {\n return e.src || e.href;\n }).filter(function (e) {\n return \"string\" == typeof e;\n });\n return t.length > 0 && (e._track_static = t), e._mounts = this.joinCount, e;\n }\n }, {\n key: \"name\",\n value: function () {\n return this.view;\n }\n }, {\n key: \"isConnected\",\n value: function () {\n return this.channel.canPush();\n }\n }, {\n key: \"getSession\",\n value: function () {\n return this.el.getAttribute(\"data-phx-session\");\n }\n }, {\n key: \"getStatic\",\n value: function () {\n var e = this.el.getAttribute(\"data-phx-static\");\n return \"\" === e ? null : e;\n }\n }, {\n key: \"destroy\",\n value: function () {\n var e = this,\n t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : function () {};\n this.destroyAllChildren(), this.destroyed = !0, delete this.root.children[this.id], this.parent && delete this.root.children[this.parent.id][this.id], clearTimeout(this.loaderTimer);\n\n var n = function () {\n for (var n in t(), e.viewHooks) e.destroyHook(e.viewHooks[n]);\n };\n\n this.log(\"destroyed\", function () {\n return [\"the child has been removed from the parent\"];\n }), this.channel.leave().receive(\"ok\", n).receive(\"error\", n).receive(\"timeout\", n);\n }\n }, {\n key: \"setContainerClasses\",\n value: function () {\n var e;\n this.el.classList.remove(\"phx-connected\", \"phx-disconnected\", \"phx-error\"), (e = this.el.classList).add.apply(e, arguments);\n }\n }, {\n key: \"isLoading\",\n value: function () {\n return this.el.classList.contains(\"phx-disconnected\");\n }\n }, {\n key: \"showLoader\",\n value: function (e) {\n var t = this;\n if (clearTimeout(this.loaderTimer), e) this.loaderTimer = setTimeout(function () {\n return t.showLoader();\n }, e);else {\n for (var n in this.viewHooks) this.viewHooks[n].__trigger__(\"disconnected\");\n\n this.setContainerClasses(\"phx-disconnected\");\n }\n }\n }, {\n key: \"hideLoader\",\n value: function () {\n clearTimeout(this.loaderTimer), this.setContainerClasses(\"phx-connected\");\n }\n }, {\n key: \"triggerReconnected\",\n value: function () {\n for (var e in this.viewHooks) this.viewHooks[e].__trigger__(\"reconnected\");\n }\n }, {\n key: \"log\",\n value: function (e, t) {\n this.liveSocket.log(this, e, t);\n }\n }, {\n key: \"onJoin\",\n value: function (e) {\n var t = this,\n n = e.rendered;\n this.joinCount++, this.childJoins = 0, this.joinPending = !0, this.flash = null, this.log(\"join\", function () {\n return [\"\", z(n)];\n }), n.title && ie.putTitle(n.title), ne.dropLocal(this.name(), \"consecutive-reloads\"), this.rendered = new ee(this.id, n);\n var i = this.renderContainer(null, \"join\");\n this.dropPendingRefs();\n var r = this.formsForRecovery(i);\n this.joinCount > 1 && r.length > 0 ? r.forEach(function (e, n) {\n t.pushFormRecovery(e, function (e) {\n n === r.length - 1 && t.onJoinComplete(e, i);\n });\n }) : this.onJoinComplete(e, i);\n }\n }, {\n key: \"dropPendingRefs\",\n value: function () {\n ie.all(this.el, \"[\".concat(M, \"]\"), function (e) {\n return e.removeAttribute(M);\n });\n }\n }, {\n key: \"onJoinComplete\",\n value: function (e, t) {\n var n = this,\n i = e.live_patch;\n if (this.joinCount > 1 || this.parent && !this.parent.isJoinPending()) return this.applyJoinPatch(i, t);\n 0 === ie.findPhxChildrenInFragment(t, this.id).filter(function (e) {\n return n.joinChild(e);\n }).length ? this.parent ? (this.root.pendingJoinOps.push([this, function () {\n return n.applyJoinPatch(i, t);\n }]), this.parent.ackJoin(this)) : (this.onAllChildJoinsComplete(), this.applyJoinPatch(i, t)) : this.root.pendingJoinOps.push([this, function () {\n return n.applyJoinPatch(i, t);\n }]);\n }\n }, {\n key: \"attachTrueDocEl\",\n value: function () {\n this.el = ie.byId(this.id), this.el.setAttribute(\"data-phx-root-id\", this.root.id);\n }\n }, {\n key: \"applyJoinPatch\",\n value: function (e, t) {\n var n = this;\n this.attachTrueDocEl();\n var i = new re(this, this.el, this.id, t, null);\n\n if (i.markPrunableContentForRemoval(), this.joinPending = !1, this.performPatch(i), this.joinNewChildren(), ie.all(this.el, \"[\".concat(this.binding(\"hook\"), \"]\"), function (e) {\n var t = n.addHook(e);\n t && t.__trigger__(\"mounted\");\n }), this.applyPendingUpdates(), e) {\n var r = e.kind,\n o = e.to;\n this.liveSocket.historyPatch(o, r);\n }\n\n this.hideLoader(), this.joinCount > 1 && this.triggerReconnected(), this.stopCallback();\n }\n }, {\n key: \"performPatch\",\n value: function (e) {\n var t = this,\n n = [],\n i = !1,\n r = new Set();\n return e.after(\"added\", function (e) {\n var n = t.addHook(e);\n n && n.__trigger__(\"mounted\");\n }), e.after(\"phxChildAdded\", function (e) {\n return i = !0;\n }), e.before(\"updated\", function (e, n) {\n t.liveSocket.triggerDOM(\"onBeforeElUpdated\", [e, n]);\n var i = t.getHook(e),\n o = i && \"ignore\" === e.getAttribute(t.binding(\"update\"));\n !i || e.isEqualNode(n) || o && function (e, t) {\n return JSON.stringify(e) === JSON.stringify(t);\n }(e.dataset, n.dataset) || (r.add(e.id), i.__trigger__(\"beforeUpdate\"));\n }), e.after(\"updated\", function (e) {\n var n = t.getHook(e);\n n && r.has(e.id) && n.__trigger__(\"updated\");\n }), e.before(\"discarded\", function (e) {\n var n = t.getHook(e);\n n && n.__trigger__(\"beforeDestroy\");\n }), e.after(\"discarded\", function (e) {\n var i = t.componentID(e);\n \"number\" == typeof i && -1 === n.indexOf(i) && n.push(i);\n var r = t.getHook(e);\n r && t.destroyHook(r);\n }), e.perform(), this.maybePushComponentsDestroyed(n), i;\n }\n }, {\n key: \"joinNewChildren\",\n value: function () {\n var e = this;\n ie.findPhxChildren(this.el, this.id).forEach(function (t) {\n return e.joinChild(t);\n });\n }\n }, {\n key: \"getChildById\",\n value: function (e) {\n return this.root.children[this.id][e];\n }\n }, {\n key: \"getDescendentByEl\",\n value: function (e) {\n return e.id === this.id ? this : this.children[e.getAttribute(\"data-phx-parent-id\")][e.id];\n }\n }, {\n key: \"destroyDescendent\",\n value: function (e) {\n for (var t in this.root.children) for (var n in this.root.children[t]) if (n === e) return this.root.children[t][n].destroy();\n }\n }, {\n key: \"joinChild\",\n value: function (t) {\n if (!this.getChildById(t.id)) {\n var n = new e(t, this.liveSocket, this);\n return this.root.children[this.id][n.id] = n, n.join(), this.childJoins++, !0;\n }\n }\n }, {\n key: \"isJoinPending\",\n value: function () {\n return this.joinPending;\n }\n }, {\n key: \"ackJoin\",\n value: function (e) {\n this.childJoins--, 0 === this.childJoins && (this.parent ? this.parent.ackJoin(this) : this.onAllChildJoinsComplete());\n }\n }, {\n key: \"onAllChildJoinsComplete\",\n value: function () {\n this.joinCallback(), this.pendingJoinOps.forEach(function (e) {\n var t = L(e, 2),\n n = t[0],\n i = t[1];\n n.isDestroyed() || i();\n }), this.pendingJoinOps = [];\n }\n }, {\n key: \"update\",\n value: function (e, t, n) {\n var i = this;\n\n if (!Y(e) || null !== n) {\n if (e.title && ie.putTitle(e.title), this.isJoinPending() || this.liveSocket.hasPendingLink()) return this.pendingDiffs.push({\n diff: e,\n cid: t,\n ref: n\n });\n this.log(\"update\", function () {\n return [\"\", z(e)];\n }), this.rendered.mergeDiff(e);\n var r = !1;\n \"number\" == typeof t ? this.liveSocket.time(\"component ack patch complete\", function () {\n i.componentPatch(e.c[t], t, n) && (r = !0);\n }) : this.rendered.isComponentOnlyDiff(e) ? this.liveSocket.time(\"component patch complete\", function () {\n ie.findParentCIDs(i.el, i.rendered.componentCIDs(e)).forEach(function (t) {\n i.componentPatch(e.c[t], t, n) && (r = !0);\n });\n }) : Y(e) || this.liveSocket.time(\"full patch complete\", function () {\n var t = i.renderContainer(e, \"update\"),\n o = new re(i, i.el, i.id, t, null, n);\n r = i.performPatch(o);\n }), ie.undoRefs(n, this.el), r && this.joinNewChildren();\n }\n }\n }, {\n key: \"renderContainer\",\n value: function (e, t) {\n var n = this;\n return this.liveSocket.time(\"toString diff (\".concat(t, \")\"), function () {\n var t = n.el.tagName,\n i = e ? n.rendered.componentCIDs(e) : null,\n r = n.rendered.toString(i);\n return \"<\".concat(t, \">\").concat(r, \"</\").concat(t, \">\");\n });\n }\n }, {\n key: \"componentPatch\",\n value: function (e, t, n) {\n if (Y(e)) return !1;\n var i = this.rendered.componentToString(t),\n r = new re(this, this.el, this.id, i, t, n);\n return this.performPatch(r);\n }\n }, {\n key: \"getHook\",\n value: function (e) {\n return this.viewHooks[ue.elementID(e)];\n }\n }, {\n key: \"addHook\",\n value: function (e) {\n if (!ue.elementID(e) && e.getAttribute) {\n var t = e.getAttribute(this.binding(\"hook\"));\n\n if (!t || this.ownsElement(e)) {\n var n = this.liveSocket.getHookCallbacks(t);\n\n if (n) {\n var i = new ue(this, e, n);\n return this.viewHooks[ue.elementID(i.el)] = i, i;\n }\n\n null !== t && W('unknown hook found for \"'.concat(t, '\"'), e);\n }\n }\n }\n }, {\n key: \"destroyHook\",\n value: function (e) {\n e.__trigger__(\"destroyed\"), delete this.viewHooks[ue.elementID(e.el)];\n }\n }, {\n key: \"applyPendingUpdates\",\n value: function () {\n var e = this;\n this.pendingDiffs.forEach(function (t) {\n var n = t.diff,\n i = t.cid,\n r = t.ref;\n return e.update(n, i, r);\n }), this.pendingDiffs = [];\n }\n }, {\n key: \"onChannel\",\n value: function (e, t) {\n var n = this;\n this.liveSocket.onChannel(this.channel, e, function (e) {\n n.isJoinPending() ? n.root.pendingJoinOps.push([n, function () {\n return t(e);\n }]) : t(e);\n });\n }\n }, {\n key: \"bindChannel\",\n value: function () {\n var e = this;\n this.onChannel(\"diff\", function (t) {\n return e.update(t);\n }), this.onChannel(\"redirect\", function (t) {\n var n = t.to,\n i = t.flash;\n return e.onRedirect({\n to: n,\n flash: i\n });\n }), this.onChannel(\"live_patch\", function (t) {\n return e.onLivePatch(t);\n }), this.onChannel(\"live_redirect\", function (t) {\n return e.onLiveRedirect(t);\n }), this.onChannel(\"session\", function (t) {\n var n = t.token;\n return e.el.setAttribute(\"data-phx-session\", n);\n }), this.channel.onError(function (t) {\n return e.onError(t);\n }), this.channel.onClose(function () {\n return e.onError({\n reason: \"closed\"\n });\n });\n }\n }, {\n key: \"destroyAllChildren\",\n value: function () {\n for (var e in this.root.children[this.id]) this.getChildById(e).destroy();\n }\n }, {\n key: \"onLiveRedirect\",\n value: function (e) {\n var t = e.to,\n n = e.kind,\n i = e.flash,\n r = this.expandURL(t);\n this.liveSocket.historyRedirect(r, n, i);\n }\n }, {\n key: \"onLivePatch\",\n value: function (e) {\n var t = e.to,\n n = e.kind;\n this.href = this.expandURL(t), this.liveSocket.historyPatch(t, n);\n }\n }, {\n key: \"expandURL\",\n value: function (e) {\n return e.startsWith(\"/\") ? \"\".concat(window.location.protocol, \"//\").concat(window.location.host).concat(e) : e;\n }\n }, {\n key: \"onRedirect\",\n value: function (e) {\n var t = e.to,\n n = e.flash;\n this.liveSocket.redirect(t, n);\n }\n }, {\n key: \"isDestroyed\",\n value: function () {\n return this.destroyed;\n }\n }, {\n key: \"join\",\n value: function (e) {\n var t = this;\n this.parent || (this.stopCallback = this.liveSocket.withPageLoading({\n to: this.href,\n kind: \"initial\"\n })), this.joinCallback = function () {\n return e && e(t, t.joinCount);\n }, this.liveSocket.wrapPush(function () {\n return t.channel.join().receive(\"ok\", function (e) {\n return t.onJoin(e);\n }).receive(\"error\", function (e) {\n return t.onJoinError(e);\n }).receive(\"timeout\", function () {\n return t.onJoinError({\n reason: \"timeout\"\n });\n });\n });\n }\n }, {\n key: \"onJoinError\",\n value: function (e) {\n return (e.redirect || e.live_redirect) && (this.joinPending = !1, this.channel.leave()), e.redirect ? this.onRedirect(e.redirect) : e.live_redirect ? this.onLiveRedirect(e.live_redirect) : (this.log(\"error\", function () {\n return [\"unable to join\", e];\n }), this.liveSocket.reloadWithJitter(this));\n }\n }, {\n key: \"onError\",\n value: function (e) {\n if (this.isJoinPending()) return this.liveSocket.reloadWithJitter(this);\n this.destroyAllChildren(), this.log(\"error\", function () {\n return [\"view crashed\", e];\n }), this.liveSocket.onViewError(this), document.activeElement.blur(), this.liveSocket.isUnloaded() ? this.showLoader(200) : this.displayError();\n }\n }, {\n key: \"displayError\",\n value: function () {\n this.isMain() && ie.dispatchEvent(window, \"phx:page-loading-start\", {\n to: this.href,\n kind: \"error\"\n }), this.showLoader(), this.setContainerClasses(\"phx-disconnected\", \"phx-error\");\n }\n }, {\n key: \"pushWithReply\",\n value: function (e, t, n) {\n var i = this,\n r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : function () {},\n o = L(e ? e() : [null, []], 2),\n a = o[0],\n u = L(o[1], 1)[0],\n c = function () {};\n\n return u && null !== u.getAttribute(this.binding(\"page-loading\")) && (c = this.liveSocket.withPageLoading({\n kind: \"element\",\n target: u\n })), \"number\" != typeof n.cid && delete n.cid, this.liveSocket.wrapPush(function () {\n return i.channel.push(t, n, 3e4).receive(\"ok\", function (e) {\n (e.diff || null !== a) && i.update(e.diff || {}, n.cid, a), e.redirect && i.onRedirect(e.redirect), e.live_patch && i.onLivePatch(e.live_patch), e.live_redirect && i.onLiveRedirect(e.live_redirect), c(), r(e);\n });\n });\n }\n }, {\n key: \"putRef\",\n value: function (e, t) {\n var n = this.ref++,\n i = this.binding(\"disable-with\");\n return e.forEach(function (e) {\n e.classList.add(\"phx-\".concat(t, \"-loading\")), e.setAttribute(M, n);\n var r = e.getAttribute(i);\n null !== r && (e.getAttribute(\"data-phx-disable-with-restore\") || e.setAttribute(\"data-phx-disable-with-restore\", e.innerText), e.innerText = r);\n }), [n, e];\n }\n }, {\n key: \"componentID\",\n value: function (e) {\n var t = e.getAttribute && e.getAttribute(H);\n return t ? parseInt(t) : null;\n }\n }, {\n key: \"targetComponentID\",\n value: function (e, t) {\n return e.getAttribute(this.binding(\"target\")) ? this.closestComponentID(t) : null;\n }\n }, {\n key: \"closestComponentID\",\n value: function (e) {\n var t = this;\n return e ? Q(e.closest(\"[\".concat(H, \"]\")), function (e) {\n return t.ownsElement(e) && t.componentID(e);\n }) : null;\n }\n }, {\n key: \"pushHookEvent\",\n value: function (e, t, n) {\n this.pushWithReply(null, \"event\", {\n type: \"hook\",\n event: t,\n value: n,\n cid: this.closestComponentID(e)\n });\n }\n }, {\n key: \"extractMeta\",\n value: function (e, t) {\n for (var n = this.binding(\"value-\"), i = 0; i < e.attributes.length; i++) {\n var r = e.attributes[i].name;\n r.startsWith(n) && (t[r.replace(n, \"\")] = e.getAttribute(r));\n }\n\n return void 0 !== e.value && (t.value = e.value, \"INPUT\" === e.tagName && U.indexOf(e.type) >= 0 && !e.checked && delete t.value), t;\n }\n }, {\n key: \"pushEvent\",\n value: function (e, t, n, i, r) {\n var o = this;\n this.pushWithReply(function () {\n return o.putRef([t], e);\n }, \"event\", {\n type: e,\n event: i,\n value: this.extractMeta(t, r),\n cid: this.targetComponentID(t, n)\n });\n }\n }, {\n key: \"pushKey\",\n value: function (e, t, n, i, r) {\n var o = this;\n this.pushWithReply(function () {\n return o.putRef([e], n);\n }, \"event\", {\n type: n,\n event: i,\n value: this.extractMeta(e, r),\n cid: this.targetComponentID(e, t)\n });\n }\n }, {\n key: \"pushInput\",\n value: function (e, t, n, i, r) {\n var o = this;\n this.pushWithReply(function () {\n return o.putRef([e, e.form], \"change\");\n }, \"event\", {\n type: \"form\",\n event: n,\n value: Z(e.form, {\n _target: i.name\n }),\n cid: this.targetComponentID(e.form, t)\n }, r);\n }\n }, {\n key: \"pushFormSubmit\",\n value: function (e, t, n, i) {\n var r = this,\n o = function (e) {\n return !X(e, \"\".concat(r.binding(\"update\"), \"=ignore\"), e.form);\n };\n\n this.pushWithReply(function () {\n var t = ie.all(e, \"[\".concat(r.binding(\"disable-with\"), \"]\")),\n n = ie.all(e, \"button\").filter(o),\n i = ie.all(e, \"input\").filter(o);\n return n.forEach(function (e) {\n e.setAttribute(\"data-phx-disabled\", e.disabled), e.disabled = !0;\n }), i.forEach(function (e) {\n e.setAttribute(\"data-phx-readonly\", e.readOnly), e.readOnly = !0;\n }), e.setAttribute(r.binding(\"page-loading\"), \"\"), r.putRef([e].concat(t).concat(n).concat(i), \"submit\");\n }, \"event\", {\n type: \"form\",\n event: n,\n value: Z(e),\n cid: this.targetComponentID(e, t)\n }, i);\n }\n }, {\n key: \"pushFormRecovery\",\n value: function (e, t) {\n var n = this;\n this.liveSocket.withinOwners(e, function (i, r) {\n var o = e.elements[0],\n a = e.getAttribute(n.binding(\"auto-recover\")) || e.getAttribute(n.binding(\"change\"));\n i.pushInput(o, r, a, o, t);\n });\n }\n }, {\n key: \"pushLinkPatch\",\n value: function (e, t, n) {\n var i = this;\n this.isLoading() || this.showLoader(this.liveSocket.loaderTimeout);\n var r = this.liveSocket.setPendingLink(e),\n o = t ? function () {\n return i.putRef([t], \"click\");\n } : null;\n this.pushWithReply(o, \"link\", {\n url: e\n }, function (t) {\n t.link_redirect ? i.liveSocket.replaceMain(e, null, n, r) : i.liveSocket.commitPendingLink(r) && (i.href = e, i.applyPendingUpdates(), i.hideLoader(), i.triggerReconnected(), n && n());\n }).receive(\"timeout\", function () {\n return i.liveSocket.redirect(window.location.href);\n });\n }\n }, {\n key: \"formsForRecovery\",\n value: function (e) {\n var t = this,\n n = this.binding(\"change\"),\n i = document.createElement(\"template\");\n return i.innerHTML = e, ie.all(this.el, \"form[\".concat(n, \"]\")).filter(function (e) {\n return t.ownsElement(e);\n }).filter(function (e) {\n return \"ignore\" !== e.getAttribute(t.binding(\"auto-recover\"));\n }).filter(function (e) {\n return i.content.querySelector(\"form[\".concat(n, '=\"').concat(e.getAttribute(n), '\"]'));\n });\n }\n }, {\n key: \"maybePushComponentsDestroyed\",\n value: function (e) {\n var t = this,\n n = e.filter(function (e) {\n return 0 === ie.findComponentNodeList(t.el, e).length;\n });\n n.length > 0 && this.pushWithReply(null, \"cids_destroyed\", {\n cids: n\n }, function () {\n t.rendered.pruneCIDs(n);\n });\n }\n }, {\n key: \"ownsElement\",\n value: function (e) {\n return e.getAttribute(\"data-phx-parent-id\") === this.id || Q(e.closest(B), function (e) {\n return e.id;\n }) === this.id;\n }\n }, {\n key: \"submitForm\",\n value: function (e, t, n) {\n var i = this;\n ie.putPrivate(e, \"phx-has-submitted\", !0), this.liveSocket.blurActiveElement(this), this.pushFormSubmit(e, t, n, function () {\n i.liveSocket.restorePreviouslyActiveFocus();\n });\n }\n }, {\n key: \"binding\",\n value: function (e) {\n return this.liveSocket.binding(e);\n }\n }]), e;\n }(),\n ae = 1,\n ue = function () {\n function e(t, n, i) {\n for (var r in E(this, e), this.__view = t, this.__liveSocket = t.liveSocket, this.__callbacks = i, this.el = n, this.viewName = t.name(), this.el.phxHookId = this.constructor.makeID(), this.__callbacks) this[r] = this.__callbacks[r];\n }\n\n return P(e, null, [{\n key: \"makeID\",\n value: function () {\n return ae++;\n }\n }, {\n key: \"elementID\",\n value: function (e) {\n return e.phxHookId;\n }\n }]), P(e, [{\n key: \"pushEvent\",\n value: function (e) {\n var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};\n\n this.__view.pushHookEvent(null, e, t);\n }\n }, {\n key: \"pushEventTo\",\n value: function (e, t) {\n var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {};\n\n this.__liveSocket.withinTargets(null, e, function (e, i) {\n e.pushHookEvent(i, t, n);\n });\n }\n }, {\n key: \"__trigger__\",\n value: function (e) {\n var t = this.__callbacks[e];\n t && t.call(this);\n }\n }]), e;\n }();\n\n t.default = te;\n }, function (e, t) {\n var n;\n\n n = function () {\n return this;\n }();\n\n try {\n n = n || Function(\"return this\")() || (0, eval)(\"this\");\n } catch (e) {\n \"object\" == typeof window && (n = window);\n }\n\n e.exports = n;\n }, function (e, t, n) {\n (function (t) {\n t.Phoenix || (t.Phoenix = {}), e.exports = t.Phoenix.LiveView = n(0);\n }).call(this, n(1));\n }]);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9wcml2L3N0YXRpYy9waG9lbml4X2xpdmVfdmlldy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L3ByaXYvc3RhdGljL3Bob2VuaXhfbGl2ZV92aWV3LmpzPzJjOTAiXSwic291cmNlc0NvbnRlbnQiOlsiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sdCk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5waG9lbml4X2xpdmVfdmlldz10KCk6ZS5waG9lbml4X2xpdmVfdmlldz10KCl9KHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9e307ZnVuY3Rpb24gbihpKXtpZih0W2ldKXJldHVybiB0W2ldLmV4cG9ydHM7dmFyIHI9dFtpXT17aTppLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGVbaV0uY2FsbChyLmV4cG9ydHMscixyLmV4cG9ydHMsbiksci5sPSEwLHIuZXhwb3J0c31yZXR1cm4gbi5tPWUsbi5jPXQsbi5kPWZ1bmN0aW9uKGUsdCxpKXtuLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsZ2V0Oml9KX0sbi5yPWZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSxuLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIG4uZCh0LFwiYVwiLHQpLHR9LG4ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sbi5wPVwiXCIsbihuLnM9Mil9KFtmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKHQpO3ZhciBpLHI9MTE7dmFyIG89XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIsYT1cInVuZGVmaW5lZFwiPT10eXBlb2YgZG9jdW1lbnQ/dm9pZCAwOmRvY3VtZW50LHU9ISFhJiZcImNvbnRlbnRcImluIGEuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpLGM9ISFhJiZhLmNyZWF0ZVJhbmdlJiZcImNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudFwiaW4gYS5jcmVhdGVSYW5nZSgpO2Z1bmN0aW9uIHMoZSl7cmV0dXJuIGU9ZS50cmltKCksdT9mdW5jdGlvbihlKXt2YXIgdD1hLmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtyZXR1cm4gdC5pbm5lckhUTUw9ZSx0LmNvbnRlbnQuY2hpbGROb2Rlc1swXX0oZSk6Yz9mdW5jdGlvbihlKXtyZXR1cm4gaXx8KGk9YS5jcmVhdGVSYW5nZSgpKS5zZWxlY3ROb2RlKGEuYm9keSksaS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoZSkuY2hpbGROb2Rlc1swXX0oZSk6ZnVuY3Rpb24oZSl7dmFyIHQ9YS5jcmVhdGVFbGVtZW50KFwiYm9keVwiKTtyZXR1cm4gdC5pbm5lckhUTUw9ZSx0LmNoaWxkTm9kZXNbMF19KGUpfWZ1bmN0aW9uIGwoZSx0KXt2YXIgbixpLHI9ZS5ub2RlTmFtZSxvPXQubm9kZU5hbWU7cmV0dXJuIHI9PT1vfHwobj1yLmNoYXJDb2RlQXQoMCksaT1vLmNoYXJDb2RlQXQoMCksbjw9OTAmJmk+PTk3P3I9PT1vLnRvVXBwZXJDYXNlKCk6aTw9OTAmJm4+PTk3JiZvPT09ci50b1VwcGVyQ2FzZSgpKX1mdW5jdGlvbiBkKGUsdCxuKXtlW25dIT09dFtuXSYmKGVbbl09dFtuXSxlW25dP2Uuc2V0QXR0cmlidXRlKG4sXCJcIik6ZS5yZW1vdmVBdHRyaWJ1dGUobikpfXZhciBoPXtPUFRJT046ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnBhcmVudE5vZGU7aWYobil7dmFyIGk9bi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1wiT1BUR1JPVVBcIj09PWkmJihpPShuPW4ucGFyZW50Tm9kZSkmJm4ubm9kZU5hbWUudG9VcHBlckNhc2UoKSksXCJTRUxFQ1RcIiE9PWl8fG4uaGFzQXR0cmlidXRlKFwibXVsdGlwbGVcIil8fChlLmhhc0F0dHJpYnV0ZShcInNlbGVjdGVkXCIpJiYhdC5zZWxlY3RlZCYmKGUuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIixcInNlbGVjdGVkXCIpLGUucmVtb3ZlQXR0cmlidXRlKFwic2VsZWN0ZWRcIikpLG4uc2VsZWN0ZWRJbmRleD0tMSl9ZChlLHQsXCJzZWxlY3RlZFwiKX0sSU5QVVQ6ZnVuY3Rpb24oZSx0KXtkKGUsdCxcImNoZWNrZWRcIiksZChlLHQsXCJkaXNhYmxlZFwiKSxlLnZhbHVlIT09dC52YWx1ZSYmKGUudmFsdWU9dC52YWx1ZSksdC5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKXx8ZS5yZW1vdmVBdHRyaWJ1dGUoXCJ2YWx1ZVwiKX0sVEVYVEFSRUE6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LnZhbHVlO2UudmFsdWUhPT1uJiYoZS52YWx1ZT1uKTt2YXIgaT1lLmZpcnN0Q2hpbGQ7aWYoaSl7dmFyIHI9aS5ub2RlVmFsdWU7aWYocj09bnx8IW4mJnI9PWUucGxhY2Vob2xkZXIpcmV0dXJuO2kubm9kZVZhbHVlPW59fSxTRUxFQ1Q6ZnVuY3Rpb24oZSx0KXtpZighdC5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSl7Zm9yKHZhciBuLGkscj0tMSxvPTAsYT1lLmZpcnN0Q2hpbGQ7YTspaWYoXCJPUFRHUk9VUFwiPT09KGk9YS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKSlhPShuPWEpLmZpcnN0Q2hpbGQ7ZWxzZXtpZihcIk9QVElPTlwiPT09aSl7aWYoYS5oYXNBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiKSl7cj1vO2JyZWFrfW8rK30hKGE9YS5uZXh0U2libGluZykmJm4mJihhPW4ubmV4dFNpYmxpbmcsbj1udWxsKX1lLnNlbGVjdGVkSW5kZXg9cn19fSxmPTEsdj0xMSxwPTMsZz04O2Z1bmN0aW9uIG0oKXt9ZnVuY3Rpb24geShlKXtpZihlKXJldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoXCJpZFwiKXx8ZS5pZH12YXIgYj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuLGkpe2lmKGl8fChpPXt9KSxcInN0cmluZ1wiPT10eXBlb2YgbilpZihcIiNkb2N1bWVudFwiPT09dC5ub2RlTmFtZXx8XCJIVE1MXCI9PT10Lm5vZGVOYW1lfHxcIkJPRFlcIj09PXQubm9kZU5hbWUpe3ZhciByPW47KG49YS5jcmVhdGVFbGVtZW50KFwiaHRtbFwiKSkuaW5uZXJIVE1MPXJ9ZWxzZSBuPXMobik7dmFyIHU9aS5nZXROb2RlS2V5fHx5LGM9aS5vbkJlZm9yZU5vZGVBZGRlZHx8bSxkPWkub25Ob2RlQWRkZWR8fG0sYj1pLm9uQmVmb3JlRWxVcGRhdGVkfHxtLGs9aS5vbkVsVXBkYXRlZHx8bSx3PWkub25CZWZvcmVOb2RlRGlzY2FyZGVkfHxtLHg9aS5vbk5vZGVEaXNjYXJkZWR8fG0sQT1pLm9uQmVmb3JlRWxDaGlsZHJlblVwZGF0ZWR8fG0sQz0hMD09PWkuY2hpbGRyZW5Pbmx5LEU9T2JqZWN0LmNyZWF0ZShudWxsKSxTPVtdO2Z1bmN0aW9uIFAoZSl7Uy5wdXNoKGUpfWZ1bmN0aW9uIEwoZSx0LG4peyExIT09dyhlKSYmKHQmJnQucmVtb3ZlQ2hpbGQoZSkseChlKSxmdW5jdGlvbiBlKHQsbil7aWYodC5ub2RlVHlwZT09PWYpZm9yKHZhciBpPXQuZmlyc3RDaGlsZDtpOyl7dmFyIHI9dm9pZCAwO24mJihyPXUoaSkpP1Aocik6KHgoaSksaS5maXJzdENoaWxkJiZlKGksbikpLGk9aS5uZXh0U2libGluZ319KGUsbikpfWZ1bmN0aW9uIFQoZSl7ZChlKTtmb3IodmFyIHQ9ZS5maXJzdENoaWxkO3Q7KXt2YXIgbj10Lm5leHRTaWJsaW5nLGk9dSh0KTtpZihpKXt2YXIgcj1FW2ldO3ImJmwodCxyKT8odC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChyLHQpLEkocix0KSk6VCh0KX1lbHNlIFQodCk7dD1ufX1mdW5jdGlvbiBJKHQsbixpKXt2YXIgcj11KG4pO2lmKHImJmRlbGV0ZSBFW3JdLCFpKXtpZighMT09PWIodCxuKSlyZXR1cm47aWYoZSh0LG4pLGsodCksITE9PT1BKHQsbikpcmV0dXJufVwiVEVYVEFSRUFcIiE9PXQubm9kZU5hbWU/ZnVuY3Rpb24oZSx0KXt2YXIgbixpLHIsbyxzLGQ9dC5maXJzdENoaWxkLHY9ZS5maXJzdENoaWxkO2U6Zm9yKDtkOyl7Zm9yKG89ZC5uZXh0U2libGluZyxuPXUoZCk7djspe2lmKHI9di5uZXh0U2libGluZyxkLmlzU2FtZU5vZGUmJmQuaXNTYW1lTm9kZSh2KSl7ZD1vLHY9cjtjb250aW51ZSBlfWk9dSh2KTt2YXIgbT12Lm5vZGVUeXBlLHk9dm9pZCAwO2lmKG09PT1kLm5vZGVUeXBlJiYobT09PWY/KG4/biE9PWkmJigocz1FW25dKT9yPT09cz95PSExOihlLmluc2VydEJlZm9yZShzLHYpLGk/UChpKTpMKHYsZSwhMCksdj1zKTp5PSExKTppJiYoeT0hMSksKHk9ITEhPT15JiZsKHYsZCkpJiZJKHYsZCkpOm0hPT1wJiZtIT1nfHwoeT0hMCx2Lm5vZGVWYWx1ZSE9PWQubm9kZVZhbHVlJiYodi5ub2RlVmFsdWU9ZC5ub2RlVmFsdWUpKSkseSl7ZD1vLHY9cjtjb250aW51ZSBlfWk/UChpKTpMKHYsZSwhMCksdj1yfWlmKG4mJihzPUVbbl0pJiZsKHMsZCkpZS5hcHBlbmRDaGlsZChzKSxJKHMsZCk7ZWxzZXt2YXIgYj1jKGQpOyExIT09YiYmKGImJihkPWIpLGQuYWN0dWFsaXplJiYoZD1kLmFjdHVhbGl6ZShlLm93bmVyRG9jdW1lbnR8fGEpKSxlLmFwcGVuZENoaWxkKGQpLFQoZCkpfWQ9byx2PXJ9IWZ1bmN0aW9uKGUsdCxuKXtmb3IoO3Q7KXt2YXIgaT10Lm5leHRTaWJsaW5nOyhuPXUodCkpP1Aobik6TCh0LGUsITApLHQ9aX19KGUsdixpKTt2YXIgaz1oW2Uubm9kZU5hbWVdO2smJmsoZSx0KX0odCxuKTpoLlRFWFRBUkVBKHQsbil9IWZ1bmN0aW9uIGUodCl7aWYodC5ub2RlVHlwZT09PWZ8fHQubm9kZVR5cGU9PT12KWZvcih2YXIgbj10LmZpcnN0Q2hpbGQ7bjspe3ZhciBpPXUobik7aSYmKEVbaV09biksZShuKSxuPW4ubmV4dFNpYmxpbmd9fSh0KTt2YXIgTj10LEQ9Ti5ub2RlVHlwZSxPPW4ubm9kZVR5cGU7aWYoIUMpaWYoRD09PWYpTz09PWY/bCh0LG4pfHwoeCh0KSxOPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUuZmlyc3RDaGlsZDtuOyl7dmFyIGk9bi5uZXh0U2libGluZzt0LmFwcGVuZENoaWxkKG4pLG49aX1yZXR1cm4gdH0odCxmdW5jdGlvbihlLHQpe3JldHVybiB0JiZ0IT09bz9hLmNyZWF0ZUVsZW1lbnROUyh0LGUpOmEuY3JlYXRlRWxlbWVudChlKX0obi5ub2RlTmFtZSxuLm5hbWVzcGFjZVVSSSkpKTpOPW47ZWxzZSBpZihEPT09cHx8RD09PWcpe2lmKE89PT1EKXJldHVybiBOLm5vZGVWYWx1ZSE9PW4ubm9kZVZhbHVlJiYoTi5ub2RlVmFsdWU9bi5ub2RlVmFsdWUpLE47Tj1ufWlmKE49PT1uKXgodCk7ZWxzZXtpZihuLmlzU2FtZU5vZGUmJm4uaXNTYW1lTm9kZShOKSlyZXR1cm47aWYoSShOLG4sQyksUylmb3IodmFyIFI9MCxfPVMubGVuZ3RoO1I8XztSKyspe3ZhciBqPUVbU1tSXV07aiYmTChqLGoucGFyZW50Tm9kZSwhMSl9fXJldHVybiFDJiZOIT09dCYmdC5wYXJlbnROb2RlJiYoTi5hY3R1YWxpemUmJihOPU4uYWN0dWFsaXplKHQub3duZXJEb2N1bWVudHx8YSkpLHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoTix0KSksTn19KGZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLGEsdT10LmF0dHJpYnV0ZXM7aWYodC5ub2RlVHlwZSE9PXImJmUubm9kZVR5cGUhPT1yKXtmb3IodmFyIGM9dS5sZW5ndGgtMTtjPj0wO2MtLSlpPShuPXVbY10pLm5hbWUsbz1uLm5hbWVzcGFjZVVSSSxhPW4udmFsdWUsbz8oaT1uLmxvY2FsTmFtZXx8aSxlLmdldEF0dHJpYnV0ZU5TKG8saSkhPT1hJiYoXCJ4bWxuc1wiPT09bi5wcmVmaXgmJihpPW4ubmFtZSksZS5zZXRBdHRyaWJ1dGVOUyhvLGksYSkpKTplLmdldEF0dHJpYnV0ZShpKSE9PWEmJmUuc2V0QXR0cmlidXRlKGksYSk7Zm9yKHZhciBzPWUuYXR0cmlidXRlcyxsPXMubGVuZ3RoLTE7bD49MDtsLS0paT0obj1zW2xdKS5uYW1lLChvPW4ubmFtZXNwYWNlVVJJKT8oaT1uLmxvY2FsTmFtZXx8aSx0Lmhhc0F0dHJpYnV0ZU5TKG8saSl8fGUucmVtb3ZlQXR0cmlidXRlTlMobyxpKSk6dC5oYXNBdHRyaWJ1dGUoaSl8fGUucmVtb3ZlQXR0cmlidXRlKGkpfX0pO2Z1bmN0aW9uIGsoZSl7cmV0dXJuIEkoZSl8fEMoZSl8fE4oZSl8fFQoKX1mdW5jdGlvbiB3KGUsdCl7dmFyIG49T2JqZWN0LmtleXMoZSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTt0JiYoaT1pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4saSl9cmV0dXJuIG59ZnVuY3Rpb24geChlLHQsbil7cmV0dXJuIHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9ZnVuY3Rpb24gQShlKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gRChlKX0oZSl8fEMoZSl8fE4oZSl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gQyhlKXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKXJldHVybiBBcnJheS5mcm9tKGUpfWZ1bmN0aW9uIEUoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIFMoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dFtuXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBpJiYoaS53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaS5rZXksaSl9fWZ1bmN0aW9uIFAoZSx0LG4pe3JldHVybiB0JiZTKGUucHJvdG90eXBlLHQpLG4mJlMoZSxuKSxlfWZ1bmN0aW9uIEwoZSx0KXtyZXR1cm4gSShlKXx8ZnVuY3Rpb24oZSx0KXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKXJldHVybjt2YXIgbj1bXSxpPSEwLHI9ITEsbz12b2lkIDA7dHJ5e2Zvcih2YXIgYSx1PWVbU3ltYm9sLml0ZXJhdG9yXSgpOyEoaT0oYT11Lm5leHQoKSkuZG9uZSkmJihuLnB1c2goYS52YWx1ZSksIXR8fG4ubGVuZ3RoIT09dCk7aT0hMCk7fWNhdGNoKGUpe3I9ITAsbz1lfWZpbmFsbHl7dHJ5e2l8fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYocil0aHJvdyBvfX1yZXR1cm4gbn0oZSx0KXx8TihlLHQpfHxUKCl9ZnVuY3Rpb24gVCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9ZnVuY3Rpb24gSShlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfWZ1bmN0aW9uIE4oZSx0KXtpZihlKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZSlyZXR1cm4gRChlLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm5cIk9iamVjdFwiPT09biYmZS5jb25zdHJ1Y3RvciYmKG49ZS5jb25zdHJ1Y3Rvci5uYW1lKSxcIk1hcFwiPT09bnx8XCJTZXRcIj09PW4/QXJyYXkuZnJvbShlKTpcIkFyZ3VtZW50c1wiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/RChlLHQpOnZvaWQgMH19ZnVuY3Rpb24gRChlLHQpeyhudWxsPT10fHx0PmUubGVuZ3RoKSYmKHQ9ZS5sZW5ndGgpO2Zvcih2YXIgbj0wLGk9bmV3IEFycmF5KHQpO248dDtuKyspaVtuXT1lW25dO3JldHVybiBpfWZ1bmN0aW9uIE8oZSl7XCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO3JldHVybihPPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIGV9KShlKX1uLmQodCxcImRlYnVnXCIsZnVuY3Rpb24oKXtyZXR1cm4gS30pLG4uZCh0LFwiUmVuZGVyZWRcIixmdW5jdGlvbigpe3JldHVybiBlZX0pLG4uZCh0LFwiTGl2ZVNvY2tldFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHRlfSksbi5kKHQsXCJCcm93c2VyXCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV9KSxuLmQodCxcIkRPTVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGllfSksbi5kKHQsXCJWaWV3XCIsZnVuY3Rpb24oKXtyZXR1cm4gb2V9KTt2YXIgUj1bMWUzLDNlM10sXz1cImRhdGEtcGh4LXZpZXdcIixqPVtcInBoeC1jbGljay1sb2FkaW5nXCIsXCJwaHgtY2hhbmdlLWxvYWRpbmdcIixcInBoeC1zdWJtaXQtbG9hZGluZ1wiLFwicGh4LWtleWRvd24tbG9hZGluZ1wiLFwicGh4LWtleXVwLWxvYWRpbmdcIixcInBoeC1ibHVyLWxvYWRpbmdcIixcInBoeC1mb2N1cy1sb2FkaW5nXCJdLEg9XCJkYXRhLXBoeC1jb21wb25lbnRcIixNPVwiZGF0YS1waHgtcmVmXCIsQj1cIltcIi5jb25jYXQoXyxcIl1cIiksSj1bXCJ0ZXh0XCIsXCJ0ZXh0YXJlYVwiLFwibnVtYmVyXCIsXCJlbWFpbFwiLFwicGFzc3dvcmRcIixcInNlYXJjaFwiLFwidGVsXCIsXCJ1cmxcIixcImRhdGVcIixcInRpbWVcIl0sVT1bXCJjaGVja2JveFwiLFwicmFkaW9cIl0sRj0xLFY9XCJwaHgtXCIscT17ZGVib3VuY2U6MzAwLHRocm90dGxlOjMwMH0sVz1mdW5jdGlvbihlLHQpe3JldHVybiBjb25zb2xlLmVycm9yJiZjb25zb2xlLmVycm9yKGUsdCl9O3ZhciBLPWZ1bmN0aW9uKGUsdCxuLGkpe2UubGl2ZVNvY2tldC5pc0RlYnVnRW5hYmxlZCgpJiZjb25zb2xlLmxvZyhcIlwiLmNvbmNhdChlLmlkLFwiIFwiKS5jb25jYXQodCxcIjogXCIpLmNvbmNhdChuLFwiIC0gXCIpLGkpfSwkPWZ1bmN0aW9uKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGU/ZTpmdW5jdGlvbigpe3JldHVybiBlfX0sej1mdW5jdGlvbihlKXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSl9LFg9ZnVuY3Rpb24oZSx0LG4pe2Rve2lmKGUubWF0Y2hlcyhcIltcIi5jb25jYXQodCxcIl1cIikpKXJldHVybiBlO2U9ZS5wYXJlbnRFbGVtZW50fHxlLnBhcmVudE5vZGV9d2hpbGUobnVsbCE9PWUmJjE9PT1lLm5vZGVUeXBlJiYhKG4mJm4uaXNTYW1lTm9kZShlKXx8ZS5tYXRjaGVzKEIpKSk7cmV0dXJuIG51bGx9LEc9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lJiZcIm9iamVjdFwiPT09TyhlKSYmIShlIGluc3RhbmNlb2YgQXJyYXkpfSxZPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBlKXJldHVybiExO3JldHVybiEwfSxRPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJnQoZSl9LFo9ZnVuY3Rpb24oZSl7dmFyIHQsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30saT1uZXcgRm9ybURhdGEoZSkscj1uZXcgVVJMU2VhcmNoUGFyYW1zLG89ZnVuY3Rpb24oZSl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFN5bWJvbHx8bnVsbD09ZVtTeW1ib2wuaXRlcmF0b3JdKXtpZihBcnJheS5pc0FycmF5KGUpfHwoZT1OKGUpKSl7dmFyIHQ9MCxuPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpuLG46ZnVuY3Rpb24oKXtyZXR1cm4gdD49ZS5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOmVbdCsrXX19LGU6ZnVuY3Rpb24oZSl7dGhyb3cgZX0sZjpufX10aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9dmFyIGkscixvPSEwLGE9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtpPWVbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uKCl7dmFyIGU9aS5uZXh0KCk7cmV0dXJuIG89ZS5kb25lLGV9LGU6ZnVuY3Rpb24oZSl7YT0hMCxyPWV9LGY6ZnVuY3Rpb24oKXt0cnl7b3x8bnVsbD09aS5yZXR1cm58fGkucmV0dXJuKCl9ZmluYWxseXtpZihhKXRocm93IHJ9fX19KGkuZW50cmllcygpKTt0cnl7Zm9yKG8ucygpOyEodD1vLm4oKSkuZG9uZTspe3ZhciBhPUwodC52YWx1ZSwyKSx1PWFbMF0sYz1hWzFdO3IuYXBwZW5kKHUsYyl9fWNhdGNoKGUpe28uZShlKX1maW5hbGx5e28uZigpfWZvcih2YXIgcyBpbiBuKXIuYXBwZW5kKHMsbltzXSk7cmV0dXJuIHIudG9TdHJpbmcoKX0sZWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbil7RSh0aGlzLGUpLHRoaXMudmlld0lkPXQsdGhpcy5yZXBsYWNlUmVuZGVyZWQobil9cmV0dXJuIFAoZSxbe2tleTpcInBhcmVudFZpZXdJZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlld0lkfX0se2tleTpcInRvU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVjdXJzaXZlVG9TdHJpbmcodGhpcy5yZW5kZXJlZCx0aGlzLnJlbmRlcmVkLmMsZSl9fSx7a2V5OlwicmVjdXJzaXZlVG9TdHJpbmdcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06ZS5jfHx7fSxuPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLGk9e2J1ZmZlcjpcIlwiLGNvbXBvbmVudHM6dCxvbmx5Q2lkczpuPW4/bmV3IFNldChuKTpudWxsfTtyZXR1cm4gdGhpcy50b091dHB1dEJ1ZmZlcihlLGkpLGkuYnVmZmVyfX0se2tleTpcImNvbXBvbmVudENJRHNcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmtleXMoZS5jfHx7fSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludChlKX0pfX0se2tleTpcImlzQ29tcG9uZW50T25seURpZmZcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4hIWUuYyYmMD09PU9iamVjdC5rZXlzKGUpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm5cInRpdGxlXCIhPT1lJiZcImNcIiE9PWV9KS5sZW5ndGh9fSx7a2V5OlwibWVyZ2VEaWZmXCIsdmFsdWU6ZnVuY3Rpb24oZSl7IWUuYyYmdGhpcy5pc05ld0ZpbmdlcnByaW50KGUpP3RoaXMucmVwbGFjZVJlbmRlcmVkKGUpOih0aGlzLnJlY3Vyc2l2ZU1lcmdlKHRoaXMucmVuZGVyZWQsZSksdGhpcy5leHBhbmRTdGF0aWNzKGUpKX19LHtrZXk6XCJleHBhbmRTdGF0aWNzXCIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoIVkodGhpcy5yZW5kZXJlZC5jKSlmb3IodmFyIHQgaW4gZS5jKXt2YXIgbj1lLmNbdF0ucztpZihcIm51bWJlclwiPT10eXBlb2Ygbil7Zm9yKDtcIm51bWJlclwiPT10eXBlb2Ygbjspbj10aGlzLnJlbmRlcmVkLmNbbl0uczt0aGlzLnJlbmRlcmVkLmNbdF0ucz1ufX19fSx7a2V5OlwicmVjdXJzaXZlTWVyZ2VcIix2YWx1ZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXt2YXIgaT10W25dLHI9ZVtuXTtHKGkpJiZHKHIpPyhyLmQmJiFpLmQmJmRlbGV0ZSByLmQsdGhpcy5yZWN1cnNpdmVNZXJnZShyLGkpKTplW25dPWl9fX0se2tleTpcImNvbXBvbmVudFRvU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcodGhpcy5yZW5kZXJlZC5jLGUpfX0se2tleTpcInBydW5lQ0lEc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBkZWxldGUgdC5yZW5kZXJlZC5jW2VdfSl9fSx7a2V5OlwiZ2V0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlZH19LHtrZXk6XCJyZXBsYWNlUmVuZGVyZWRcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVkPWUsdGhpcy5yZW5kZXJlZC5jPXRoaXMucmVuZGVyZWQuY3x8e30sdGhpcy5leHBhbmRTdGF0aWNzKGUpfX0se2tleTpcImlzTmV3RmluZ2VycHJpbnRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiEhKGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSkuc319LHtrZXk6XCJ0b091dHB1dEJ1ZmZlclwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7aWYoZS5kKXJldHVybiB0aGlzLmNvbXByZWhlbnNpb25Ub0J1ZmZlcihlLHQpO3ZhciBuPWUuczt0LmJ1ZmZlcis9blswXTtmb3IodmFyIGk9MTtpPG4ubGVuZ3RoO2krKyl0aGlzLmR5bmFtaWNUb0J1ZmZlcihlW2ktMV0sdCksdC5idWZmZXIrPW5baV19fSx7a2V5OlwiY29tcHJlaGVuc2lvblRvQnVmZmVyXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49ZS5kLGk9ZS5zLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXTt0LmJ1ZmZlcis9aVswXTtmb3IodmFyIGE9MTthPGkubGVuZ3RoO2ErKyl0aGlzLmR5bmFtaWNUb0J1ZmZlcihvW2EtMV0sdCksdC5idWZmZXIrPWlbYV19fX0se2tleTpcImR5bmFtaWNUb0J1ZmZlclwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7XCJudW1iZXJcIj09dHlwZW9mIGU/dC5idWZmZXIrPXRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcodC5jb21wb25lbnRzLGUsdC5vbmx5Q2lkcyk6RyhlKT90aGlzLnRvT3V0cHV0QnVmZmVyKGUsdCk6dC5idWZmZXIrPWV9fSx7a2V5OlwicmVjdXJzaXZlQ0lEVG9TdHJpbmdcIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcyxyPWVbdF18fFcoXCJubyBjb21wb25lbnQgZm9yIENJRCBcIi5jb25jYXQodCksZSksbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7by5pbm5lckhUTUw9dGhpcy5yZWN1cnNpdmVUb1N0cmluZyhyLGUsbik7dmFyIGE9by5jb250ZW50LHU9biYmIW4uaGFzKHQpO3JldHVybiBBcnJheS5mcm9tKGEuY2hpbGROb2RlcykuZm9yRWFjaChmdW5jdGlvbihlLG4pe2lmKGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSllLnNldEF0dHJpYnV0ZShILHQpLGUuaWR8fChlLmlkPVwiXCIuY29uY2F0KGkucGFyZW50Vmlld0lkKCksXCItXCIpLmNvbmNhdCh0LFwiLVwiKS5jb25jYXQobikpLHUmJihlLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LXNraXBcIixcIlwiKSxlLmlubmVySFRNTD1cIlwiKTtlbHNlIGlmKFwiXCIhPT1lLm5vZGVWYWx1ZS50cmltKCkpe1coXCJvbmx5IEhUTUwgZWxlbWVudCB0YWdzIGFyZSBhbGxvd2VkIGF0IHRoZSByb290IG9mIGNvbXBvbmVudHMuXFxuXFxuXCIrJ2dvdDogXCInLmNvbmNhdChlLm5vZGVWYWx1ZS50cmltKCksJ1wiXFxuXFxuJykrXCJ3aXRoaW46XFxuXCIsby5pbm5lckhUTUwudHJpbSgpKTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtyLmlubmVyVGV4dD1lLm5vZGVWYWx1ZSxyLnNldEF0dHJpYnV0ZShILHQpLGUucmVwbGFjZVdpdGgocil9ZWxzZSBlLnJlbW92ZSgpfSksby5pbm5lckhUTUx9fV0pLGV9KCksdGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbil7dmFyIGk9dGhpcyxyPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fTtpZihFKHRoaXMsZSksdGhpcy51bmxvYWRlZD0hMSwhbnx8XCJPYmplY3RcIj09PW4uY29uc3RydWN0b3IubmFtZSl0aHJvdyBuZXcgRXJyb3IoJ1xcbiAgICAgIGEgcGhvZW5peCBTb2NrZXQgbXVzdCBiZSBwcm92aWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBMaXZlU29ja2V0IGNvbnN0cnVjdG9yLiBGb3IgZXhhbXBsZTpcXG5cXG4gICAgICAgICAgaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCJcXG4gICAgICAgICAgaW1wb3J0IHtMaXZlU29ja2V0fSBmcm9tIFwicGhvZW5peF9saXZlX3ZpZXdcIlxcbiAgICAgICAgICBsZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7Li4ufSlcXG4gICAgICAnKTt0aGlzLnNvY2tldD1uZXcgbih0LHIpLHRoaXMuYmluZGluZ1ByZWZpeD1yLmJpbmRpbmdQcmVmaXh8fFYsdGhpcy5vcHRzPXIsdGhpcy5wYXJhbXM9JChyLnBhcmFtc3x8e30pLHRoaXMudmlld0xvZ2dlcj1yLnZpZXdMb2dnZXIsdGhpcy5tZXRhZGF0YUNhbGxiYWNrcz1yLm1ldGFkYXRhfHx7fSx0aGlzLmRlZmF1bHRzPU9iamVjdC5hc3NpZ24oeihxKSxyLmRlZmF1bHRzfHx7fSksdGhpcy5hY3RpdmVFbGVtZW50PW51bGwsdGhpcy5wcmV2QWN0aXZlPW51bGwsdGhpcy5zaWxlbmNlZD0hMSx0aGlzLm1haW49bnVsbCx0aGlzLmxpbmtSZWY9MCx0aGlzLnJvb3RzPXt9LHRoaXMuaHJlZj13aW5kb3cubG9jYXRpb24uaHJlZix0aGlzLnBlbmRpbmdMaW5rPW51bGwsdGhpcy5jdXJyZW50TG9jYXRpb249eih3aW5kb3cubG9jYXRpb24pLHRoaXMuaG9va3M9ci5ob29rc3x8e30sdGhpcy5sb2FkZXJUaW1lb3V0PXIubG9hZGVyVGltZW91dHx8Rix0aGlzLmJvdW5kVG9wTGV2ZWxFdmVudHM9ITEsdGhpcy5kb21DYWxsYmFja3M9ci5kb218fHtvbkJlZm9yZUVsVXBkYXRlZDokKCl9LHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidW5sb2FkXCIsZnVuY3Rpb24oZSl7aS51bmxvYWRlZD0hMH0pLHRoaXMuc29ja2V0Lm9uT3BlbihmdW5jdGlvbigpe2kuaXNVbmxvYWRlZCgpJiZ3aW5kb3cubG9jYXRpb24ucmVsb2FkKCl9KX1yZXR1cm4gUChlLFt7a2V5OlwiaXNQcm9maWxlRW5hYmxlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuXCJ0cnVlXCI9PT1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwicGh4OmxpdmUtc29ja2V0OnByb2ZpbGluZ1wiKX19LHtrZXk6XCJpc0RlYnVnRW5hYmxlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuXCJ0cnVlXCI9PT1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwicGh4OmxpdmUtc29ja2V0OmRlYnVnXCIpfX0se2tleTpcImVuYWJsZURlYnVnXCIsdmFsdWU6ZnVuY3Rpb24oKXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwicGh4OmxpdmUtc29ja2V0OmRlYnVnXCIsXCJ0cnVlXCIpfX0se2tleTpcImVuYWJsZVByb2ZpbGluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInBoeDpsaXZlLXNvY2tldDpwcm9maWxpbmdcIixcInRydWVcIil9fSx7a2V5OlwiZGlzYWJsZURlYnVnXCIsdmFsdWU6ZnVuY3Rpb24oKXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFwicGh4OmxpdmUtc29ja2V0OmRlYnVnXCIpfX0se2tleTpcImRpc2FibGVQcm9maWxpbmdcIix2YWx1ZTpmdW5jdGlvbigpe3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oXCJwaHg6bGl2ZS1zb2NrZXQ6cHJvZmlsaW5nXCIpfX0se2tleTpcImVuYWJsZUxhdGVuY3lTaW1cIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmVuYWJsZURlYnVnKCksY29uc29sZS5sb2coXCJsYXRlbmN5IHNpbXVsYXRvciBlbmFibGVkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBicm93c2VyIHNlc3Npb24uIENhbGwgZGlzYWJsZUxhdGVuY3lTaW0oKSB0byBkaXNhYmxlXCIpLHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJwaHg6bGl2ZS1zb2NrZXQ6bGF0ZW5jeS1zaW1cIixlKX19LHtrZXk6XCJkaXNhYmxlTGF0ZW5jeVNpbVwiLHZhbHVlOmZ1bmN0aW9uKCl7c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShcInBoeDpsaXZlLXNvY2tldDpsYXRlbmN5LXNpbVwiKX19LHtrZXk6XCJnZXRMYXRlbmN5U2ltXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwicGh4OmxpdmUtc29ja2V0OmxhdGVuY3ktc2ltXCIpO3JldHVybiBlP3BhcnNlSW50KGUpOm51bGx9fSx7a2V5OlwiZ2V0U29ja2V0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb2NrZXR9fSx7a2V5OlwiY29ubmVjdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWZ1bmN0aW9uKCl7ZS5qb2luUm9vdFZpZXdzKCkmJihlLmJpbmRUb3BMZXZlbEV2ZW50cygpLGUuc29ja2V0LmNvbm5lY3QoKSl9O1tcImNvbXBsZXRlXCIsXCJsb2FkZWRcIixcImludGVyYWN0aXZlXCJdLmluZGV4T2YoZG9jdW1lbnQucmVhZHlTdGF0ZSk+PTA/dCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsZnVuY3Rpb24oKXtyZXR1cm4gdCgpfSl9fSx7a2V5OlwiZGlzY29ubmVjdFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuc29ja2V0LmRpc2Nvbm5lY3QoZSl9fSx7a2V5OlwidHJpZ2dlckRPTVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG47KG49dGhpcy5kb21DYWxsYmFja3MpW2VdLmFwcGx5KG4sQSh0KSl9fSx7a2V5OlwidGltZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuaXNQcm9maWxlRW5hYmxlZCgpfHwhY29uc29sZS50aW1lKXJldHVybiB0KCk7Y29uc29sZS50aW1lKGUpO3ZhciBuPXQoKTtyZXR1cm4gY29uc29sZS50aW1lRW5kKGUpLG59fSx7a2V5OlwibG9nXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMudmlld0xvZ2dlcil7dmFyIGk9TChuKCksMikscj1pWzBdLG89aVsxXTt0aGlzLnZpZXdMb2dnZXIoZSx0LHIsbyl9ZWxzZSBpZih0aGlzLmlzRGVidWdFbmFibGVkKCkpe3ZhciBhPUwobigpLDIpLHU9YVswXSxjPWFbMV07SyhlLHQsdSxjKX19fSx7a2V5Olwib25DaGFubmVsXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXM7ZS5vbih0LGZ1bmN0aW9uKGUpe3ZhciB0PWkuZ2V0TGF0ZW5jeVNpbSgpO3Q/KGNvbnNvbGUubG9nKFwic2ltdWxhdGluZyBcIi5jb25jYXQodCxcIm1zIG9mIGxhdGVuY3kgZnJvbSBzZXJ2ZXIgdG8gY2xpZW50XCIpKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIG4oZSl9LHQpKTpuKGUpfSl9fSx7a2V5Olwid3JhcFB1c2hcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldExhdGVuY3lTaW0oKTtpZighdClyZXR1cm4gZSgpO2NvbnNvbGUubG9nKFwic2ltdWxhdGluZyBcIi5jb25jYXQodCxcIm1zIG9mIGxhdGVuY3kgZnJvbSBjbGllbnQgdG8gc2VydmVyXCIpKTt2YXIgbj17cmVjZWl2ZXM6W10scmVjZWl2ZTpmdW5jdGlvbihlLHQpe3RoaXMucmVjZWl2ZXMucHVzaChbZSx0XSl9fTtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe24ucmVjZWl2ZXMucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49TCh0LDIpLGk9blswXSxyPW5bMV07cmV0dXJuIGUucmVjZWl2ZShpLHIpfSxlKCkpfSx0KSxufX0se2tleTpcInJlbG9hZFdpdGhKaXR0ZXJcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuZGlzY29ubmVjdCgpO3ZhciBuPVJbMF0saT1SWzFdLHI9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihpLW4rMSkpK24sbz1uZS51cGRhdGVMb2NhbChlLm5hbWUoKSxcImNvbnNlY3V0aXZlLXJlbG9hZHNcIiwwLGZ1bmN0aW9uKGUpe3JldHVybiBlKzF9KTt0aGlzLmxvZyhlLFwiam9pblwiLGZ1bmN0aW9uKCl7cmV0dXJuW1wiZW5jb3VudGVyZWQgXCIuY29uY2F0KG8sXCIgY29uc2VjdXRpdmUgcmVsb2Fkc1wiKV19KSxvPjEwJiYodGhpcy5sb2coZSxcImpvaW5cIixmdW5jdGlvbigpe3JldHVybltcImV4Y2VlZGVkIFwiLmNvbmNhdCgxMCxcIiBjb25zZWN1dGl2ZSByZWxvYWRzLiBFbnRlcmluZyBmYWlsc2FmZSBtb2RlXCIpXX0pLHI9M2U0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5oYXNQZW5kaW5nTGluaygpP3dpbmRvdy5sb2NhdGlvbj10LnBlbmRpbmdMaW5rOndpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKX0scil9fSx7a2V5OlwiZ2V0SG9va0NhbGxiYWNrc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmhvb2tzW2VdfX0se2tleTpcImlzVW5sb2FkZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVubG9hZGVkfX0se2tleTpcImlzQ29ubmVjdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKX19LHtrZXk6XCJnZXRCaW5kaW5nUHJlZml4XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iaW5kaW5nUHJlZml4fX0se2tleTpcImJpbmRpbmdcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm5cIlwiLmNvbmNhdCh0aGlzLmdldEJpbmRpbmdQcmVmaXgoKSkuY29uY2F0KGUpfX0se2tleTpcImNoYW5uZWxcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnNvY2tldC5jaGFubmVsKGUsdCl9fSx7a2V5Olwiam9pblJvb3RWaWV3c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PSExO3JldHVybiBpZS5hbGwoZG9jdW1lbnQsXCJcIi5jb25jYXQoQixcIjpub3QoW1wiKS5jb25jYXQoXCJkYXRhLXBoeC1wYXJlbnQtaWRcIixcIl0pXCIpLGZ1bmN0aW9uKG4pe3ZhciBpPWUuam9pblJvb3RWaWV3KG4sZS5nZXRIcmVmKCkpO2Uucm9vdD1lLnJvb3R8fGksbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1tYWluXCIpJiYoZS5tYWluPWkpLHQ9ITB9KSx0fX0se2tleTpcInJlZGlyZWN0XCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt0aGlzLmRpc2Nvbm5lY3QoKSxuZS5yZWRpcmVjdChlLHQpfX0se2tleTpcInJlcGxhY2VNYWluXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwscj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106dGhpcy5zZXRQZW5kaW5nTGluayhlKSxvPXRoaXMubWFpbi5lbDt0aGlzLm1haW4uc2hvd0xvYWRlcih0aGlzLmxvYWRlclRpbWVvdXQpLHRoaXMubWFpbi5kZXN0cm95KCksbmUuZmV0Y2hQYWdlKGUsZnVuY3Rpb24oYSx1KXtpZigyMDAhPT1hKXJldHVybiBuLnJlZGlyZWN0KGUpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtjLmlubmVySFRNTD11O3ZhciBzPWMuY29udGVudC5jaGlsZE5vZGVzWzBdO2lmKCFzfHwhbi5pc1BoeFZpZXcocykpcmV0dXJuIG4ucmVkaXJlY3QoZSk7bi5qb2luUm9vdFZpZXcocyxlLHQsZnVuY3Rpb24oZSx0KXsxPT09dCYmKG4uY29tbWl0UGVuZGluZ0xpbmsocik/KG8ucmVwbGFjZVdpdGgoZS5lbCksbi5tYWluPWUsaSYmaSgpKTplLmRlc3Ryb3koKSl9KX0pfX0se2tleTpcImlzUGh4Vmlld1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmbnVsbCE9PWUuZ2V0QXR0cmlidXRlKF8pfX0se2tleTpcImpvaW5Sb290Vmlld1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciByPW5ldyBvZShlLHRoaXMsbnVsbCx0LG4pO3JldHVybiB0aGlzLnJvb3RzW3IuaWRdPXIsci5qb2luKGkpLHJ9fSx7a2V5Olwib3duZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMsaT1RKGUuY2xvc2VzdChCKSxmdW5jdGlvbihlKXtyZXR1cm4gbi5nZXRWaWV3QnlFbChlKX0pO2kmJnQoaSl9fSx7a2V5Olwid2l0aGluVGFyZ2V0c1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzO2lmKC9eKDB8WzEtOV0oXFxkPykrKSQvLnRlc3QodCkpe3ZhciByPWV8fGllLmZpbmRGaXJzdENvbXBvbmVudE5vZGUoZG9jdW1lbnQsdCk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKFwibm8gcGh4LXRhcmdldCdzIGZvdW5kIG1hdGNoaW5nIEBteXNlbGYgb2YgXCIuY29uY2F0KHQpKTt0aGlzLm93bmVyKHIsZnVuY3Rpb24oZSl7cmV0dXJuIG4oZSxyKX0pfWVsc2V7dmFyIG89QXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpKTtpZigwPT09by5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwibm8gcGh4LXRhcmdldCdzIGZvdW5kIGZvciBzZWxlY3RvciBcXFwiXCIuY29uY2F0KHQsJ1wiJykpO28uZm9yRWFjaChmdW5jdGlvbihlKXtpLm93bmVyKGUsZnVuY3Rpb24odCl7cmV0dXJuIG4odCxlKX0pfSl9fX0se2tleTpcIndpdGhpbk93bmVyc1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwidGFyZ2V0XCIpKTtudWxsPT09bj90aGlzLm93bmVyKGUsZnVuY3Rpb24obil7cmV0dXJuIHQobixlKX0pOnRoaXMud2l0aGluVGFyZ2V0cyhlLG4sdCl9fSx7a2V5OlwiZ2V0Vmlld0J5RWxcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXJvb3QtaWRcIik7cmV0dXJuIHRoaXMuZ2V0Um9vdEJ5SWQodCkuZ2V0RGVzY2VuZGVudEJ5RWwoZSl9fSx7a2V5OlwiZ2V0Um9vdEJ5SWRcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yb290c1tlXX19LHtrZXk6XCJvblZpZXdFcnJvclwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuZHJvcEFjdGl2ZUVsZW1lbnQoZSl9fSx7a2V5OlwiZGVzdHJveUFsbFZpZXdzXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5yb290cyl0aGlzLnJvb3RzW2VdLmRlc3Ryb3koKSxkZWxldGUgdGhpcy5yb290c1tlXX19LHtrZXk6XCJkZXN0cm95Vmlld0J5RWxcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmdldFJvb3RCeUlkKGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtcm9vdC1pZFwiKSkuZGVzdHJveURlc2NlbmRlbnQoZS5pZCl9fSx7a2V5Olwic2V0QWN0aXZlRWxlbWVudFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYodGhpcy5hY3RpdmVFbGVtZW50IT09ZSl7dGhpcy5hY3RpdmVFbGVtZW50PWU7dmFyIG49ZnVuY3Rpb24oKXtlPT09dC5hY3RpdmVFbGVtZW50JiYodC5hY3RpdmVFbGVtZW50PW51bGwpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIix0KSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLHQpfTtlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsbiksZS5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIixuKX19fSx7a2V5OlwiZ2V0QWN0aXZlRWxlbWVudFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1kb2N1bWVudC5ib2R5JiZ0aGlzLmFjdGl2ZUVsZW1lbnR8fGRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9fSx7a2V5OlwiZHJvcEFjdGl2ZUVsZW1lbnRcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnByZXZBY3RpdmUmJmUub3duc0VsZW1lbnQodGhpcy5wcmV2QWN0aXZlKSYmKHRoaXMucHJldkFjdGl2ZT1udWxsKX19LHtrZXk6XCJyZXN0b3JlUHJldmlvdXNseUFjdGl2ZUZvY3VzXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnByZXZBY3RpdmUmJnRoaXMucHJldkFjdGl2ZSE9PWRvY3VtZW50LmJvZHkmJnRoaXMucHJldkFjdGl2ZS5mb2N1cygpfX0se2tleTpcImJsdXJBY3RpdmVFbGVtZW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnByZXZBY3RpdmU9dGhpcy5nZXRBY3RpdmVFbGVtZW50KCksdGhpcy5wcmV2QWN0aXZlIT09ZG9jdW1lbnQuYm9keSYmdGhpcy5wcmV2QWN0aXZlLmJsdXIoKX19LHtrZXk6XCJiaW5kVG9wTGV2ZWxFdmVudHNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5ib3VuZFRvcExldmVsRXZlbnRzfHwodGhpcy5ib3VuZFRvcExldmVsRXZlbnRzPSEwLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZXNob3dcIixmdW5jdGlvbih0KXt0LnBlcnNpc3RlZCYmKGUud2l0aFBhZ2VMb2FkaW5nKHt0bzp3aW5kb3cubG9jYXRpb24uaHJlZixraW5kOlwicmVkaXJlY3RcIn0pLHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSl9KSx0aGlzLmJpbmRDbGlja3MoKSx0aGlzLmJpbmROYXYoKSx0aGlzLmJpbmRGb3JtcygpLHRoaXMuYmluZCh7a2V5dXA6XCJrZXl1cFwiLGtleWRvd246XCJrZXlkb3duXCJ9LGZ1bmN0aW9uKHQsbixpLHIsbyxhLHUpe3ZhciBjPXIuZ2V0QXR0cmlidXRlKGUuYmluZGluZyhcImtleVwiKSkscz10LmtleSYmdC5rZXkudG9Mb3dlckNhc2UoKTtjJiZjLnRvTG93ZXJDYXNlKCkhPT1zfHxpLnB1c2hLZXkocixvLG4sYSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbdF0/YXJndW1lbnRzW3RdOnt9O3QlMj93KE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbih0KXt4KGUsdCxuW3RdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOncoT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHQpKX0pfXJldHVybiBlfSh7a2V5OnQua2V5fSxlLmV2ZW50TWV0YShuLHQscikpKX0pLHRoaXMuYmluZCh7Ymx1cjpcImZvY3Vzb3V0XCIsZm9jdXM6XCJmb2N1c2luXCJ9LGZ1bmN0aW9uKHQsbixpLHIsbyxhLHUpe3V8fGkucHVzaEV2ZW50KG4scixvLGEsZS5ldmVudE1ldGEobix0LHIpKX0pLHRoaXMuYmluZCh7Ymx1cjpcImJsdXJcIixmb2N1czpcImZvY3VzXCJ9LGZ1bmN0aW9uKHQsbixpLHIsbyxhLHUpe3UmJlwid2luZG93XCIhPT0hdSYmaS5wdXNoRXZlbnQobixyLG8sYSxlLmV2ZW50TWV0YShuLHQscikpfSkpfX0se2tleTpcImV2ZW50TWV0YVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzLm1ldGFkYXRhQ2FsbGJhY2tzW2VdO3JldHVybiBpP2kodCxuKTp7fX19LHtrZXk6XCJzZXRQZW5kaW5nTGlua1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxpbmtSZWYrKyx0aGlzLnBlbmRpbmdMaW5rPWUsdGhpcy5saW5rUmVmfX0se2tleTpcImNvbW1pdFBlbmRpbmdMaW5rXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubGlua1JlZj09PWUmJih0aGlzLmhyZWY9dGhpcy5wZW5kaW5nTGluayx0aGlzLnBlbmRpbmdMaW5rPW51bGwsITApfX0se2tleTpcImdldEhyZWZcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhyZWZ9fSx7a2V5OlwiaGFzUGVuZGluZ0xpbmtcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5wZW5kaW5nTGlua319LHtrZXk6XCJiaW5kXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLGk9ZnVuY3Rpb24oaSl7dmFyIHI9ZVtpXTtuLm9uKHIsZnVuY3Rpb24oZSl7dmFyIHI9bi5iaW5kaW5nKGkpLG89bi5iaW5kaW5nKFwid2luZG93LVwiLmNvbmNhdChpKSksYT1lLnRhcmdldC5nZXRBdHRyaWJ1dGUmJmUudGFyZ2V0LmdldEF0dHJpYnV0ZShyKTthP24uZGVib3VuY2UoZS50YXJnZXQsZSxmdW5jdGlvbigpe24ud2l0aGluT3duZXJzKGUudGFyZ2V0LGZ1bmN0aW9uKG4scil7dChlLGksbixlLnRhcmdldCxyLGEsbnVsbCl9KX0pOmllLmFsbChkb2N1bWVudCxcIltcIi5jb25jYXQobyxcIl1cIiksZnVuY3Rpb24ocil7dmFyIGE9ci5nZXRBdHRyaWJ1dGUobyk7bi5kZWJvdW5jZShyLGUsZnVuY3Rpb24oKXtuLndpdGhpbk93bmVycyhyLGZ1bmN0aW9uKG4sbyl7dChlLGksbixyLG8sYSxcIndpbmRvd1wiKX0pfSl9KX0pfTtmb3IodmFyIHIgaW4gZSlpKHIpfX0se2tleTpcImJpbmRDbGlja3NcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7WyEwLCExXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXQ/ZS5iaW5kaW5nKFwiY2FwdHVyZS1jbGlja1wiKTplLmJpbmRpbmcoXCJjbGlja1wiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsZnVuY3Rpb24oaSl7dmFyIHI9bnVsbCxvPShyPXQ/aS50YXJnZXQubWF0Y2hlcyhcIltcIi5jb25jYXQobixcIl1cIikpP2kudGFyZ2V0OmkudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoXCJbXCIuY29uY2F0KG4sXCJdXCIpKTpYKGkudGFyZ2V0LG4pKSYmci5nZXRBdHRyaWJ1dGUobik7byYmKFwiI1wiPT09ci5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpJiZpLnByZXZlbnREZWZhdWx0KCksZS5kZWJvdW5jZShyLGksZnVuY3Rpb24oKXtlLndpdGhpbk93bmVycyhyLGZ1bmN0aW9uKHQsbil7dC5wdXNoRXZlbnQoXCJjbGlja1wiLHIsbixvLGUuZXZlbnRNZXRhKFwiY2xpY2tcIixpLHIpKX0pfSkpfSx0KX0pfX0se2tleTpcImJpbmROYXZcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7bmUuY2FuUHVzaFN0YXRlKCkmJih3aW5kb3cub25wb3BzdGF0ZT1mdW5jdGlvbih0KXtpZihlLnJlZ2lzdGVyTmV3TG9jYXRpb24od2luZG93LmxvY2F0aW9uKSl7dmFyIG49dC5zdGF0ZXx8e30saT1uLnR5cGUscj1uLmlkLG89bi5yb290LGE9d2luZG93LmxvY2F0aW9uLmhyZWY7ZS5tYWluLmlzQ29ubmVjdGVkKCkmJlwicGF0Y2hcIj09PWkmJnI9PT1lLm1haW4uaWQ/ZS5tYWluLnB1c2hMaW5rUGF0Y2goYSxudWxsKTplLnJlcGxhY2VNYWluKGEsbnVsbCxmdW5jdGlvbigpe28mJmUucmVwbGFjZVJvb3RIaXN0b3J5KCl9KX19LHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIixmdW5jdGlvbih0KXt2YXIgbj1YKHQudGFyZ2V0LFwiZGF0YS1waHgtbGlua1wiKSxpPW4mJm4uZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtbGlua1wiKSxyPXQubWV0YUtleXx8dC5jdHJsS2V5fHwxPT09dC5idXR0b247aWYoaSYmZS5pc0Nvbm5lY3RlZCgpJiZlLm1haW4mJiFyKXt2YXIgbz1uLmhyZWYsYT1uLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LWxpbmstc3RhdGVcIik7aWYodC5wcmV2ZW50RGVmYXVsdCgpLGUucGVuZGluZ0xpbmshPT1vKWlmKFwicGF0Y2hcIj09PWkpZS5wdXNoSGlzdG9yeVBhdGNoKG8sYSxuKTtlbHNle2lmKFwicmVkaXJlY3RcIiE9PWkpdGhyb3cgbmV3IEVycm9yKFwiZXhwZWN0ZWQgXCIuY29uY2F0KFwiZGF0YS1waHgtbGlua1wiLCcgdG8gYmUgXCJwYXRjaFwiIG9yIFwicmVkaXJlY3RcIiwgZ290OiAnKS5jb25jYXQoaSkpO2UuaGlzdG9yeVJlZGlyZWN0KG8sYSl9fX0sITEpKX19LHtrZXk6XCJ3aXRoUGFnZUxvYWRpbmdcIix2YWx1ZTpmdW5jdGlvbihlLHQpe2llLmRpc3BhdGNoRXZlbnQod2luZG93LFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLGUpO3ZhciBuPWZ1bmN0aW9uKCl7cmV0dXJuIGllLmRpc3BhdGNoRXZlbnQod2luZG93LFwicGh4OnBhZ2UtbG9hZGluZy1zdG9wXCIsZSl9O3JldHVybiB0P3Qobik6bn19LHtrZXk6XCJwdXNoSGlzdG9yeVBhdGNoXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXM7dGhpcy53aXRoUGFnZUxvYWRpbmcoe3RvOmUsa2luZDpcInBhdGNoXCJ9LGZ1bmN0aW9uKHIpe2kubWFpbi5wdXNoTGlua1BhdGNoKGUsbixmdW5jdGlvbigpe2kuaGlzdG9yeVBhdGNoKGUsdCkscigpfSl9KX19LHtrZXk6XCJoaXN0b3J5UGF0Y2hcIix2YWx1ZTpmdW5jdGlvbihlLHQpe25lLnB1c2hTdGF0ZSh0LHt0eXBlOlwicGF0Y2hcIixpZDp0aGlzLm1haW4uaWR9LGUpLHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pfX0se2tleTpcImhpc3RvcnlSZWRpcmVjdFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzO3RoaXMud2l0aFBhZ2VMb2FkaW5nKHt0bzplLGtpbmQ6XCJyZWRpcmVjdFwifSxmdW5jdGlvbihyKXtpLnJlcGxhY2VNYWluKGUsbixmdW5jdGlvbigpe25lLnB1c2hTdGF0ZSh0LHt0eXBlOlwicmVkaXJlY3RcIixpZDppLm1haW4uaWR9LGUpLGkucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pLHIoKX0pfSl9fSx7a2V5OlwicmVwbGFjZVJvb3RIaXN0b3J5XCIsdmFsdWU6ZnVuY3Rpb24oKXtuZS5wdXNoU3RhdGUoXCJyZXBsYWNlXCIse3Jvb3Q6ITAsdHlwZTpcInBhdGNoXCIsaWQ6dGhpcy5tYWluLmlkfSl9fSx7a2V5OlwicmVnaXN0ZXJOZXdMb2NhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY3VycmVudExvY2F0aW9uO3JldHVybiB0LnBhdGhuYW1lK3Quc2VhcmNoIT09ZS5wYXRobmFtZStlLnNlYXJjaCYmKHRoaXMuY3VycmVudExvY2F0aW9uPXooZSksITApfX0se2tleTpcImJpbmRGb3Jtc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PTA7dGhpcy5vbihcInN1Ym1pdFwiLGZ1bmN0aW9uKHQpe3ZhciBuPXQudGFyZ2V0LmdldEF0dHJpYnV0ZShlLmJpbmRpbmcoXCJzdWJtaXRcIikpO24mJih0LnByZXZlbnREZWZhdWx0KCksdC50YXJnZXQuZGlzYWJsZWQ9ITAsZS53aXRoaW5Pd25lcnModC50YXJnZXQsZnVuY3Rpb24oZSxpKXtyZXR1cm4gZS5zdWJtaXRGb3JtKHQudGFyZ2V0LGksbil9KSl9LCExKTtmb3IodmFyIG49ZnVuY3Rpb24oKXt2YXIgbj1yW2ldO2Uub24obixmdW5jdGlvbihpKXt2YXIgcj1pLnRhcmdldCxvPXIuZm9ybSYmci5mb3JtLmdldEF0dHJpYnV0ZShlLmJpbmRpbmcoXCJjaGFuZ2VcIikpO2lmKG8mJihcIm51bWJlclwiIT09ci50eXBlfHwhci52YWxpZGl0eXx8IXIudmFsaWRpdHkuYmFkSW5wdXQpKXt2YXIgYT10O3QrKzt2YXIgdT1pZS5wcml2YXRlKHIsXCJwcmV2LWl0ZXJhdGlvblwiKXx8e30sYz11LmF0LHM9dS50eXBlO2M9PT1hLTEmJm4hPT1zfHwoaWUucHV0UHJpdmF0ZShyLFwicHJldi1pdGVyYXRpb25cIix7YXQ6YSx0eXBlOm59KSxlLmRlYm91bmNlKHIsaSxmdW5jdGlvbigpe2Uud2l0aGluT3duZXJzKHIuZm9ybSxmdW5jdGlvbih0LG4pe2llLmlzVGV4dHVhbElucHV0KHIpP2llLnB1dFByaXZhdGUocixcInBoeC1oYXMtZm9jdXNlZFwiLCEwKTplLnNldEFjdGl2ZUVsZW1lbnQociksdC5wdXNoSW5wdXQocixuLG8saS50YXJnZXQpfSl9KSl9fSwhMSl9LGk9MCxyPVtcImNoYW5nZVwiLFwiaW5wdXRcIl07aTxyLmxlbmd0aDtpKyspbigpfX0se2tleTpcImRlYm91bmNlXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXMuYmluZGluZyhcImRlYm91bmNlXCIpLHI9dGhpcy5iaW5kaW5nKFwidGhyb3R0bGVcIiksbz10aGlzLmRlZmF1bHRzLmRlYm91bmNlLnRvU3RyaW5nKCksYT10aGlzLmRlZmF1bHRzLnRocm90dGxlLnRvU3RyaW5nKCk7aWUuZGVib3VuY2UoZSx0LGksbyxyLGEsbil9fSx7a2V5Olwic2lsZW5jZUV2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuc2lsZW5jZWQ9ITAsZSgpLHRoaXMuc2lsZW5jZWQ9ITF9fSx7a2V5Olwib25cIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbihlKXtuLnNpbGVuY2VkfHx0KGUpfSl9fV0pLGV9KCksbmU9e2NhblB1c2hTdGF0ZTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT1oaXN0b3J5LnB1c2hTdGF0ZX0sZHJvcExvY2FsOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsS2V5KGUsdCkpfSx1cGRhdGVMb2NhbDpmdW5jdGlvbihlLHQsbixpKXt2YXIgcj10aGlzLmdldExvY2FsKGUsdCksbz10aGlzLmxvY2FsS2V5KGUsdCksYT1udWxsPT09cj9uOmkocik7cmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShvLEpTT04uc3RyaW5naWZ5KGEpKSxhfSxnZXRMb2NhbDpmdW5jdGlvbihlLHQpe3JldHVybiBKU09OLnBhcnNlKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsS2V5KGUsdCkpKX0sZmV0Y2hQYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IFhNTEh0dHBSZXF1ZXN0O24ub3BlbihcIkdFVFwiLGUsITApLG4udGltZW91dD0zZTQsbi5zZXRSZXF1ZXN0SGVhZGVyKFwiY29udGVudC10eXBlXCIsXCJ0ZXh0L2h0bWxcIiksbi5zZXRSZXF1ZXN0SGVhZGVyKFwiY2FjaGUtY29udHJvbFwiLFwibWF4LWFnZT0wLCBuby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgcG9zdC1jaGVjaz0wLCBwcmUtY2hlY2s9MFwiKSxuLnNldFJlcXVlc3RIZWFkZXIoXCJ4LXJlcXVlc3RlZC13aXRoXCIsXCJsaXZlLWxpbmtcIiksbi5vbmVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIHQoNDAwKX0sbi5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdCg1MDQpfSxuLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKDQ9PT1uLnJlYWR5U3RhdGUpe3ZhciBpPW5ldyBVUkwoZSkscj1pLnBhdGhuYW1lK2kuc2VhcmNoLG89UShuLmdldFJlc3BvbnNlSGVhZGVyKFwieC1yZXNwb25zZS11cmxcIil8fG4ucmVzcG9uc2VVUkwsZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBVUkwoZSl9KSxhPW8/by5wYXRobmFtZStvLnNlYXJjaDpudWxsO3JldHVyblwibGl2ZS1saW5rXCIhPT1uLmdldFJlc3BvbnNlSGVhZGVyKFwieC1yZXF1ZXN0ZWQtd2l0aFwiKT90KDQwMCk6bnVsbD09PW98fGEhPXI/dCgzMDIpOjIwMCE9PW4uc3RhdHVzP3Qobi5zdGF0dXMpOnZvaWQgdCgyMDAsbi5yZXNwb25zZVRleHQpfX0sbi5zZW5kKCl9LHB1c2hTdGF0ZTpmdW5jdGlvbihlLHQsbil7aWYodGhpcy5jYW5QdXNoU3RhdGUoKSl7aWYobiE9PXdpbmRvdy5sb2NhdGlvbi5ocmVmKXtoaXN0b3J5W2UrXCJTdGF0ZVwiXSh0LFwiXCIsbnx8bnVsbCk7dmFyIGk9dGhpcy5nZXRIYXNoVGFyZ2V0RWwod2luZG93LmxvY2F0aW9uLmhhc2gpO2k/aS5zY3JvbGxJbnRvVmlldygpOlwicmVkaXJlY3RcIj09PXQudHlwZSYmd2luZG93LnNjcm9sbCgwLDApfX1lbHNlIHRoaXMucmVkaXJlY3Qobil9LHNldENvb2tpZTpmdW5jdGlvbihlLHQpe2RvY3VtZW50LmNvb2tpZT1cIlwiLmNvbmNhdChlLFwiPVwiKS5jb25jYXQodCl9LGdldENvb2tpZTpmdW5jdGlvbihlKXtyZXR1cm4gZG9jdW1lbnQuY29va2llLnJlcGxhY2UobmV3IFJlZ0V4cChcIig/Oig/Ol58Lio7cyopXCIuY29uY2F0KGUsXCJzKj1zKihbXjtdKikuKiQpfF4uKiRcIikpLFwiJDFcIil9LHJlZGlyZWN0OmZ1bmN0aW9uKGUsdCl7dCYmbmUuc2V0Q29va2llKFwiX19waG9lbml4X2ZsYXNoX19cIix0K1wiOyBtYXgtYWdlPTYwMDAwOyBwYXRoPS9cIiksd2luZG93LmxvY2F0aW9uPWV9LGxvY2FsS2V5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuXCJcIi5jb25jYXQoZSxcIi1cIikuY29uY2F0KHQpfSxnZXRIYXNoVGFyZ2V0RWw6ZnVuY3Rpb24oZSl7aWYoXCJcIiE9PWUudG9TdHJpbmcoKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSl8fGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2FbbmFtZT1cIicuY29uY2F0KGUuc3Vic3RyaW5nKDEpLCdcIl0nKSl9fSxpZT17YnlJZDpmdW5jdGlvbihlKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSl8fFcoXCJubyBpZCBmb3VuZCBmb3IgXCIuY29uY2F0KGUpKX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oZSx0KXtlLmNsYXNzTGlzdC5yZW1vdmUodCksMD09PWUuY2xhc3NMaXN0Lmxlbmd0aCYmZS5yZW1vdmVBdHRyaWJ1dGUoXCJjbGFzc1wiKX0sYWxsOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1BcnJheS5mcm9tKGUucXVlcnlTZWxlY3RvckFsbCh0KSk7cmV0dXJuIG4/aS5mb3JFYWNoKG4pOml9LGZpbmRGaXJzdENvbXBvbmVudE5vZGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5xdWVyeVNlbGVjdG9yKFwiW1wiLmNvbmNhdChILCc9XCInKS5jb25jYXQodCwnXCJdJykpfSxmaW5kQ29tcG9uZW50Tm9kZUxpc3Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hbGwoZSxcIltcIi5jb25jYXQoSCwnPVwiJykuY29uY2F0KHQsJ1wiXScpKX0sZmluZFBoeENoaWxkcmVuSW5GcmFnbWVudDpmdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtyZXR1cm4gbi5pbm5lckhUTUw9ZSx0aGlzLmZpbmRQaHhDaGlsZHJlbihuLmNvbnRlbnQsdCl9LGlzUGh4VXBkYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUmJm4uaW5kZXhPZihlLmdldEF0dHJpYnV0ZSh0KSk+PTB9LGZpbmRQaHhDaGlsZHJlbjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmFsbChlLFwiXCIuY29uY2F0KEIsXCJbXCIpLmNvbmNhdChcImRhdGEtcGh4LXBhcmVudC1pZFwiLCc9XCInKS5jb25jYXQodCwnXCJdJykpfSxmaW5kUGFyZW50Q0lEczpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMsaT1uZXcgU2V0KHQpO3JldHVybiB0LnJlZHVjZShmdW5jdGlvbih0LGkpe3ZhciByPVwiW1wiLmNvbmNhdChILCc9XCInKS5jb25jYXQoaSwnXCJdIFsnKS5jb25jYXQoSCxcIl1cIik7cmV0dXJuIG4uYWxsKGUscikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludChlLmdldEF0dHJpYnV0ZShIKSl9KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiB0LmRlbGV0ZShlKX0pLHR9LGkpfSxwcml2YXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucGh4UHJpdmF0ZSYmZS5waHhQcml2YXRlW3RdfSxkZWxldGVQcml2YXRlOmZ1bmN0aW9uKGUsdCl7ZS5waHhQcml2YXRlJiZkZWxldGUgZS5waHhQcml2YXRlW3RdfSxwdXRQcml2YXRlOmZ1bmN0aW9uKGUsdCxuKXtlLnBoeFByaXZhdGV8fChlLnBoeFByaXZhdGU9e30pLGUucGh4UHJpdmF0ZVt0XT1ufSxjb3B5UHJpdmF0ZXM6ZnVuY3Rpb24oZSx0KXt0LnBoeFByaXZhdGUmJihlLnBoeFByaXZhdGU9eih0LnBoeFByaXZhdGUpKX0scHV0VGl0bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpLmRhdGFzZXQsbj10LnByZWZpeCxpPXQuc3VmZml4O2RvY3VtZW50LnRpdGxlPVwiXCIuY29uY2F0KG58fFwiXCIpLmNvbmNhdChlKS5jb25jYXQoaXx8XCJcIil9LGRlYm91bmNlOmZ1bmN0aW9uKGUsdCxuLGkscixvLGEpe3ZhciB1PXRoaXMsYz1lLmdldEF0dHJpYnV0ZShuKSxzPWUuZ2V0QXR0cmlidXRlKHIpO1wiXCI9PT1jJiYoYz1pKSxcIlwiPT09cyYmKHM9byk7dmFyIGw9Y3x8cztzd2l0Y2gobCl7Y2FzZSBudWxsOnJldHVybiBhKCk7Y2FzZVwiYmx1clwiOnJldHVybiB2b2lkKHRoaXMub25jZShlLFwiZGVib3VuY2UtYmx1clwiKSYmZS5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLGZ1bmN0aW9uKCl7cmV0dXJuIGEoKX0pKTtkZWZhdWx0OnZhciBkPXBhcnNlSW50KGwpLGg9dGhpcy5pbmNDeWNsZShlLFwiZGVib3VuY2UtdHJpZ2dlclwiLGZ1bmN0aW9uKCl7cmV0dXJuIHM/dS5kZWxldGVQcml2YXRlKGUsXCJ0aHJvdHRsZWRcIik6YSgpfSk7aWYoaXNOYU4oZCkpcmV0dXJuIFcoXCJpbnZhbGlkIHRocm90dGxlL2RlYm91bmNlIHZhbHVlOiBcIi5jb25jYXQobCkpO2lmKHMpaWYoXCJrZXlkb3duXCI9PT10LnR5cGUpe3ZhciBmPXRoaXMucHJpdmF0ZShlLFwiZGVib3VuY2UtcHJldi1rZXlcIik7aWYodGhpcy5wdXRQcml2YXRlKGUsXCJkZWJvdW5jZS1wcmV2LWtleVwiLHQud2hpY2gpLGYhPT10LndoaWNoKXJldHVybiBhKCl9ZWxzZXtpZih0aGlzLnByaXZhdGUoZSxcInRocm90dGxlZFwiKSlyZXR1cm4hMTthKCksdGhpcy5wdXRQcml2YXRlKGUsXCJ0aHJvdHRsZWRcIiwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB1LnRyaWdnZXJDeWNsZShlLFwiZGVib3VuY2UtdHJpZ2dlclwiKX0sZCl9ZWxzZSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHUudHJpZ2dlckN5Y2xlKGUsXCJkZWJvdW5jZS10cmlnZ2VyXCIsaCl9LGQpO2UuZm9ybSYmdGhpcy5vbmNlKGUuZm9ybSxcImJpbmQtZGVib3VuY2VcIikmJmUuZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsZnVuY3Rpb24odCl7QXJyYXkuZnJvbShuZXcgRm9ybURhdGEoZS5mb3JtKS5lbnRyaWVzKCksZnVuY3Rpb24odCl7dmFyIG49TCh0LDIpLGk9blswXSxyPShuWzFdLGUuZm9ybS5xdWVyeVNlbGVjdG9yKCdbbmFtZT1cIicuY29uY2F0KGksJ1wiXScpKSk7dS5pbmNDeWNsZShyLFwiZGVib3VuY2UtdHJpZ2dlclwiKSx1LmRlbGV0ZVByaXZhdGUocixcInRocm90dGxlZFwiKX0pfSksdGhpcy5vbmNlKGUsXCJiaW5kLWRlYm91bmNlXCIpJiZlLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsZnVuY3Rpb24odCl7cmV0dXJuIHUudHJpZ2dlckN5Y2xlKGUsXCJkZWJvdW5jZS10cmlnZ2VyXCIpfSl9fSx0cmlnZ2VyQ3ljbGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPUwodGhpcy5wcml2YXRlKGUsdCksMikscj1pWzBdLG89aVsxXTtufHwobj1yKSxuPT09ciYmKHRoaXMuaW5jQ3ljbGUoZSx0KSxvKCkpfSxvbmNlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuITAhPT10aGlzLnByaXZhdGUoZSx0KSYmKHRoaXMucHV0UHJpdmF0ZShlLHQsITApLCEwKX0saW5jQ3ljbGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06ZnVuY3Rpb24oKXt9LGk9TCh0aGlzLnByaXZhdGUoZSx0KXx8WzAsbl0sMikscj1pWzBdO2lbMV07cmV0dXJuIHIrKyx0aGlzLnB1dFByaXZhdGUoZSx0LFtyLG5dKSxyfSxkaXNjYXJkRXJyb3I6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZShuKSxyPWkmJmUucXVlcnlTZWxlY3RvcihcIiNcIi5jb25jYXQoaSkpO3ImJih0aGlzLnByaXZhdGUocixcInBoeC1oYXMtZm9jdXNlZFwiKXx8dGhpcy5wcml2YXRlKHIuZm9ybSxcInBoeC1oYXMtc3VibWl0dGVkXCIpfHx0LmNsYXNzTGlzdC5hZGQoXCJwaHgtbm8tZmVlZGJhY2tcIikpfSxpc1BoeENoaWxkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1wYXJlbnQtaWRcIil9LGRpc3BhdGNoRXZlbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30saT1uZXcgQ3VzdG9tRXZlbnQodCx7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGRldGFpbDpufSk7ZS5kaXNwYXRjaEV2ZW50KGkpfSxjbG9uZU5vZGU6ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10KXJldHVybiBlLmNsb25lTm9kZSghMCk7dmFyIG49ZS5jbG9uZU5vZGUoITEpO3JldHVybiBuLmlubmVySFRNTD10LG59LG1lcmdlQXR0cnM6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOltdLGk9dC5hdHRyaWJ1dGVzLHI9aS5sZW5ndGgtMTtyPj0wO3ItLSl7dmFyIG89aVtyXS5uYW1lO24uaW5kZXhPZihvKTwwJiZlLnNldEF0dHJpYnV0ZShvLHQuZ2V0QXR0cmlidXRlKG8pKX1mb3IodmFyIGE9ZS5hdHRyaWJ1dGVzLHU9YS5sZW5ndGgtMTt1Pj0wO3UtLSl7dmFyIGM9YVt1XS5uYW1lO3QuaGFzQXR0cmlidXRlKGMpfHxlLnJlbW92ZUF0dHJpYnV0ZShjKX19LG1lcmdlRm9jdXNlZElucHV0OmZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50fHxpZS5tZXJnZUF0dHJzKGUsdCxbXCJ2YWx1ZVwiXSksdC5yZWFkT25seT9lLnNldEF0dHJpYnV0ZShcInJlYWRvbmx5XCIsITApOmUucmVtb3ZlQXR0cmlidXRlKFwicmVhZG9ubHlcIil9LHJlc3RvcmVGb2N1czpmdW5jdGlvbihlLHQsbil7aWYoaWUuaXNUZXh0dWFsSW5wdXQoZSkpe3ZhciBpPWUubWF0Y2hlcyhcIjpmb2N1c1wiKTtlLnJlYWRPbmx5JiZlLmJsdXIoKSxpfHxlLmZvY3VzKCksKGUuc2V0U2VsZWN0aW9uUmFuZ2UmJlwidGV4dFwiPT09ZS50eXBlfHxcInRleHRhcmVhXCI9PT1lLnR5cGUpJiZlLnNldFNlbGVjdGlvblJhbmdlKHQsbil9fSxpc0Zvcm1JbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2kudGVzdChlLnRhZ05hbWUpfSxzeW5jQXR0cnNUb1Byb3BzOmZ1bmN0aW9uKGUpe2UgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50JiZVLmluZGV4T2YoZS50eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkpPj0wJiYoZS5jaGVja2VkPW51bGwhPT1lLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIikpfSxpc1RleHR1YWxJbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gSi5pbmRleE9mKGUudHlwZSk+PTB9LGlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbDpmdW5jdGlvbihlLHQpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmbnVsbCE9PWUuZ2V0QXR0cmlidXRlKHQpfSx1bmRvUmVmczpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWUuYWxsKHQsXCJbXCIuY29uY2F0KE0sXCJdXCIpLGZ1bmN0aW9uKHQpe3JldHVybiBuLnN5bmNQZW5kaW5nUmVmKGUsdCx0KX0pfSxzeW5jUGVuZGluZ1JlZjpmdW5jdGlvbihlLHQsbil7dmFyIGk9dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKE0pO2lmKG51bGw9PT1pKXJldHVybiEwO3ZhciByPXBhcnNlSW50KGkpO3JldHVybiBudWxsIT09ZSYmZT49cj8oW3Qsbl0uZm9yRWFjaChmdW5jdGlvbihlKXtlLnJlbW92ZUF0dHJpYnV0ZShNKSxudWxsIT09ZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1yZWFkb25seVwiKSYmKGUucmVhZE9ubHk9ITEsZS5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLXBoeC1yZWFkb25seVwiKSksbnVsbCE9PWUuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtZGlzYWJsZWRcIikmJihlLmRpc2FibGVkPSExLGUucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1waHgtZGlzYWJsZWRcIikpLGouZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gaWUucmVtb3ZlQ2xhc3MoZSx0KX0pO3ZhciB0PWUuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtZGlzYWJsZS13aXRoLXJlc3RvcmVcIik7bnVsbCE9PXQmJihlLmlubmVyVGV4dD10LGUucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1waHgtZGlzYWJsZS13aXRoLXJlc3RvcmVcIikpfSksITApOihqLmZvckVhY2goZnVuY3Rpb24oZSl7dC5jbGFzc0xpc3QuY29udGFpbnMoZSkmJm4uY2xhc3NMaXN0LmFkZChlKX0pLG4uc2V0QXR0cmlidXRlKE0sdC5nZXRBdHRyaWJ1dGUoTSkpLCFpZS5pc0Zvcm1JbnB1dCh0KSYmIS9zdWJtaXQvaS50ZXN0KHQudHlwZSkpfX0scmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbixpLHIsbyxhKXtFKHRoaXMsZSksdGhpcy52aWV3PXQsdGhpcy5saXZlU29ja2V0PXQubGl2ZVNvY2tldCx0aGlzLmNvbnRhaW5lcj1uLHRoaXMuaWQ9aSx0aGlzLnJvb3RJRD10LnJvb3QuaWQsdGhpcy5odG1sPXIsdGhpcy50YXJnZXRDSUQ9byx0aGlzLnJlZj1hLHRoaXMuY2lkUGF0Y2g9XCJudW1iZXJcIj09dHlwZW9mIHRoaXMudGFyZ2V0Q0lELHRoaXMuY2FsbGJhY2tzPXtiZWZvcmVhZGRlZDpbXSxiZWZvcmV1cGRhdGVkOltdLGJlZm9yZWRpc2NhcmRlZDpbXSxiZWZvcmVwaHhDaGlsZEFkZGVkOltdLGFmdGVyYWRkZWQ6W10sYWZ0ZXJ1cGRhdGVkOltdLGFmdGVyZGlzY2FyZGVkOltdLGFmdGVycGh4Q2hpbGRBZGRlZDpbXX19cmV0dXJuIFAoZSxbe2tleTpcImJlZm9yZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dGhpcy5jYWxsYmFja3NbXCJiZWZvcmVcIi5jb25jYXQoZSldLnB1c2godCl9fSx7a2V5OlwiYWZ0ZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMuY2FsbGJhY2tzW1wiYWZ0ZXJcIi5jb25jYXQoZSldLnB1c2godCl9fSx7a2V5OlwidHJhY2tCZWZvcmVcIix2YWx1ZTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheSh0PjE/dC0xOjApLGk9MTtpPHQ7aSsrKW5baS0xXT1hcmd1bWVudHNbaV07dGhpcy5jYWxsYmFja3NbXCJiZWZvcmVcIi5jb25jYXQoZSldLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXBwbHkodm9pZCAwLG4pfSl9fSx7a2V5OlwidHJhY2tBZnRlclwiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQ+MT90LTE6MCksaT0xO2k8dDtpKyspbltpLTFdPWFyZ3VtZW50c1tpXTt0aGlzLmNhbGxiYWNrc1tcImFmdGVyXCIuY29uY2F0KGUpXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGx5KHZvaWQgMCxuKX0pfX0se2tleTpcIm1hcmtQcnVuYWJsZUNvbnRlbnRGb3JSZW1vdmFsXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZS5hbGwodGhpcy5jb250YWluZXIsXCJbcGh4LXVwZGF0ZT1hcHBlbmRdID4gKiwgW3BoeC11cGRhdGU9cHJlcGVuZF0gPiAqXCIsZnVuY3Rpb24oZSl7ZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1yZW1vdmVcIixcIlwiKX0pfX0se2tleTpcInBlcmZvcm1cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnZpZXcsbj10aGlzLmxpdmVTb2NrZXQsaT10aGlzLmNvbnRhaW5lcixyPXRoaXMuaHRtbCxvPXRoaXMuaXNDSURQYXRjaCgpP3RoaXMudGFyZ2V0Q0lEQ29udGFpbmVyKCk6aTtpZighdGhpcy5pc0NJRFBhdGNoKCl8fG8pe3ZhciBhPW4uZ2V0QWN0aXZlRWxlbWVudCgpLHU9YSYmaWUuaXNUZXh0dWFsSW5wdXQoYSk/YTp7fSxjPXUuc2VsZWN0aW9uU3RhcnQscz11LnNlbGVjdGlvbkVuZCxsPW4uYmluZGluZyhcInVwZGF0ZVwiKSxkPW4uYmluZGluZyhcImZlZWRiYWNrLWZvclwiKSxoPW4uYmluZGluZyhcInRyaWdnZXItYWN0aW9uXCIpLGY9W10sdj1bXSxwPVtdLGc9bi50aW1lKFwicHJlbW9ycGggY29udGFpbmVyIHByZXBcIixmdW5jdGlvbigpe3JldHVybiBlLmJ1aWxkRGlmZkhUTUwoaSxyLGwsbyl9KTtyZXR1cm4gdGhpcy50cmFja0JlZm9yZShcImFkZGVkXCIsaSksdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIixpLGkpLG4udGltZShcIm1vcnBoZG9tXCIsZnVuY3Rpb24oKXtiKG8sZyx7Y2hpbGRyZW5Pbmx5Om51bGw9PT1vLmdldEF0dHJpYnV0ZShIKSxvbkJlZm9yZU5vZGVBZGRlZDpmdW5jdGlvbih0KXtyZXR1cm4gaWUuZGlzY2FyZEVycm9yKG8sdCxkKSxlLnRyYWNrQmVmb3JlKFwiYWRkZWRcIix0KSx0fSxvbk5vZGVBZGRlZDpmdW5jdGlvbihuKXtpZS5pc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwobixoKSYmbi5zdWJtaXQoKSxpZS5pc1BoeENoaWxkKG4pJiZ0Lm93bnNFbGVtZW50KG4pJiZlLnRyYWNrQWZ0ZXIoXCJwaHhDaGlsZEFkZGVkXCIsbiksZi5wdXNoKG4pfSxvbk5vZGVEaXNjYXJkZWQ6ZnVuY3Rpb24odCl7ZS50cmFja0FmdGVyKFwiZGlzY2FyZGVkXCIsdCl9LG9uQmVmb3JlTm9kZURpc2NhcmRlZDpmdW5jdGlvbih0KXtyZXR1cm4hKCF0LmdldEF0dHJpYnV0ZXx8bnVsbD09PXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtcmVtb3ZlXCIpKXx8KG51bGw9PT10LnBhcmVudE5vZGV8fCFpZS5pc1BoeFVwZGF0ZSh0LnBhcmVudE5vZGUsbCxbXCJhcHBlbmRcIixcInByZXBlbmRcIl0pKSYmKCFlLnNraXBDSURTaWJsaW5nKHQpJiYoZS50cmFja0JlZm9yZShcImRpc2NhcmRlZFwiLHQpLGllLmlzUGh4Q2hpbGQodCk/KG4uZGVzdHJveVZpZXdCeUVsKHQpLCEwKTp2b2lkIDApKX0sb25FbFVwZGF0ZWQ6ZnVuY3Rpb24oZSl7aWUuaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKGUsaCkmJmUuc3VibWl0KCksdi5wdXNoKGUpfSxvbkJlZm9yZUVsVXBkYXRlZDpmdW5jdGlvbih0LG4pe2lmKGUuc2tpcENJRFNpYmxpbmcobikpcmV0dXJuITE7aWYoXCJpZ25vcmVcIj09PXQuZ2V0QXR0cmlidXRlKGwpKXJldHVybiBlLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLHQsbiksaWUubWVyZ2VBdHRycyh0LG4pLHYucHVzaCh0KSwhMTtpZihcIm51bWJlclwiPT09dC50eXBlJiZ0LnZhbGlkaXR5JiZ0LnZhbGlkaXR5LmJhZElucHV0KXJldHVybiExO2lmKCFpZS5zeW5jUGVuZGluZ1JlZihlLnJlZix0LG4pKXJldHVybiExO2lmKGllLmlzUGh4Q2hpbGQobikpe3ZhciBpPXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtc3RhdGljXCIpO3JldHVybiBpZS5tZXJnZUF0dHJzKHQsbiksdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1zdGF0aWNcIixpKSx0LnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LXJvb3QtaWRcIixlLnJvb3RJRCksITF9aWYoaWUuY29weVByaXZhdGVzKG4sdCksaWUuZGlzY2FyZEVycm9yKG8sbixkKSxhJiZ0LmlzU2FtZU5vZGUoYSkmJmllLmlzRm9ybUlucHV0KHQpJiYhZS5mb3JjZUZvY3VzZWRTZWxlY3RVcGRhdGUodCxuKSlyZXR1cm4gZS50cmFja0JlZm9yZShcInVwZGF0ZWRcIix0LG4pLGllLm1lcmdlRm9jdXNlZElucHV0KHQsbiksaWUuc3luY0F0dHJzVG9Qcm9wcyh0KSx2LnB1c2godCksITE7aWYoaWUuaXNQaHhVcGRhdGUobixsLFtcImFwcGVuZFwiLFwicHJlcGVuZFwiXSkpe3ZhciByPVwiYXBwZW5kXCI9PT1uLmdldEF0dHJpYnV0ZShsKSx1PUFycmF5LmZyb20odC5jaGlsZHJlbikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkfSksYz1BcnJheS5mcm9tKG4uY2hpbGRyZW4pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZH0pO3ImJiFjLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIHUuaW5kZXhPZihlKT49MH0pfHxwLnB1c2goW24uaWQsdV0pfXJldHVybiBpZS5zeW5jQXR0cnNUb1Byb3BzKG4pLGUudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsdCxuKSwhMH19KX0pLG4uaXNEZWJ1Z0VuYWJsZWQoKSYmZnVuY3Rpb24oKXtmb3IodmFyIGU9bmV3IFNldCx0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2lkXVwiKSxuPTAsaT10Lmxlbmd0aDtuPGk7bisrKWUuaGFzKHRbbl0uaWQpP2NvbnNvbGUuZXJyb3IoXCJNdWx0aXBsZSBJRHMgZGV0ZWN0ZWQ6IFwiLmNvbmNhdCh0W25dLmlkLFwiLiBFbnN1cmUgdW5pcXVlIGVsZW1lbnQgaWRzLlwiKSk6ZS5hZGQodFtuXS5pZCl9KCkscC5sZW5ndGg+MCYmbi50aW1lKFwicG9zdC1tb3JwaCBhcHBlbmQvcHJlcGVuZCByZXN0b3JhdGlvblwiLGZ1bmN0aW9uKCl7cC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PUwoZSwyKSxuPXRbMF0saT10WzFdLHI9aWUuYnlJZChuKTtcImFwcGVuZFwiPT09ci5nZXRBdHRyaWJ1dGUobCk/aS5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbihlKXtRKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLGZ1bmN0aW9uKGUpe3JldHVybiByLmluc2VydEJlZm9yZShlLHIuZmlyc3RDaGlsZCl9KX0pOmkuZm9yRWFjaChmdW5jdGlvbihlKXtRKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLGZ1bmN0aW9uKGUpe3JldHVybiByLmFwcGVuZENoaWxkKGUpfSl9KX0pfSksbi5zaWxlbmNlRXZlbnRzKGZ1bmN0aW9uKCl7cmV0dXJuIGllLnJlc3RvcmVGb2N1cyhhLGMscyl9KSxpZS5kaXNwYXRjaEV2ZW50KGRvY3VtZW50LFwicGh4OnVwZGF0ZVwiKSxmLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUudHJhY2tBZnRlcihcImFkZGVkXCIsdCl9KSx2LmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUudHJhY2tBZnRlcihcInVwZGF0ZWRcIix0KX0pLCEwfX19LHtrZXk6XCJmb3JjZUZvY3VzZWRTZWxlY3RVcGRhdGVcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiEwPT09ZS5tdWx0aXBsZXx8ZS5pbm5lckhUTUwhPXQuaW5uZXJIVE1MfX0se2tleTpcImlzQ0lEUGF0Y2hcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNpZFBhdGNofX0se2tleTpcInNraXBDSURTaWJsaW5nXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmbnVsbCE9PWUuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtc2tpcFwiKX19LHtrZXk6XCJ0YXJnZXRDSURDb250YWluZXJcIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNDSURQYXRjaCgpKXt2YXIgZT1rKGllLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmNvbnRhaW5lcix0aGlzLnRhcmdldENJRCkpLHQ9ZVswXTtyZXR1cm4gMD09PWUuc2xpY2UoMSkubGVuZ3RoP3Q6dCYmdC5wYXJlbnROb2RlfX19LHtrZXk6XCJidWlsZERpZmZIVE1MXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIHI9dGhpcyxvPXRoaXMuaXNDSURQYXRjaCgpLGE9byYmaS5nZXRBdHRyaWJ1dGUoSCk9PT10aGlzLnRhcmdldENJRC50b1N0cmluZygpO2lmKCFvfHxhKXJldHVybiB0O3ZhciB1PW51bGwsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7dT1pZS5jbG9uZU5vZGUoaSk7dmFyIHM9ayhpZS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodSx0aGlzLnRhcmdldENJRCkpLGw9c1swXSxkPXMuc2xpY2UoMSk7cmV0dXJuIGMuaW5uZXJIVE1MPXQsZC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlbW92ZSgpfSksQXJyYXkuZnJvbSh1LmNoaWxkTm9kZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pZCYmZS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZlLmdldEF0dHJpYnV0ZShIKSE9PXIudGFyZ2V0Q0lELnRvU3RyaW5nKCkmJihlLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LXNraXBcIixcIlwiKSxlLmlubmVySFRNTD1cIlwiKX0pLEFycmF5LmZyb20oYy5jb250ZW50LmNoaWxkTm9kZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIHUuaW5zZXJ0QmVmb3JlKGUsbCl9KSxsLnJlbW92ZSgpLHUub3V0ZXJIVE1MfX1dKSxlfSgpLG9lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4saSxyLG8pe3ZhciBhPXRoaXM7RSh0aGlzLGUpLHRoaXMubGl2ZVNvY2tldD1uLHRoaXMuZmxhc2g9byx0aGlzLnBhcmVudD1pLHRoaXMucm9vdD1pP2kucm9vdDp0aGlzLHRoaXMuZWw9dCx0aGlzLmlkPXRoaXMuZWwuaWQsdGhpcy52aWV3PXRoaXMuZWwuZ2V0QXR0cmlidXRlKF8pLHRoaXMucmVmPTAsdGhpcy5jaGlsZEpvaW5zPTAsdGhpcy5sb2FkZXJUaW1lcj1udWxsLHRoaXMucGVuZGluZ0RpZmZzPVtdLHRoaXMuaHJlZj1yLHRoaXMuam9pbkNvdW50PXRoaXMucGFyZW50P3RoaXMucGFyZW50LmpvaW5Db3VudC0xOjAsdGhpcy5qb2luUGVuZGluZz0hMCx0aGlzLmRlc3Ryb3llZD0hMSx0aGlzLmpvaW5DYWxsYmFjaz1mdW5jdGlvbigpe30sdGhpcy5zdG9wQ2FsbGJhY2s9ZnVuY3Rpb24oKXt9LHRoaXMucGVuZGluZ0pvaW5PcHM9dGhpcy5wYXJlbnQ/bnVsbDpbXSx0aGlzLnZpZXdIb29rcz17fSx0aGlzLmNoaWxkcmVuPXRoaXMucGFyZW50P251bGw6e30sdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdPXt9LHRoaXMuY2hhbm5lbD10aGlzLmxpdmVTb2NrZXQuY2hhbm5lbChcImx2OlwiLmNvbmNhdCh0aGlzLmlkKSxmdW5jdGlvbigpe3JldHVybnt1cmw6YS5ocmVmLHBhcmFtczphLmNvbm5lY3RQYXJhbXMoKSxzZXNzaW9uOmEuZ2V0U2Vzc2lvbigpLHN0YXRpYzphLmdldFN0YXRpYygpLGZsYXNoOmEuZmxhc2h9fSksdGhpcy5zaG93TG9hZGVyKHRoaXMubGl2ZVNvY2tldC5sb2FkZXJUaW1lb3V0KSx0aGlzLmJpbmRDaGFubmVsKCl9cmV0dXJuIFAoZSxbe2tleTpcImlzTWFpblwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGl2ZVNvY2tldC5tYWluPT09dGhpc319LHtrZXk6XCJjb25uZWN0UGFyYW1zXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxpdmVTb2NrZXQucGFyYW1zKHRoaXMudmlldyksdD1pZS5hbGwoZG9jdW1lbnQsXCJbXCIuY29uY2F0KHRoaXMuYmluZGluZyhcInRyYWNrLXN0YXRpY1wiKSxcIl1cIikpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5zcmN8fGUuaHJlZn0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZX0pO3JldHVybiB0Lmxlbmd0aD4wJiYoZS5fdHJhY2tfc3RhdGljPXQpLGUuX21vdW50cz10aGlzLmpvaW5Db3VudCxlfX0se2tleTpcIm5hbWVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXd9fSx7a2V5OlwiaXNDb25uZWN0ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoYW5uZWwuY2FuUHVzaCgpfX0se2tleTpcImdldFNlc3Npb25cIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXNlc3Npb25cIil9fSx7a2V5OlwiZ2V0U3RhdGljXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXN0YXRpY1wiKTtyZXR1cm5cIlwiPT09ZT9udWxsOmV9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpmdW5jdGlvbigpe307dGhpcy5kZXN0cm95QWxsQ2hpbGRyZW4oKSx0aGlzLmRlc3Ryb3llZD0hMCxkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdLHRoaXMucGFyZW50JiZkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucGFyZW50LmlkXVt0aGlzLmlkXSxjbGVhclRpbWVvdXQodGhpcy5sb2FkZXJUaW1lcik7dmFyIG49ZnVuY3Rpb24oKXtmb3IodmFyIG4gaW4gdCgpLGUudmlld0hvb2tzKWUuZGVzdHJveUhvb2soZS52aWV3SG9va3Nbbl0pfTt0aGlzLmxvZyhcImRlc3Ryb3llZFwiLGZ1bmN0aW9uKCl7cmV0dXJuW1widGhlIGNoaWxkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50XCJdfSksdGhpcy5jaGFubmVsLmxlYXZlKCkucmVjZWl2ZShcIm9rXCIsbikucmVjZWl2ZShcImVycm9yXCIsbikucmVjZWl2ZShcInRpbWVvdXRcIixuKX19LHtrZXk6XCJzZXRDb250YWluZXJDbGFzc2VzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZTt0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXCJwaHgtY29ubmVjdGVkXCIsXCJwaHgtZGlzY29ubmVjdGVkXCIsXCJwaHgtZXJyb3JcIiksKGU9dGhpcy5lbC5jbGFzc0xpc3QpLmFkZC5hcHBseShlLGFyZ3VtZW50cyl9fSx7a2V5OlwiaXNMb2FkaW5nXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtZGlzY29ubmVjdGVkXCIpfX0se2tleTpcInNob3dMb2FkZXJcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKSxlKXRoaXMubG9hZGVyVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB0LnNob3dMb2FkZXIoKX0sZSk7ZWxzZXtmb3IodmFyIG4gaW4gdGhpcy52aWV3SG9va3MpdGhpcy52aWV3SG9va3Nbbl0uX190cmlnZ2VyX18oXCJkaXNjb25uZWN0ZWRcIik7dGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFwicGh4LWRpc2Nvbm5lY3RlZFwiKX19fSx7a2V5OlwiaGlkZUxvYWRlclwiLHZhbHVlOmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMubG9hZGVyVGltZXIpLHRoaXMuc2V0Q29udGFpbmVyQ2xhc3NlcyhcInBoeC1jb25uZWN0ZWRcIil9fSx7a2V5OlwidHJpZ2dlclJlY29ubmVjdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy52aWV3SG9va3MpdGhpcy52aWV3SG9va3NbZV0uX190cmlnZ2VyX18oXCJyZWNvbm5lY3RlZFwiKX19LHtrZXk6XCJsb2dcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMubGl2ZVNvY2tldC5sb2codGhpcyxlLHQpfX0se2tleTpcIm9uSm9pblwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1lLnJlbmRlcmVkO3RoaXMuam9pbkNvdW50KyssdGhpcy5jaGlsZEpvaW5zPTAsdGhpcy5qb2luUGVuZGluZz0hMCx0aGlzLmZsYXNoPW51bGwsdGhpcy5sb2coXCJqb2luXCIsZnVuY3Rpb24oKXtyZXR1cm5bXCJcIix6KG4pXX0pLG4udGl0bGUmJmllLnB1dFRpdGxlKG4udGl0bGUpLG5lLmRyb3BMb2NhbCh0aGlzLm5hbWUoKSxcImNvbnNlY3V0aXZlLXJlbG9hZHNcIiksdGhpcy5yZW5kZXJlZD1uZXcgZWUodGhpcy5pZCxuKTt2YXIgaT10aGlzLnJlbmRlckNvbnRhaW5lcihudWxsLFwiam9pblwiKTt0aGlzLmRyb3BQZW5kaW5nUmVmcygpO3ZhciByPXRoaXMuZm9ybXNGb3JSZWNvdmVyeShpKTt0aGlzLmpvaW5Db3VudD4xJiZyLmxlbmd0aD4wP3IuZm9yRWFjaChmdW5jdGlvbihlLG4pe3QucHVzaEZvcm1SZWNvdmVyeShlLGZ1bmN0aW9uKGUpe249PT1yLmxlbmd0aC0xJiZ0Lm9uSm9pbkNvbXBsZXRlKGUsaSl9KX0pOnRoaXMub25Kb2luQ29tcGxldGUoZSxpKX19LHtrZXk6XCJkcm9wUGVuZGluZ1JlZnNcIix2YWx1ZTpmdW5jdGlvbigpe2llLmFsbCh0aGlzLmVsLFwiW1wiLmNvbmNhdChNLFwiXVwiKSxmdW5jdGlvbihlKXtyZXR1cm4gZS5yZW1vdmVBdHRyaWJ1dGUoTSl9KX19LHtrZXk6XCJvbkpvaW5Db21wbGV0ZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxpPWUubGl2ZV9wYXRjaDtpZih0aGlzLmpvaW5Db3VudD4xfHx0aGlzLnBhcmVudCYmIXRoaXMucGFyZW50LmlzSm9pblBlbmRpbmcoKSlyZXR1cm4gdGhpcy5hcHBseUpvaW5QYXRjaChpLHQpOzA9PT1pZS5maW5kUGh4Q2hpbGRyZW5JbkZyYWdtZW50KHQsdGhpcy5pZCkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBuLmpvaW5DaGlsZChlKX0pLmxlbmd0aD90aGlzLnBhcmVudD8odGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW3RoaXMsZnVuY3Rpb24oKXtyZXR1cm4gbi5hcHBseUpvaW5QYXRjaChpLHQpfV0pLHRoaXMucGFyZW50LmFja0pvaW4odGhpcykpOih0aGlzLm9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKCksdGhpcy5hcHBseUpvaW5QYXRjaChpLHQpKTp0aGlzLnJvb3QucGVuZGluZ0pvaW5PcHMucHVzaChbdGhpcyxmdW5jdGlvbigpe3JldHVybiBuLmFwcGx5Sm9pblBhdGNoKGksdCl9XSl9fSx7a2V5OlwiYXR0YWNoVHJ1ZURvY0VsXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmVsPWllLmJ5SWQodGhpcy5pZCksdGhpcy5lbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1yb290LWlkXCIsdGhpcy5yb290LmlkKX19LHtrZXk6XCJhcHBseUpvaW5QYXRjaFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt0aGlzLmF0dGFjaFRydWVEb2NFbCgpO3ZhciBpPW5ldyByZSh0aGlzLHRoaXMuZWwsdGhpcy5pZCx0LG51bGwpO2lmKGkubWFya1BydW5hYmxlQ29udGVudEZvclJlbW92YWwoKSx0aGlzLmpvaW5QZW5kaW5nPSExLHRoaXMucGVyZm9ybVBhdGNoKGkpLHRoaXMuam9pbk5ld0NoaWxkcmVuKCksaWUuYWxsKHRoaXMuZWwsXCJbXCIuY29uY2F0KHRoaXMuYmluZGluZyhcImhvb2tcIiksXCJdXCIpLGZ1bmN0aW9uKGUpe3ZhciB0PW4uYWRkSG9vayhlKTt0JiZ0Ll9fdHJpZ2dlcl9fKFwibW91bnRlZFwiKX0pLHRoaXMuYXBwbHlQZW5kaW5nVXBkYXRlcygpLGUpe3ZhciByPWUua2luZCxvPWUudG87dGhpcy5saXZlU29ja2V0Lmhpc3RvcnlQYXRjaChvLHIpfXRoaXMuaGlkZUxvYWRlcigpLHRoaXMuam9pbkNvdW50PjEmJnRoaXMudHJpZ2dlclJlY29ubmVjdGVkKCksdGhpcy5zdG9wQ2FsbGJhY2soKX19LHtrZXk6XCJwZXJmb3JtUGF0Y2hcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49W10saT0hMSxyPW5ldyBTZXQ7cmV0dXJuIGUuYWZ0ZXIoXCJhZGRlZFwiLGZ1bmN0aW9uKGUpe3ZhciBuPXQuYWRkSG9vayhlKTtuJiZuLl9fdHJpZ2dlcl9fKFwibW91bnRlZFwiKX0pLGUuYWZ0ZXIoXCJwaHhDaGlsZEFkZGVkXCIsZnVuY3Rpb24oZSl7cmV0dXJuIGk9ITB9KSxlLmJlZm9yZShcInVwZGF0ZWRcIixmdW5jdGlvbihlLG4pe3QubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25CZWZvcmVFbFVwZGF0ZWRcIixbZSxuXSk7dmFyIGk9dC5nZXRIb29rKGUpLG89aSYmXCJpZ25vcmVcIj09PWUuZ2V0QXR0cmlidXRlKHQuYmluZGluZyhcInVwZGF0ZVwiKSk7IWl8fGUuaXNFcXVhbE5vZGUobil8fG8mJmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpPT09SlNPTi5zdHJpbmdpZnkodCl9KGUuZGF0YXNldCxuLmRhdGFzZXQpfHwoci5hZGQoZS5pZCksaS5fX3RyaWdnZXJfXyhcImJlZm9yZVVwZGF0ZVwiKSl9KSxlLmFmdGVyKFwidXBkYXRlZFwiLGZ1bmN0aW9uKGUpe3ZhciBuPXQuZ2V0SG9vayhlKTtuJiZyLmhhcyhlLmlkKSYmbi5fX3RyaWdnZXJfXyhcInVwZGF0ZWRcIil9KSxlLmJlZm9yZShcImRpc2NhcmRlZFwiLGZ1bmN0aW9uKGUpe3ZhciBuPXQuZ2V0SG9vayhlKTtuJiZuLl9fdHJpZ2dlcl9fKFwiYmVmb3JlRGVzdHJveVwiKX0pLGUuYWZ0ZXIoXCJkaXNjYXJkZWRcIixmdW5jdGlvbihlKXt2YXIgaT10LmNvbXBvbmVudElEKGUpO1wibnVtYmVyXCI9PXR5cGVvZiBpJiYtMT09PW4uaW5kZXhPZihpKSYmbi5wdXNoKGkpO3ZhciByPXQuZ2V0SG9vayhlKTtyJiZ0LmRlc3Ryb3lIb29rKHIpfSksZS5wZXJmb3JtKCksdGhpcy5tYXliZVB1c2hDb21wb25lbnRzRGVzdHJveWVkKG4pLGl9fSx7a2V5Olwiam9pbk5ld0NoaWxkcmVuXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2llLmZpbmRQaHhDaGlsZHJlbih0aGlzLmVsLHRoaXMuaWQpLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUuam9pbkNoaWxkKHQpfSl9fSx7a2V5OlwiZ2V0Q2hpbGRCeUlkXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXVtlXX19LHtrZXk6XCJnZXREZXNjZW5kZW50QnlFbFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmlkPT09dGhpcy5pZD90aGlzOnRoaXMuY2hpbGRyZW5bZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1wYXJlbnQtaWRcIildW2UuaWRdfX0se2tleTpcImRlc3Ryb3lEZXNjZW5kZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIHRoaXMucm9vdC5jaGlsZHJlbilmb3IodmFyIG4gaW4gdGhpcy5yb290LmNoaWxkcmVuW3RdKWlmKG49PT1lKXJldHVybiB0aGlzLnJvb3QuY2hpbGRyZW5bdF1bbl0uZGVzdHJveSgpfX0se2tleTpcImpvaW5DaGlsZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLmdldENoaWxkQnlJZCh0LmlkKSl7dmFyIG49bmV3IGUodCx0aGlzLmxpdmVTb2NrZXQsdGhpcyk7cmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXVtuLmlkXT1uLG4uam9pbigpLHRoaXMuY2hpbGRKb2lucysrLCEwfX19LHtrZXk6XCJpc0pvaW5QZW5kaW5nXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qb2luUGVuZGluZ319LHtrZXk6XCJhY2tKb2luXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5jaGlsZEpvaW5zLS0sMD09PXRoaXMuY2hpbGRKb2lucyYmKHRoaXMucGFyZW50P3RoaXMucGFyZW50LmFja0pvaW4odGhpcyk6dGhpcy5vbkFsbENoaWxkSm9pbnNDb21wbGV0ZSgpKX19LHtrZXk6XCJvbkFsbENoaWxkSm9pbnNDb21wbGV0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5qb2luQ2FsbGJhY2soKSx0aGlzLnBlbmRpbmdKb2luT3BzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9TChlLDIpLG49dFswXSxpPXRbMV07bi5pc0Rlc3Ryb3llZCgpfHxpKCl9KSx0aGlzLnBlbmRpbmdKb2luT3BzPVtdfX0se2tleTpcInVwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzO2lmKCFZKGUpfHxudWxsIT09bil7aWYoZS50aXRsZSYmaWUucHV0VGl0bGUoZS50aXRsZSksdGhpcy5pc0pvaW5QZW5kaW5nKCl8fHRoaXMubGl2ZVNvY2tldC5oYXNQZW5kaW5nTGluaygpKXJldHVybiB0aGlzLnBlbmRpbmdEaWZmcy5wdXNoKHtkaWZmOmUsY2lkOnQscmVmOm59KTt0aGlzLmxvZyhcInVwZGF0ZVwiLGZ1bmN0aW9uKCl7cmV0dXJuW1wiXCIseihlKV19KSx0aGlzLnJlbmRlcmVkLm1lcmdlRGlmZihlKTt2YXIgcj0hMTtcIm51bWJlclwiPT10eXBlb2YgdD90aGlzLmxpdmVTb2NrZXQudGltZShcImNvbXBvbmVudCBhY2sgcGF0Y2ggY29tcGxldGVcIixmdW5jdGlvbigpe2kuY29tcG9uZW50UGF0Y2goZS5jW3RdLHQsbikmJihyPSEwKX0pOnRoaXMucmVuZGVyZWQuaXNDb21wb25lbnRPbmx5RGlmZihlKT90aGlzLmxpdmVTb2NrZXQudGltZShcImNvbXBvbmVudCBwYXRjaCBjb21wbGV0ZVwiLGZ1bmN0aW9uKCl7aWUuZmluZFBhcmVudENJRHMoaS5lbCxpLnJlbmRlcmVkLmNvbXBvbmVudENJRHMoZSkpLmZvckVhY2goZnVuY3Rpb24odCl7aS5jb21wb25lbnRQYXRjaChlLmNbdF0sdCxuKSYmKHI9ITApfSl9KTpZKGUpfHx0aGlzLmxpdmVTb2NrZXQudGltZShcImZ1bGwgcGF0Y2ggY29tcGxldGVcIixmdW5jdGlvbigpe3ZhciB0PWkucmVuZGVyQ29udGFpbmVyKGUsXCJ1cGRhdGVcIiksbz1uZXcgcmUoaSxpLmVsLGkuaWQsdCxudWxsLG4pO3I9aS5wZXJmb3JtUGF0Y2gobyl9KSxpZS51bmRvUmVmcyhuLHRoaXMuZWwpLHImJnRoaXMuam9pbk5ld0NoaWxkcmVuKCl9fX0se2tleTpcInJlbmRlckNvbnRhaW5lclwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGhpcy5saXZlU29ja2V0LnRpbWUoXCJ0b1N0cmluZyBkaWZmIChcIi5jb25jYXQodCxcIilcIiksZnVuY3Rpb24oKXt2YXIgdD1uLmVsLnRhZ05hbWUsaT1lP24ucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhlKTpudWxsLHI9bi5yZW5kZXJlZC50b1N0cmluZyhpKTtyZXR1cm5cIjxcIi5jb25jYXQodCxcIj5cIikuY29uY2F0KHIsXCI8L1wiKS5jb25jYXQodCxcIj5cIil9KX19LHtrZXk6XCJjb21wb25lbnRQYXRjaFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtpZihZKGUpKXJldHVybiExO3ZhciBpPXRoaXMucmVuZGVyZWQuY29tcG9uZW50VG9TdHJpbmcodCkscj1uZXcgcmUodGhpcyx0aGlzLmVsLHRoaXMuaWQsaSx0LG4pO3JldHVybiB0aGlzLnBlcmZvcm1QYXRjaChyKX19LHtrZXk6XCJnZXRIb29rXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudmlld0hvb2tzW3VlLmVsZW1lbnRJRChlKV19fSx7a2V5OlwiYWRkSG9va1wiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKCF1ZS5lbGVtZW50SUQoZSkmJmUuZ2V0QXR0cmlidXRlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJob29rXCIpKTtpZighdHx8dGhpcy5vd25zRWxlbWVudChlKSl7dmFyIG49dGhpcy5saXZlU29ja2V0LmdldEhvb2tDYWxsYmFja3ModCk7aWYobil7dmFyIGk9bmV3IHVlKHRoaXMsZSxuKTtyZXR1cm4gdGhpcy52aWV3SG9va3NbdWUuZWxlbWVudElEKGkuZWwpXT1pLGl9bnVsbCE9PXQmJlcoJ3Vua25vd24gaG9vayBmb3VuZCBmb3IgXCInLmNvbmNhdCh0LCdcIicpLGUpfX19fSx7a2V5OlwiZGVzdHJveUhvb2tcIix2YWx1ZTpmdW5jdGlvbihlKXtlLl9fdHJpZ2dlcl9fKFwiZGVzdHJveWVkXCIpLGRlbGV0ZSB0aGlzLnZpZXdIb29rc1t1ZS5lbGVtZW50SUQoZS5lbCldfX0se2tleTpcImFwcGx5UGVuZGluZ1VwZGF0ZXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj10LmRpZmYsaT10LmNpZCxyPXQucmVmO3JldHVybiBlLnVwZGF0ZShuLGkscil9KSx0aGlzLnBlbmRpbmdEaWZmcz1bXX19LHtrZXk6XCJvbkNoYW5uZWxcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dGhpcy5saXZlU29ja2V0Lm9uQ2hhbm5lbCh0aGlzLmNoYW5uZWwsZSxmdW5jdGlvbihlKXtuLmlzSm9pblBlbmRpbmcoKT9uLnJvb3QucGVuZGluZ0pvaW5PcHMucHVzaChbbixmdW5jdGlvbigpe3JldHVybiB0KGUpfV0pOnQoZSl9KX19LHtrZXk6XCJiaW5kQ2hhbm5lbFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLm9uQ2hhbm5lbChcImRpZmZcIixmdW5jdGlvbih0KXtyZXR1cm4gZS51cGRhdGUodCl9KSx0aGlzLm9uQ2hhbm5lbChcInJlZGlyZWN0XCIsZnVuY3Rpb24odCl7dmFyIG49dC50byxpPXQuZmxhc2g7cmV0dXJuIGUub25SZWRpcmVjdCh7dG86bixmbGFzaDppfSl9KSx0aGlzLm9uQ2hhbm5lbChcImxpdmVfcGF0Y2hcIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbkxpdmVQYXRjaCh0KX0pLHRoaXMub25DaGFubmVsKFwibGl2ZV9yZWRpcmVjdFwiLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTGl2ZVJlZGlyZWN0KHQpfSksdGhpcy5vbkNoYW5uZWwoXCJzZXNzaW9uXCIsZnVuY3Rpb24odCl7dmFyIG49dC50b2tlbjtyZXR1cm4gZS5lbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1zZXNzaW9uXCIsbil9KSx0aGlzLmNoYW5uZWwub25FcnJvcihmdW5jdGlvbih0KXtyZXR1cm4gZS5vbkVycm9yKHQpfSksdGhpcy5jaGFubmVsLm9uQ2xvc2UoZnVuY3Rpb24oKXtyZXR1cm4gZS5vbkVycm9yKHtyZWFzb246XCJjbG9zZWRcIn0pfSl9fSx7a2V5OlwiZGVzdHJveUFsbENoaWxkcmVuXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdKXRoaXMuZ2V0Q2hpbGRCeUlkKGUpLmRlc3Ryb3koKX19LHtrZXk6XCJvbkxpdmVSZWRpcmVjdFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUudG8sbj1lLmtpbmQsaT1lLmZsYXNoLHI9dGhpcy5leHBhbmRVUkwodCk7dGhpcy5saXZlU29ja2V0Lmhpc3RvcnlSZWRpcmVjdChyLG4saSl9fSx7a2V5Olwib25MaXZlUGF0Y2hcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLnRvLG49ZS5raW5kO3RoaXMuaHJlZj10aGlzLmV4cGFuZFVSTCh0KSx0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVBhdGNoKHQsbil9fSx7a2V5OlwiZXhwYW5kVVJMXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3RhcnRzV2l0aChcIi9cIik/XCJcIi5jb25jYXQod2luZG93LmxvY2F0aW9uLnByb3RvY29sLFwiLy9cIikuY29uY2F0KHdpbmRvdy5sb2NhdGlvbi5ob3N0KS5jb25jYXQoZSk6ZX19LHtrZXk6XCJvblJlZGlyZWN0XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50byxuPWUuZmxhc2g7dGhpcy5saXZlU29ja2V0LnJlZGlyZWN0KHQsbil9fSx7a2V5OlwiaXNEZXN0cm95ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRlc3Ryb3llZH19LHtrZXk6XCJqb2luXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLnBhcmVudHx8KHRoaXMuc3RvcENhbGxiYWNrPXRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe3RvOnRoaXMuaHJlZixraW5kOlwiaW5pdGlhbFwifSkpLHRoaXMuam9pbkNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIGUmJmUodCx0LmpvaW5Db3VudCl9LHRoaXMubGl2ZVNvY2tldC53cmFwUHVzaChmdW5jdGlvbigpe3JldHVybiB0LmNoYW5uZWwuam9pbigpLnJlY2VpdmUoXCJva1wiLGZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uSm9pbihlKX0pLnJlY2VpdmUoXCJlcnJvclwiLGZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uSm9pbkVycm9yKGUpfSkucmVjZWl2ZShcInRpbWVvdXRcIixmdW5jdGlvbigpe3JldHVybiB0Lm9uSm9pbkVycm9yKHtyZWFzb246XCJ0aW1lb3V0XCJ9KX0pfSl9fSx7a2V5Olwib25Kb2luRXJyb3JcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4oZS5yZWRpcmVjdHx8ZS5saXZlX3JlZGlyZWN0KSYmKHRoaXMuam9pblBlbmRpbmc9ITEsdGhpcy5jaGFubmVsLmxlYXZlKCkpLGUucmVkaXJlY3Q/dGhpcy5vblJlZGlyZWN0KGUucmVkaXJlY3QpOmUubGl2ZV9yZWRpcmVjdD90aGlzLm9uTGl2ZVJlZGlyZWN0KGUubGl2ZV9yZWRpcmVjdCk6KHRoaXMubG9nKFwiZXJyb3JcIixmdW5jdGlvbigpe3JldHVybltcInVuYWJsZSB0byBqb2luXCIsZV19KSx0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKSl9fSx7a2V5Olwib25FcnJvclwiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKHRoaXMuaXNKb2luUGVuZGluZygpKXJldHVybiB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKTt0aGlzLmRlc3Ryb3lBbGxDaGlsZHJlbigpLHRoaXMubG9nKFwiZXJyb3JcIixmdW5jdGlvbigpe3JldHVybltcInZpZXcgY3Jhc2hlZFwiLGVdfSksdGhpcy5saXZlU29ja2V0Lm9uVmlld0Vycm9yKHRoaXMpLGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpLHRoaXMubGl2ZVNvY2tldC5pc1VubG9hZGVkKCk/dGhpcy5zaG93TG9hZGVyKDIwMCk6dGhpcy5kaXNwbGF5RXJyb3IoKX19LHtrZXk6XCJkaXNwbGF5RXJyb3JcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuaXNNYWluKCkmJmllLmRpc3BhdGNoRXZlbnQod2luZG93LFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLHt0bzp0aGlzLmhyZWYsa2luZDpcImVycm9yXCJ9KSx0aGlzLnNob3dMb2FkZXIoKSx0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoXCJwaHgtZGlzY29ubmVjdGVkXCIsXCJwaHgtZXJyb3JcIil9fSx7a2V5OlwicHVzaFdpdGhSZXBseVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzLHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOmZ1bmN0aW9uKCl7fSxvPUwoZT9lKCk6W251bGwsW11dLDIpLGE9b1swXSx1PUwob1sxXSwxKVswXSxjPWZ1bmN0aW9uKCl7fTtyZXR1cm4gdSYmbnVsbCE9PXUuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInBhZ2UtbG9hZGluZ1wiKSkmJihjPXRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe2tpbmQ6XCJlbGVtZW50XCIsdGFyZ2V0OnV9KSksXCJudW1iZXJcIiE9dHlwZW9mIG4uY2lkJiZkZWxldGUgbi5jaWQsdGhpcy5saXZlU29ja2V0LndyYXBQdXNoKGZ1bmN0aW9uKCl7cmV0dXJuIGkuY2hhbm5lbC5wdXNoKHQsbiwzZTQpLnJlY2VpdmUoXCJva1wiLGZ1bmN0aW9uKGUpeyhlLmRpZmZ8fG51bGwhPT1hKSYmaS51cGRhdGUoZS5kaWZmfHx7fSxuLmNpZCxhKSxlLnJlZGlyZWN0JiZpLm9uUmVkaXJlY3QoZS5yZWRpcmVjdCksZS5saXZlX3BhdGNoJiZpLm9uTGl2ZVBhdGNoKGUubGl2ZV9wYXRjaCksZS5saXZlX3JlZGlyZWN0JiZpLm9uTGl2ZVJlZGlyZWN0KGUubGl2ZV9yZWRpcmVjdCksYygpLHIoZSl9KX0pfX0se2tleTpcInB1dFJlZlwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5yZWYrKyxpPXRoaXMuYmluZGluZyhcImRpc2FibGUtd2l0aFwiKTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmFkZChcInBoeC1cIi5jb25jYXQodCxcIi1sb2FkaW5nXCIpKSxlLnNldEF0dHJpYnV0ZShNLG4pO3ZhciByPWUuZ2V0QXR0cmlidXRlKGkpO251bGwhPT1yJiYoZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1kaXNhYmxlLXdpdGgtcmVzdG9yZVwiKXx8ZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1kaXNhYmxlLXdpdGgtcmVzdG9yZVwiLGUuaW5uZXJUZXh0KSxlLmlubmVyVGV4dD1yKX0pLFtuLGVdfX0se2tleTpcImNvbXBvbmVudElEXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKEgpO3JldHVybiB0P3BhcnNlSW50KHQpOm51bGx9fSx7a2V5OlwidGFyZ2V0Q29tcG9uZW50SURcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpP3RoaXMuY2xvc2VzdENvbXBvbmVudElEKHQpOm51bGx9fSx7a2V5OlwiY2xvc2VzdENvbXBvbmVudElEXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZT9RKGUuY2xvc2VzdChcIltcIi5jb25jYXQoSCxcIl1cIikpLGZ1bmN0aW9uKGUpe3JldHVybiB0Lm93bnNFbGVtZW50KGUpJiZ0LmNvbXBvbmVudElEKGUpfSk6bnVsbH19LHtrZXk6XCJwdXNoSG9va0V2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3RoaXMucHVzaFdpdGhSZXBseShudWxsLFwiZXZlbnRcIix7dHlwZTpcImhvb2tcIixldmVudDp0LHZhbHVlOm4sY2lkOnRoaXMuY2xvc2VzdENvbXBvbmVudElEKGUpfSl9fSx7a2V5OlwiZXh0cmFjdE1ldGFcIix2YWx1ZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj10aGlzLmJpbmRpbmcoXCJ2YWx1ZS1cIiksaT0wO2k8ZS5hdHRyaWJ1dGVzLmxlbmd0aDtpKyspe3ZhciByPWUuYXR0cmlidXRlc1tpXS5uYW1lO3Iuc3RhcnRzV2l0aChuKSYmKHRbci5yZXBsYWNlKG4sXCJcIildPWUuZ2V0QXR0cmlidXRlKHIpKX1yZXR1cm4gdm9pZCAwIT09ZS52YWx1ZSYmKHQudmFsdWU9ZS52YWx1ZSxcIklOUFVUXCI9PT1lLnRhZ05hbWUmJlUuaW5kZXhPZihlLnR5cGUpPj0wJiYhZS5jaGVja2VkJiZkZWxldGUgdC52YWx1ZSksdH19LHtrZXk6XCJwdXNoRXZlbnRcIix2YWx1ZTpmdW5jdGlvbihlLHQsbixpLHIpe3ZhciBvPXRoaXM7dGhpcy5wdXNoV2l0aFJlcGx5KGZ1bmN0aW9uKCl7cmV0dXJuIG8ucHV0UmVmKFt0XSxlKX0sXCJldmVudFwiLHt0eXBlOmUsZXZlbnQ6aSx2YWx1ZTp0aGlzLmV4dHJhY3RNZXRhKHQsciksY2lkOnRoaXMudGFyZ2V0Q29tcG9uZW50SUQodCxuKX0pfX0se2tleTpcInB1c2hLZXlcIix2YWx1ZTpmdW5jdGlvbihlLHQsbixpLHIpe3ZhciBvPXRoaXM7dGhpcy5wdXNoV2l0aFJlcGx5KGZ1bmN0aW9uKCl7cmV0dXJuIG8ucHV0UmVmKFtlXSxuKX0sXCJldmVudFwiLHt0eXBlOm4sZXZlbnQ6aSx2YWx1ZTp0aGlzLmV4dHJhY3RNZXRhKGUsciksY2lkOnRoaXMudGFyZ2V0Q29tcG9uZW50SUQoZSx0KX0pfX0se2tleTpcInB1c2hJbnB1dFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGkscil7dmFyIG89dGhpczt0aGlzLnB1c2hXaXRoUmVwbHkoZnVuY3Rpb24oKXtyZXR1cm4gby5wdXRSZWYoW2UsZS5mb3JtXSxcImNoYW5nZVwiKX0sXCJldmVudFwiLHt0eXBlOlwiZm9ybVwiLGV2ZW50Om4sdmFsdWU6WihlLmZvcm0se190YXJnZXQ6aS5uYW1lfSksY2lkOnRoaXMudGFyZ2V0Q29tcG9uZW50SUQoZS5mb3JtLHQpfSxyKX19LHtrZXk6XCJwdXNoRm9ybVN1Ym1pdFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciByPXRoaXMsbz1mdW5jdGlvbihlKXtyZXR1cm4hWChlLFwiXCIuY29uY2F0KHIuYmluZGluZyhcInVwZGF0ZVwiKSxcIj1pZ25vcmVcIiksZS5mb3JtKX07dGhpcy5wdXNoV2l0aFJlcGx5KGZ1bmN0aW9uKCl7dmFyIHQ9aWUuYWxsKGUsXCJbXCIuY29uY2F0KHIuYmluZGluZyhcImRpc2FibGUtd2l0aFwiKSxcIl1cIikpLG49aWUuYWxsKGUsXCJidXR0b25cIikuZmlsdGVyKG8pLGk9aWUuYWxsKGUsXCJpbnB1dFwiKS5maWx0ZXIobyk7cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWRpc2FibGVkXCIsZS5kaXNhYmxlZCksZS5kaXNhYmxlZD0hMH0pLGkuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LXJlYWRvbmx5XCIsZS5yZWFkT25seSksZS5yZWFkT25seT0hMH0pLGUuc2V0QXR0cmlidXRlKHIuYmluZGluZyhcInBhZ2UtbG9hZGluZ1wiKSxcIlwiKSxyLnB1dFJlZihbZV0uY29uY2F0KHQpLmNvbmNhdChuKS5jb25jYXQoaSksXCJzdWJtaXRcIil9LFwiZXZlbnRcIix7dHlwZTpcImZvcm1cIixldmVudDpuLHZhbHVlOlooZSksY2lkOnRoaXMudGFyZ2V0Q29tcG9uZW50SUQoZSx0KX0saSl9fSx7a2V5OlwicHVzaEZvcm1SZWNvdmVyeVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt0aGlzLmxpdmVTb2NrZXQud2l0aGluT3duZXJzKGUsZnVuY3Rpb24oaSxyKXt2YXIgbz1lLmVsZW1lbnRzWzBdLGE9ZS5nZXRBdHRyaWJ1dGUobi5iaW5kaW5nKFwiYXV0by1yZWNvdmVyXCIpKXx8ZS5nZXRBdHRyaWJ1dGUobi5iaW5kaW5nKFwiY2hhbmdlXCIpKTtpLnB1c2hJbnB1dChvLHIsYSxvLHQpfSl9fSx7a2V5OlwicHVzaExpbmtQYXRjaFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzO3RoaXMuaXNMb2FkaW5nKCl8fHRoaXMuc2hvd0xvYWRlcih0aGlzLmxpdmVTb2NrZXQubG9hZGVyVGltZW91dCk7dmFyIHI9dGhpcy5saXZlU29ja2V0LnNldFBlbmRpbmdMaW5rKGUpLG89dD9mdW5jdGlvbigpe3JldHVybiBpLnB1dFJlZihbdF0sXCJjbGlja1wiKX06bnVsbDt0aGlzLnB1c2hXaXRoUmVwbHkobyxcImxpbmtcIix7dXJsOmV9LGZ1bmN0aW9uKHQpe3QubGlua19yZWRpcmVjdD9pLmxpdmVTb2NrZXQucmVwbGFjZU1haW4oZSxudWxsLG4scik6aS5saXZlU29ja2V0LmNvbW1pdFBlbmRpbmdMaW5rKHIpJiYoaS5ocmVmPWUsaS5hcHBseVBlbmRpbmdVcGRhdGVzKCksaS5oaWRlTG9hZGVyKCksaS50cmlnZ2VyUmVjb25uZWN0ZWQoKSxuJiZuKCkpfSkucmVjZWl2ZShcInRpbWVvdXRcIixmdW5jdGlvbigpe3JldHVybiBpLmxpdmVTb2NrZXQucmVkaXJlY3Qod2luZG93LmxvY2F0aW9uLmhyZWYpfSl9fSx7a2V5OlwiZm9ybXNGb3JSZWNvdmVyeVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIiksaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7cmV0dXJuIGkuaW5uZXJIVE1MPWUsaWUuYWxsKHRoaXMuZWwsXCJmb3JtW1wiLmNvbmNhdChuLFwiXVwiKSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm93bnNFbGVtZW50KGUpfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVyblwiaWdub3JlXCIhPT1lLmdldEF0dHJpYnV0ZSh0LmJpbmRpbmcoXCJhdXRvLXJlY292ZXJcIikpfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBpLmNvbnRlbnQucXVlcnlTZWxlY3RvcihcImZvcm1bXCIuY29uY2F0KG4sJz1cIicpLmNvbmNhdChlLmdldEF0dHJpYnV0ZShuKSwnXCJdJykpfSl9fSx7a2V5OlwibWF5YmVQdXNoQ29tcG9uZW50c0Rlc3Ryb3llZFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gMD09PWllLmZpbmRDb21wb25lbnROb2RlTGlzdCh0LmVsLGUpLmxlbmd0aH0pO24ubGVuZ3RoPjAmJnRoaXMucHVzaFdpdGhSZXBseShudWxsLFwiY2lkc19kZXN0cm95ZWRcIix7Y2lkczpufSxmdW5jdGlvbigpe3QucmVuZGVyZWQucHJ1bmVDSURzKG4pfSl9fSx7a2V5Olwib3duc0VsZW1lbnRcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1wYXJlbnQtaWRcIik9PT10aGlzLmlkfHxRKGUuY2xvc2VzdChCKSxmdW5jdGlvbihlKXtyZXR1cm4gZS5pZH0pPT09dGhpcy5pZH19LHtrZXk6XCJzdWJtaXRGb3JtXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXM7aWUucHV0UHJpdmF0ZShlLFwicGh4LWhhcy1zdWJtaXR0ZWRcIiwhMCksdGhpcy5saXZlU29ja2V0LmJsdXJBY3RpdmVFbGVtZW50KHRoaXMpLHRoaXMucHVzaEZvcm1TdWJtaXQoZSx0LG4sZnVuY3Rpb24oKXtpLmxpdmVTb2NrZXQucmVzdG9yZVByZXZpb3VzbHlBY3RpdmVGb2N1cygpfSl9fSx7a2V5OlwiYmluZGluZ1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhlKX19XSksZX0oKSxhZT0xLHVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4saSl7Zm9yKHZhciByIGluIEUodGhpcyxlKSx0aGlzLl9fdmlldz10LHRoaXMuX19saXZlU29ja2V0PXQubGl2ZVNvY2tldCx0aGlzLl9fY2FsbGJhY2tzPWksdGhpcy5lbD1uLHRoaXMudmlld05hbWU9dC5uYW1lKCksdGhpcy5lbC5waHhIb29rSWQ9dGhpcy5jb25zdHJ1Y3Rvci5tYWtlSUQoKSx0aGlzLl9fY2FsbGJhY2tzKXRoaXNbcl09dGhpcy5fX2NhbGxiYWNrc1tyXX1yZXR1cm4gUChlLG51bGwsW3trZXk6XCJtYWtlSURcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBhZSsrfX0se2tleTpcImVsZW1lbnRJRFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBoeEhvb2tJZH19XSksUChlLFt7a2V5OlwicHVzaEV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3RoaXMuX192aWV3LnB1c2hIb29rRXZlbnQobnVsbCxlLHQpfX0se2tleTpcInB1c2hFdmVudFRvXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e307dGhpcy5fX2xpdmVTb2NrZXQud2l0aGluVGFyZ2V0cyhudWxsLGUsZnVuY3Rpb24oZSxpKXtlLnB1c2hIb29rRXZlbnQoaSx0LG4pfSl9fSx7a2V5OlwiX190cmlnZ2VyX19cIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9fY2FsbGJhY2tzW2VdO3QmJnQuY2FsbCh0aGlzKX19XSksZX0oKTt0LmRlZmF1bHQ9dGV9LGZ1bmN0aW9uKGUsdCl7dmFyIG47bj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtuPW58fEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKXx8KDAsZXZhbCkoXCJ0aGlzXCIpfWNhdGNoKGUpe1wib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9ZS5leHBvcnRzPW59LGZ1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24odCl7dC5QaG9lbml4fHwodC5QaG9lbml4PXt9KSxlLmV4cG9ydHM9dC5QaG9lbml4LkxpdmVWaWV3PW4oMCl9KS5jYWxsKHRoaXMsbigxKSl9XSl9KTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../deps/phoenix_live_view/priv/static/phoenix_live_view.js\n");
/***/ }),
/***/ "./css/app.scss":
/*!**********************!*\
!*** ./css/app.scss ***!
\**********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9jc3MvYXBwLnNjc3MuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jc3MvYXBwLnNjc3M/MjQyYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./css/app.scss\n");
/***/ }),
/***/ "./js/app.js":
/*!*******************!*\
!*** ./js/app.js ***!
\*******************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../css/app.scss */ \"./css/app.scss\");\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_app_scss__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _live__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./live */ \"./js/live.js\");\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9qcy9hcHAuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9hcHAuanM/NzQ3MyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCIuLi9jc3MvYXBwLnNjc3NcIlxuaW1wb3J0IFwiLi9saXZlXCJcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./js/app.js\n");
/***/ }),
/***/ "./js/live.js":
/*!********************!*\
!*** ./js/live.js ***!
\********************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var phoenix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! phoenix */ \"../deps/phoenix/priv/static/phoenix.js\");\n/* harmony import */ var phoenix__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(phoenix__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var phoenix_live_view__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! phoenix_live_view */ \"../deps/phoenix_live_view/priv/static/phoenix_live_view.js\");\n/* harmony import */ var phoenix_live_view__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(phoenix_live_view__WEBPACK_IMPORTED_MODULE_1__);\n\n\nvar csrfToken = document.querySelector(\"meta[name='csrf-token']\").getAttribute(\"content\");\nvar liveSocket = new phoenix_live_view__WEBPACK_IMPORTED_MODULE_1__[\"LiveSocket\"](\"/live\", phoenix__WEBPACK_IMPORTED_MODULE_0__[\"Socket\"], {\n params: {\n _csrf_token: csrfToken\n }\n});\nliveSocket.connect();\nwindow.liveSocket = liveSocket;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9qcy9saXZlLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vanMvbGl2ZS5qcz8zNGY4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U29ja2V0fSBmcm9tIFwicGhvZW5peFwiXG5pbXBvcnQge0xpdmVTb2NrZXR9IGZyb20gXCJwaG9lbml4X2xpdmVfdmlld1wiXG5cbmxldCBjc3JmVG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIikuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKVxubGV0IGxpdmVTb2NrZXQgPSBuZXcgTGl2ZVNvY2tldChcIi9saXZlXCIsIFNvY2tldCwge3BhcmFtczoge19jc3JmX3Rva2VuOiBjc3JmVG9rZW59fSlcblxubGl2ZVNvY2tldC5jb25uZWN0KClcblxud2luZG93LmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFFQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./js/live.js\n");
/***/ }),
/***/ 0:
/*!*************************!*\
!*** multi ./js/app.js ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(/*! ./js/app.js */"./js/app.js");
/***/ })
/******/ });