sdc_client 0.57.17 → 0.57.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -64,7 +64,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
64
64
  \******************************************/
65
65
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
66
66
 
67
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ app: () => (/* binding */ app)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n/* harmony import */ var _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractSDC.js */ \"./src/simpleDomControl/AbstractSDC.js\");\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n\n\n\n\n\n\n\n\nconst PROPERTIES_UPDATE = {\n 'classname': 'class'\n};\nlet sdcDomFragment = function (element, props) {\n let $new_elem,\n is_self = false;\n if (typeof element === 'string') {\n $new_elem = $(document.createElement(element));\n } else {\n const tagName = `this.${element.name}`;\n $new_elem = $(document.createElement(tagName));\n $new_elem.data('handler', element);\n is_self = true;\n }\n if (props) {\n Object.entries(props).forEach(([k, v]) => {\n if (k.startsWith('on')) {\n $new_elem[0].addEventListener(k.substring(2).toLowerCase(), v);\n } else {\n if (PROPERTIES_UPDATE[k.toLowerCase()]) {\n k = PROPERTIES_UPDATE[k.toLowerCase()];\n }\n $new_elem[0].setAttribute(k, v);\n }\n });\n }\n if (is_self) {\n $new_elem.addClass('_bind_to_update_handler _with_handler');\n }\n return $new_elem;\n};\nwindow.sdcDom = function (tagName, props, ...children) {\n if (!tagName) {\n return '';\n }\n const $new_elem = sdcDomFragment(tagName, props);\n for (const c of children) {\n $new_elem.append(c);\n }\n return $new_elem;\n};\nlet app = {\n CSRF_TOKEN: window.CSRF_TOKEN || '',\n LANGUAGE_CODE: window.LANGUAGE_CODE || 'en',\n DEBUG: window.DEBUG || false,\n VERSION: window.VERSION || '0.0',\n tagNames: [],\n Global: _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global,\n rootController: null,\n globalRootController: null,\n _isInit: false,\n _origin_trigger: null,\n _globalControllerClasses: [],\n init_sdc: () => {\n if (!app._isInit) {\n app._isInit = true;\n if (!app._origin_trigger) {\n app._origin_trigger = $.fn.trigger;\n $.fn.trigger = function (event) {\n const ev_type = {}.hasOwnProperty.call(event, \"type\") ? event.type : event;\n if (!_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.includes(ev_type)) {\n _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.push(ev_type);\n $(window).on(ev_type, _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.windowEventHandler);\n }\n return app._origin_trigger.call(this, event);\n };\n app.updateJquery();\n } else {\n (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.close)();\n }\n (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.isConnected)();\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.initEvents)();\n app.rootController = app.rootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n app.globalRootController = app.globalRootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n }\n app.tagNames = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.tagList)();\n const $globalDiv = $('<div></div>');\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.forEach(tagName => {\n const ControllerClass = _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][0];\n $globalDiv.append(`<${ControllerClass.prototype._tagName}></${ControllerClass.prototype._tagName}>`);\n });\n const {\n refreshProcess\n } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(null, app.rootController);\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(app.tagNames, $globalDiv, app.globalRootController, refreshProcess).then(() => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(app.tagNames, (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBody)(), app.rootController, refreshProcess).then(res => {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n return res;\n });\n });\n },\n updateJquery: () => {\n $.fn.safeReplace = function ($elem) {\n return app.safeReplace($(this), $elem);\n };\n $.fn.safeEmpty = function () {\n return app.safeEmpty($(this));\n };\n $.fn.safeRemove = function () {\n return app.safeRemove($(this));\n };\n },\n controllerToTag: Controller => {\n let tagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(Controller.name);\n return tagName.replace(/-controller$/, '');\n },\n /**\n *\n * @param {AbstractSDC} Controller\n */\n registerGlobal: Controller => {\n app.register(Controller);\n let tagName = Controller.prototype._tagName;\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.push(tagName);\n },\n cleanCache: () => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.cleanCache)();\n },\n /**\n *\n * @param {AbstractSDC} Controller\n */\n register: Controller => {\n let tagName = app.controllerToTag(Controller);\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] = [Controller, []];\n Controller.prototype._tagName = tagName;\n return {\n /**\n *\n * @param {Array<string>} mixins Controller tag names\n */\n addMixin: (...mixins) => {\n for (let mixin of mixins) {\n let mixinName;\n if (typeof mixin === \"string\") {\n mixinName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(mixin);\n } else if (mixin) {\n mixinName = app.controllerToTag(mixin);\n }\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][1].push(mixinName);\n }\n }\n };\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n post: (controller, url, args) => {\n if (!args) {\n args = {};\n }\n args.CSRF_TOKEN = app.CSRF_TOKEN;\n return app.ajax(controller, url, params, $.post);\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n get: (controller, url, args) => {\n return app.ajax(controller, url, args, $.get);\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @param {function} method $.get or $.post\n * @return {Promise}\n */\n ajax: (controller, url, args, method) => {\n if (!args) {\n args = {};\n }\n args.VERSION = app.VERSION;\n args._method = args._method || 'api';\n const p = new Promise((resolve, reject) => {\n return method(url, args).then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === 'redirect') {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)('onNavLink', a['url-link']);\n } else {\n p.then(() => {\n app.refresh(controller.$container);\n });\n }\n }).catch(reject);\n });\n return p;\n },\n submitFormAndUpdateView: (controller, form, url, method) => {\n let formData = new FormData(form);\n const redirector = a => {\n if (a['url-link']) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)('onNavLink', a['url-link']);\n } else {\n window.location.href = a['url'];\n }\n };\n const p = new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method).then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === 'redirect') {\n redirector(a);\n } else {\n p.then(() => {\n app.refresh(controller.$container, controller);\n });\n }\n }).catch((a, b, c) => {\n if (a.status === 301) {\n a = a.responseJSON;\n redirector(a);\n resolve(a, b, c);\n } else {\n reject(a, b, c);\n }\n });\n });\n return p;\n },\n submitForm: (form, url, method) => {\n let formData = new FormData(form);\n return new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method).then(resolve).catch(reject);\n });\n },\n /**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\n getController: $elem => (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($elem),\n /**\n * safeEmpty removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM container to be emptyed\n */\n safeEmpty: $elem => {\n let $children = $elem.children();\n $children.each(function (_, element) {\n let $element = $(element);\n app.safeRemove($element);\n });\n return $elem;\n },\n /**\n * safeReplace removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM to be repleaced\n * @param $new - jQuery new DOM container\n */\n safeReplace: ($elem, $new) => {\n $new.insertBefore($elem);\n return app.safeRemove($elem);\n },\n /**\n * safeRemove removes a dom and deletes all child controller safely.\n *\n * @param $elem - jQuery Dom\n */\n safeRemove: $elem => {\n $elem.each(function () {\n let $this = $(this);\n if ($this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`)) {\n $this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`).remove();\n }\n });\n $elem.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const controller = $(this).data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`);\n controller && controller.remove();\n });\n return $elem.remove();\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @return {Promise<jQuery>}\n */\n reloadController: controller => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reloadHTMLController)(controller).then(html => {\n let $html = $(html);\n return app.reconcile(controller, $html);\n });\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @param {jquery} $virtualNode\n * @param {jquery} $realNode\n * @param {Object} process - Process object containing the refresh process\n */\n reconcile: (controller, $virtualNode, $realNode = null, process = null) => {\n if (!$realNode) {\n let $temp = controller.$container.clone().empty();\n $temp.data(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY, null);\n $temp.removeClass(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS);\n $temp.append($virtualNode);\n $virtualNode = $temp;\n }\n $realNode = $realNode ?? controller.$container;\n const {\n refreshProcess,\n isRunningProcess\n } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(process, controller);\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($virtualNode, controller, refreshProcess).then(() => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reconcile)($virtualNode, $realNode);\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.resetChildren)(controller);\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n return controller;\n });\n },\n /**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @return {Promise<void>}\n */\n refresh: ($dom, leafController) => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($dom, leafController);\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFPLEVBQUVBLENBQUNxSSxJQUFJLEVBQUVDLGNBQWMsS0FBSztJQUNqQyxPQUFPdEkscURBQU8sQ0FBQ3FJLElBQUksRUFBRUMsY0FBYyxDQUFDO0VBQ3RDO0FBQ0YsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfbWFpbi5qcz8wOGZjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNhbWVsQ2FzZVRvVGFnTmFtZSxcbiAgZ2V0Qm9keSxcbiAgdXBsb2FkRmlsZUZvcm1EYXRhLFxufSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcbmltcG9ydCB7XG4gIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyLFxuICByZWxvYWRIVE1MQ29udHJvbGxlcixcbiAgREFUQV9DT05UUk9MTEVSX0tFWSxcbiAgQ09OVFJPTExFUl9DTEFTUywgZ2V0Q29udHJvbGxlciwgY2xlYW5DYWNoZSwgcmVmcmVzaFxufSBmcm9tIFwiLi9zZGNfdmlldy5qc1wiO1xuaW1wb3J0IHtBYnN0cmFjdFNEQ30gZnJvbSBcIi4vQWJzdHJhY3RTREMuanNcIjtcbmltcG9ydCB7XG4gIEdsb2JhbCxcbiAgY29udHJvbGxlckxpc3QsXG4gIHRhZ0xpc3QsXG4gIHJlc2V0Q2hpbGRyZW4sXG4gIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaCxcbiAgcHJlcGFyZVJlZnJlc2hQcm9jZXNzXG59IGZyb20gXCIuL3NkY19jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQge2luaXRFdmVudHMsIFNURF9FVkVOVF9MSVNULCB3aW5kb3dFdmVudEhhbmRsZXJ9IGZyb20gXCIuL3NkY19kb21fZXZlbnRzLmpzXCI7XG5pbXBvcnQge3JlY29uY2lsZX0gZnJvbSBcIi4vc2RjX3ZpZXcuanNcIjtcbmltcG9ydCB7dHJpZ2dlcn0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuaW1wb3J0IHtpc0Nvbm5lY3RlZCwgY2xvc2V9IGZyb20gXCIuL3NkY19zZXJ2ZXJfY2FsbC5qc1wiO1xuXG5jb25zdCBQUk9QRVJUSUVTX1VQREFURSA9IHsnY2xhc3NuYW1lJzogJ2NsYXNzJ31cblxubGV0IHNkY0RvbUZyYWdtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHByb3BzKSB7XG4gIGxldCAkbmV3X2VsZW0sIGlzX3NlbGYgPSBmYWxzZTtcbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICRuZXdfZWxlbSA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtZW50KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IGB0aGlzLiR7ZWxlbWVudC5uYW1lfWA7XG4gICAgJG5ld19lbGVtID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpKTtcbiAgICAkbmV3X2VsZW0uZGF0YSgnaGFuZGxlcicsIGVsZW1lbnQpO1xuICAgIGlzX3NlbGYgPSB0cnVlXG4gIH1cblxuXG4gIGlmIChwcm9wcykge1xuICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgIGlmIChrLnN0YXJ0c1dpdGgoJ29uJykpIHtcbiAgICAgICAgJG5ld19lbGVtWzBdLmFkZEV2ZW50TGlzdGVuZXIoay5zdWJzdHJpbmcoMikudG9Mb3dlckNhc2UoKSwgdik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoUFJPUEVSVElFU19VUERBVEVbay50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgIGsgPSBQUk9QRVJUSUVTX1VQREFURVtrLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICB9XG4gICAgICAgICRuZXdfZWxlbVswXS5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXNfc2VsZikge1xuICAgICRuZXdfZWxlbS5hZGRDbGFzcygnX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIgX3dpdGhfaGFuZGxlcicpO1xuICB9XG5cbiAgcmV0dXJuICRuZXdfZWxlbTtcbn1cblxud2luZG93LnNkY0RvbSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBwcm9wcywgLi4uY2hpbGRyZW4pIHtcbiAgaWYgKCF0YWdOYW1lKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0ICRuZXdfZWxlbSA9IHNkY0RvbUZyYWdtZW50KHRhZ05hbWUsIHByb3BzKTtcbiAgZm9yIChjb25zdCBjIG9mIGNoaWxkcmVuKSB7XG4gICAgJG5ld19lbGVtLmFwcGVuZChjKTtcbiAgfVxuICByZXR1cm4gJG5ld19lbGVtO1xuXG59XG5cbmV4cG9ydCBsZXQgYXBwID0ge1xuICBDU1JGX1RPS0VOOiB3aW5kb3cuQ1NSRl9UT0tFTiB8fCAnJyxcbiAgTEFOR1VBR0VfQ09ERTogd2luZG93LkxBTkdVQUdFX0NPREUgfHwgJ2VuJyxcbiAgREVCVUc6IHdpbmRvdy5ERUJVRyB8fCBmYWxzZSxcbiAgVkVSU0lPTjogd2luZG93LlZFUlNJT04gfHwgJzAuMCcsXG4gIHRhZ05hbWVzOiBbXSxcbiAgR2xvYmFsOiBHbG9iYWwsXG4gIHJvb3RDb250cm9sbGVyOiBudWxsLFxuICBnbG9iYWxSb290Q29udHJvbGxlcjogbnVsbCxcbiAgX2lzSW5pdDogZmFsc2UsXG4gIF9vcmlnaW5fdHJpZ2dlcjogbnVsbCxcbiAgX2dsb2JhbENvbnRyb2xsZXJDbGFzc2VzOiBbXSxcblxuICBpbml0X3NkYzogKCkgPT4ge1xuICAgIGlmICghYXBwLl9pc0luaXQpIHtcbiAgICAgIGFwcC5faXNJbml0ID0gdHJ1ZTtcbiAgICAgIGlmICghYXBwLl9vcmlnaW5fdHJpZ2dlcikge1xuICAgICAgICBhcHAuX29yaWdpbl90cmlnZ2VyID0gJC5mbi50cmlnZ2VyO1xuICAgICAgICAkLmZuLnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBjb25zdCBldl90eXBlID0ge30uaGFzT3duUHJvcGVydHkuY2FsbChldmVudCwgXCJ0eXBlXCIpID8gZXZlbnQudHlwZSA6IGV2ZW50O1xuICAgICAgICAgIGlmICghU1REX0VWRU5UX0xJU1QuaW5jbHVkZXMoZXZfdHlwZSkpIHtcbiAgICAgICAgICAgIFNURF9FVkVOVF9MSVNULnB1c2goZXZfdHlwZSk7XG4gICAgICAgICAgICAkKHdpbmRvdykub24oZXZfdHlwZSwgd2luZG93RXZlbnRIYW5kbGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFwcC5fb3JpZ2luX3RyaWdnZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBhcHAudXBkYXRlSnF1ZXJ5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9zZSgpO1xuICAgICAgfVxuXG4gICAgICBpc0Nvbm5lY3RlZCgpO1xuXG4gICAgICBpbml0RXZlbnRzKCk7XG5cbiAgICAgIGFwcC5yb290Q29udHJvbGxlciA9IGFwcC5yb290Q29udHJvbGxlciB8fCBuZXcgQWJzdHJhY3RTREMoKTtcbiAgICAgIGFwcC5nbG9iYWxSb290Q29udHJvbGxlciA9IGFwcC5nbG9iYWxSb290Q29udHJvbGxlciB8fCBuZXcgQWJzdHJhY3RTREMoKTtcbiAgICB9XG5cbiAgICBhcHAudGFnTmFtZXMgPSB0YWdMaXN0KCk7XG5cbiAgICBjb25zdCAkZ2xvYmFsRGl2ID0gJCgnPGRpdj48L2Rpdj4nKTtcbiAgICBHbG9iYWwuZm9yRWFjaCgodGFnTmFtZSkgPT4ge1xuICAgICAgY29uc3QgQ29udHJvbGxlckNsYXNzID0gY29udHJvbGxlckxpc3RbdGFnTmFtZV1bMF07XG4gICAgICAkZ2xvYmFsRGl2LmFwcGVuZChgPCR7Q29udHJvbGxlckNsYXNzLnByb3RvdHlwZS5fdGFnTmFtZX0+PC8ke0NvbnRyb2xsZXJDbGFzcy5wcm90b3R5cGUuX3RhZ05hbWV9PmApO1xuICAgIH0pO1xuXG4gICAgY29uc3Qge3JlZnJlc2hQcm9jZXNzfSA9IHByZXBhcmVSZWZyZXNoUHJvY2VzcyhudWxsLCBhcHAucm9vdENvbnRyb2xsZXIpO1xuXG4gICAgcmV0dXJuIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKGFwcC50YWdOYW1lcywgJGdsb2JhbERpdiwgYXBwLmdsb2JhbFJvb3RDb250cm9sbGVyLCByZWZyZXNoUHJvY2VzcykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoYXBwLnRhZ05hbWVzLCBnZXRCb2R5KCksIGFwcC5yb290Q29udHJvbGxlciwgcmVmcmVzaFByb2Nlc3MpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2gocmVmcmVzaFByb2Nlc3MpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgdXBkYXRlSnF1ZXJ5OiAoKSA9PiB7XG4gICAgJC5mbi5zYWZlUmVwbGFjZSA9IGZ1bmN0aW9uICgkZWxlbSkge1xuICAgICAgcmV0dXJuIGFwcC5zYWZlUmVwbGFjZSgkKHRoaXMpLCAkZWxlbSk7XG4gICAgfVxuICAgICQuZm4uc2FmZUVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGFwcC5zYWZlRW1wdHkoJCh0aGlzKSk7XG4gICAgfVxuICAgICQuZm4uc2FmZVJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhcHAuc2FmZVJlbW92ZSgkKHRoaXMpKTtcbiAgICB9XG4gIH0sXG5cbiAgY29udHJvbGxlclRvVGFnOiAoQ29udHJvbGxlcikgPT4ge1xuICAgIGxldCB0YWdOYW1lID0gY2FtZWxDYXNlVG9UYWdOYW1lKENvbnRyb2xsZXIubmFtZSk7XG4gICAgcmV0dXJuIHRhZ05hbWUucmVwbGFjZSgvLWNvbnRyb2xsZXIkLywgJycpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBDb250cm9sbGVyXG4gICAqL1xuICByZWdpc3Rlckdsb2JhbDogKENvbnRyb2xsZXIpID0+IHtcbiAgICBhcHAucmVnaXN0ZXIoQ29udHJvbGxlcik7XG4gICAgbGV0IHRhZ05hbWUgPSBDb250cm9sbGVyLnByb3RvdHlwZS5fdGFnTmFtZTtcbiAgICBHbG9iYWwucHVzaCh0YWdOYW1lKTtcbiAgfSxcblxuICBjbGVhbkNhY2hlOiAoKSA9PiB7XG4gICAgY2xlYW5DYWNoZSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBDb250cm9sbGVyXG4gICAqL1xuICByZWdpc3RlcjogKENvbnRyb2xsZXIpID0+IHtcbiAgICBsZXQgdGFnTmFtZSA9IGFwcC5jb250cm9sbGVyVG9UYWcoQ29udHJvbGxlcik7XG4gICAgY29udHJvbGxlckxpc3RbdGFnTmFtZV0gPSBbQ29udHJvbGxlciwgW11dO1xuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLl90YWdOYW1lID0gdGFnTmFtZTtcbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBtaXhpbnMgQ29udHJvbGxlciB0YWcgbmFtZXNcbiAgICAgICAqL1xuICAgICAgYWRkTWl4aW46ICguLi5taXhpbnMpID0+IHtcbiAgICAgICAgZm9yIChsZXQgbWl4aW4gb2YgbWl4aW5zKSB7XG4gICAgICAgICAgbGV0IG1peGluTmFtZTtcbiAgICAgICAgICBpZiAodHlwZW9mIG1peGluID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBtaXhpbk5hbWUgPSBjYW1lbENhc2VUb1RhZ05hbWUobWl4aW4pO1xuICAgICAgICAgIH0gZWxzZSBpZiAobWl4aW4pIHtcbiAgICAgICAgICAgIG1peGluTmFtZSA9IGFwcC5jb250cm9sbGVyVG9UYWcobWl4aW4pXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRyb2xsZXJMaXN0W3RhZ05hbWVdWzFdLnB1c2gobWl4aW5OYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuICBwb3N0OiAoY29udHJvbGxlciwgdXJsLCBhcmdzKSA9PiB7XG4gICAgaWYgKCFhcmdzKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuXG4gICAgYXJncy5DU1JGX1RPS0VOID0gYXBwLkNTUkZfVE9LRU47XG4gICAgcmV0dXJuIGFwcC5hamF4KGNvbnRyb2xsZXIsIHVybCwgcGFyYW1zLCAkLnBvc3QpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIGdldDogKGNvbnRyb2xsZXIsIHVybCwgYXJncykgPT4ge1xuICAgIHJldHVybiBhcHAuYWpheChjb250cm9sbGVyLCB1cmwsIGFyZ3MsICQuZ2V0KTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCAkLmdldCBvciAkLnBvc3RcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIGFqYXg6IChjb250cm9sbGVyLCB1cmwsIGFyZ3MsIG1ldGhvZCkgPT4ge1xuICAgIGlmICghYXJncykge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cblxuICAgIGFyZ3MuVkVSU0lPTiA9IGFwcC5WRVJTSU9OO1xuICAgIGFyZ3MuX21ldGhvZCA9IGFyZ3MuX21ldGhvZCB8fCAnYXBpJztcblxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXR1cm4gbWV0aG9kKHVybCwgYXJncykudGhlbigoYSwgYiwgYykgPT4ge1xuICAgICAgICByZXNvbHZlKGEsIGIsIGMpO1xuICAgICAgICBpZiAoYS5zdGF0dXMgPT09ICdyZWRpcmVjdCcpIHtcbiAgICAgICAgICB0cmlnZ2VyKCdvbk5hdkxpbmsnLCBhWyd1cmwtbGluayddKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgYXBwLnJlZnJlc2goY29udHJvbGxlci4kY29udGFpbmVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkuY2F0Y2gocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwO1xuICB9LFxuXG4gIHN1Ym1pdEZvcm1BbmRVcGRhdGVWaWV3OiAoY29udHJvbGxlciwgZm9ybSwgdXJsLCBtZXRob2QpID0+IHtcbiAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSk7XG4gICAgY29uc3QgcmVkaXJlY3RvciA9IChhKSA9PiB7XG4gICAgICBpZiAoYVsndXJsLWxpbmsnXSkge1xuICAgICAgICB0cmlnZ2VyKCdvbk5hdkxpbmsnLCBhWyd1cmwtbGluayddKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYVsndXJsJ107XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBjb25zdCBwID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCAodXJsIHx8IGZvcm0uYWN0aW9uKSwgKG1ldGhvZCB8fCBmb3JtLm1ldGhvZCkpXG4gICAgICAgIC50aGVuKChhLCBiLCBjKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICBpZiAoYS5zdGF0dXMgPT09ICdyZWRpcmVjdCcpIHtcbiAgICAgICAgICAgIHJlZGlyZWN0b3IoYSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGFwcC5yZWZyZXNoKGNvbnRyb2xsZXIuJGNvbnRhaW5lciwgY29udHJvbGxlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoYSwgYiwgYykgPT4ge1xuICAgICAgICAgIGlmIChhLnN0YXR1cyA9PT0gMzAxKSB7XG4gICAgICAgICAgICBhID0gYS5yZXNwb25zZUpTT047XG4gICAgICAgICAgICByZWRpcmVjdG9yKGEpO1xuICAgICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KGEsIGIsIGMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcDtcblxuICB9LFxuXG4gIHN1Ym1pdEZvcm06IChmb3JtLCB1cmwsIG1ldGhvZCkgPT4ge1xuICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCAodXJsIHx8IGZvcm0uYWN0aW9uKSwgKG1ldGhvZCB8fCBmb3JtLm1ldGhvZCkpXG4gICAgICAgIC50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbVxuICAgKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ31cbiAgICovXG4gIGdldENvbnRyb2xsZXI6ICgkZWxlbSkgPT4gZ2V0Q29udHJvbGxlcigkZWxlbSksXG5cbiAgLyoqXG4gICAqIHNhZmVFbXB0eSByZW1vdmVzIGFsbCBjb250ZW50IG9mIGEgZG9tXG4gICAqIGFuZCBkZWxldGVzIGFsbCBjaGlsZCBjb250cm9sbGVyIHNhZmVseS5cbiAgICpcbiAgICogQHBhcmFtICRlbGVtIC0galF1ZXJ5IERPTSBjb250YWluZXIgdG8gYmUgZW1wdHllZFxuICAgKi9cbiAgc2FmZUVtcHR5OiAoJGVsZW0pID0+IHtcbiAgICBsZXQgJGNoaWxkcmVuID0gJGVsZW0uY2hpbGRyZW4oKTtcbiAgICAkY2hpbGRyZW4uZWFjaChmdW5jdGlvbiAoXywgZWxlbWVudCkge1xuICAgICAgbGV0ICRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICAgIGFwcC5zYWZlUmVtb3ZlKCRlbGVtZW50KTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZWxlbTtcbiAgfSxcblxuICAvKipcbiAgICogc2FmZVJlcGxhY2UgcmVtb3ZlcyBhbGwgY29udGVudCBvZiBhIGRvbVxuICAgKiBhbmQgZGVsZXRlcyBhbGwgY2hpbGQgY29udHJvbGxlciBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSAkZWxlbSAtIGpRdWVyeSBET00gdG8gYmUgcmVwbGVhY2VkXG4gICAqIEBwYXJhbSAkbmV3IC0galF1ZXJ5IG5ldyBET00gY29udGFpbmVyXG4gICAqL1xuICBzYWZlUmVwbGFjZTogKCRlbGVtLCAkbmV3KSA9PiB7XG4gICAgJG5ldy5pbnNlcnRCZWZvcmUoJGVsZW0pO1xuICAgIHJldHVybiBhcHAuc2FmZVJlbW92ZSgkZWxlbSk7XG4gIH0sXG5cblxuICAvKipcbiAgICogc2FmZVJlbW92ZSByZW1vdmVzIGEgZG9tIGFuZCBkZWxldGVzIGFsbCBjaGlsZCBjb250cm9sbGVyIHNhZmVseS5cbiAgICpcbiAgICogQHBhcmFtICRlbGVtIC0galF1ZXJ5IERvbVxuICAgKi9cbiAgc2FmZVJlbW92ZTogKCRlbGVtKSA9PiB7XG4gICAgJGVsZW0uZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpO1xuICAgICAgaWYgKCR0aGlzLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKSkge1xuICAgICAgICAkdGhpcy5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCkucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAkZWxlbS5maW5kKGAuJHtDT05UUk9MTEVSX0NMQVNTfWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9ICQodGhpcykuZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApO1xuICAgICAgY29udHJvbGxlciAmJiBjb250cm9sbGVyLnJlbW92ZSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICRlbGVtLnJlbW92ZSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8alF1ZXJ5Pn1cbiAgICovXG4gIHJlbG9hZENvbnRyb2xsZXI6IChjb250cm9sbGVyKSA9PiB7XG4gICAgcmV0dXJuIHJlbG9hZEhUTUxDb250cm9sbGVyKGNvbnRyb2xsZXIpLnRoZW4oKGh0bWwpID0+IHtcbiAgICAgIGxldCAkaHRtbCA9ICQoaHRtbCk7XG4gICAgICByZXR1cm4gYXBwLnJlY29uY2lsZShjb250cm9sbGVyLCAkaHRtbCk7XG4gICAgfSk7XG4gIH0sXG5cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcGFyYW0ge2pxdWVyeX0gJHZpcnR1YWxOb2RlXG4gICAqIEBwYXJhbSB7anF1ZXJ5fSAkcmVhbE5vZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAgICovXG4gIHJlY29uY2lsZTogKGNvbnRyb2xsZXIsICR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlID0gbnVsbCwgcHJvY2VzcyA9IG51bGwpID0+IHtcbiAgICBpZiAoISRyZWFsTm9kZSkge1xuICAgICAgbGV0ICR0ZW1wID0gY29udHJvbGxlci4kY29udGFpbmVyLmNsb25lKCkuZW1wdHkoKTtcbiAgICAgICR0ZW1wLmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSwgbnVsbCk7XG4gICAgICAkdGVtcC5yZW1vdmVDbGFzcyhDT05UUk9MTEVSX0NMQVNTKTtcbiAgICAgICR0ZW1wLmFwcGVuZCgkdmlydHVhbE5vZGUpO1xuICAgICAgJHZpcnR1YWxOb2RlID0gJHRlbXA7XG4gICAgfVxuXG4gICAgJHJlYWxOb2RlID0gJHJlYWxOb2RlID8/IGNvbnRyb2xsZXIuJGNvbnRhaW5lcjtcblxuICAgIGNvbnN0IHtyZWZyZXNoUHJvY2VzcywgaXNSdW5uaW5nUHJvY2Vzc30gPSBwcmVwYXJlUmVmcmVzaFByb2Nlc3MocHJvY2VzcywgY29udHJvbGxlcik7XG5cbiAgICByZXR1cm4gcmVmcmVzaCgkdmlydHVhbE5vZGUsIGNvbnRyb2xsZXIsIHJlZnJlc2hQcm9jZXNzKS50aGVuKCgpID0+IHtcbiAgICAgIHJlY29uY2lsZSgkdmlydHVhbE5vZGUsICRyZWFsTm9kZSk7XG4gICAgICByZXNldENoaWxkcmVuKGNvbnRyb2xsZXIpO1xuICAgICAgaWYgKCFpc1J1bm5pbmdQcm9jZXNzKSB7XG4gICAgICAgIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaChyZWZyZXNoUHJvY2Vzcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udHJvbGxlcjtcbiAgICB9KTtcblxuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2pxdWVyeX0gJGRvbVxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBsZWFmQ29udHJvbGxlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgcmVmcmVzaDogKCRkb20sIGxlYWZDb250cm9sbGVyKSA9PiB7XG4gICAgcmV0dXJuIHJlZnJlc2goJGRvbSwgbGVhZkNvbnRyb2xsZXIpO1xuICB9LFxufTsiXSwibmFtZXMiOlsiY2FtZWxDYXNlVG9UYWdOYW1lIiwiZ2V0Qm9keSIsInVwbG9hZEZpbGVGb3JtRGF0YSIsInJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyIiwicmVsb2FkSFRNTENvbnRyb2xsZXIiLCJEQVRBX0NPTlRST0xMRVJfS0VZIiwiQ09OVFJPTExFUl9DTEFTUyIsImdldENvbnRyb2xsZXIiLCJjbGVhbkNhY2hlIiwicmVmcmVzaCIsIkFic3RyYWN0U0RDIiwiR2xvYmFsIiwiY29udHJvbGxlckxpc3QiLCJ0YWdMaXN0IiwicmVzZXRDaGlsZHJlbiIsInVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaCIsInByZXBhcmVSZWZyZXNoUHJvY2VzcyIsImluaXRFdmVudHMiLCJTVERfRVZFTlRfTElTVCIsIndpbmRvd0V2ZW50SGFuZGxlciIsInJlY29uY2lsZSIsInRyaWdnZXIiLCJpc0Nvbm5lY3RlZCIsImNsb3NlIiwiUFJPUEVSVElFU19VUERBVEUiLCJzZGNEb21GcmFnbWVudCIsImVsZW1lbnQiLCJwcm9wcyIsIiRuZXdfZWxlbSIsImlzX3NlbGYiLCIkIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwidGFnTmFtZSIsIm5hbWUiLCJkYXRhIiwiT2JqZWN0IiwiZW50cmllcyIsImZvckVhY2giLCJrIiwidiIsInN0YXJ0c1dpdGgiLCJhZGRFdmVudExpc3RlbmVyIiwic3Vic3RyaW5nIiwidG9Mb3dlckNhc2UiLCJzZXRBdHRyaWJ1dGUiLCJhZGRDbGFzcyIsIndpbmRvdyIsInNkY0RvbSIsImNoaWxkcmVuIiwiYyIsImFwcGVuZCIsImFwcCIsIkNTUkZfVE9LRU4iLCJMQU5HVUFHRV9DT0RFIiwiREVCVUciLCJWRVJTSU9OIiwidGFnTmFtZXMiLCJyb290Q29udHJvbGxlciIsImdsb2JhbFJvb3RDb250cm9sbGVyIiwiX2lzSW5pdCIsIl9vcmlnaW5fdHJpZ2dlciIsIl9nbG9iYWxDb250cm9sbGVyQ2xhc3NlcyIsImluaXRfc2RjIiwiZm4iLCJldmVudCIsImV2X3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJ0eXBlIiwiaW5jbHVkZXMiLCJwdXNoIiwib24iLCJ1cGRhdGVKcXVlcnkiLCIkZ2xvYmFsRGl2IiwiQ29udHJvbGxlckNsYXNzIiwicHJvdG90eXBlIiwiX3RhZ05hbWUiLCJyZWZyZXNoUHJvY2VzcyIsInRoZW4iLCJyZXMiLCJzYWZlUmVwbGFjZSIsIiRlbGVtIiwic2FmZUVtcHR5Iiwic2FmZVJlbW92ZSIsImNvbnRyb2xsZXJUb1RhZyIsIkNvbnRyb2xsZXIiLCJyZXBsYWNlIiwicmVnaXN0ZXJHbG9iYWwiLCJyZWdpc3RlciIsImFkZE1peGluIiwibWl4aW5zIiwibWl4aW4iLCJtaXhpbk5hbWUiLCJwb3N0IiwiY29udHJvbGxlciIsInVybCIsImFyZ3MiLCJhamF4IiwicGFyYW1zIiwiZ2V0IiwibWV0aG9kIiwiX21ldGhvZCIsInAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImEiLCJiIiwic3RhdHVzIiwiJGNvbnRhaW5lciIsImNhdGNoIiwic3VibWl0Rm9ybUFuZFVwZGF0ZVZpZXciLCJmb3JtIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsInJlZGlyZWN0b3IiLCJsb2NhdGlvbiIsImhyZWYiLCJhY3Rpb24iLCJyZXNwb25zZUpTT04iLCJzdWJtaXRGb3JtIiwiJGNoaWxkcmVuIiwiZWFjaCIsIl8iLCIkZWxlbWVudCIsIiRuZXciLCJpbnNlcnRCZWZvcmUiLCIkdGhpcyIsInJlbW92ZSIsImZpbmQiLCJyZWxvYWRDb250cm9sbGVyIiwiaHRtbCIsIiRodG1sIiwiJHZpcnR1YWxOb2RlIiwiJHJlYWxOb2RlIiwicHJvY2VzcyIsIiR0ZW1wIiwiY2xvbmUiLCJlbXB0eSIsInJlbW92ZUNsYXNzIiwiaXNSdW5uaW5nUHJvY2VzcyIsIiRkb20iLCJsZWFmQ29udHJvbGxlciJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_main.js\n\n}");
67
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ app: () => (/* binding */ app)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n/* harmony import */ var _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractSDC.js */ \"./src/simpleDomControl/AbstractSDC.js\");\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n\n\n\n\n\n\n\n\nconst PROPERTIES_UPDATE = {\n 'classname': 'class'\n};\nlet sdcDomFragment = function (element, props) {\n let $new_elem,\n is_self = false;\n if (typeof element === 'string') {\n $new_elem = $(document.createElement(element));\n } else {\n const tagName = `this.${element.name}`;\n $new_elem = $(document.createElement(tagName));\n $new_elem.data('handler', element);\n is_self = true;\n }\n if (props) {\n Object.entries(props).forEach(([k, v]) => {\n if (k.startsWith('on')) {\n $new_elem[0].addEventListener(k.substring(2).toLowerCase(), v);\n } else {\n if (PROPERTIES_UPDATE[k.toLowerCase()]) {\n k = PROPERTIES_UPDATE[k.toLowerCase()];\n }\n $new_elem[0].setAttribute(k, v);\n }\n });\n }\n if (is_self) {\n $new_elem.addClass('_bind_to_update_handler _with_handler');\n }\n return $new_elem;\n};\nwindow.sdcDom = function (tagName, props, ...children) {\n if (!tagName) {\n return '';\n }\n const $new_elem = sdcDomFragment(tagName, props);\n for (const c of children) {\n $new_elem.append(c);\n }\n return $new_elem;\n};\nlet app = {\n CSRF_TOKEN: window.CSRF_TOKEN || '',\n LANGUAGE_CODE: window.LANGUAGE_CODE || 'en',\n DEBUG: window.DEBUG || false,\n VERSION: window.VERSION || '0.0',\n tagNames: [],\n Global: _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global,\n rootController: null,\n globalRootController: null,\n _isInit: false,\n _origin_trigger: null,\n _globalControllerClasses: [],\n init_sdc: () => {\n if (!app._isInit) {\n app._isInit = true;\n if (!app._origin_trigger) {\n app._origin_trigger = $.fn.trigger;\n $.fn.trigger = function (event) {\n const ev_type = {}.hasOwnProperty.call(event, \"type\") ? event.type : event;\n if (!_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.includes(ev_type)) {\n _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.push(ev_type);\n $(window).on(ev_type, _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.windowEventHandler);\n }\n return app._origin_trigger.call(this, event);\n };\n app.updateJquery();\n } else {\n (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.close)();\n }\n (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.isConnected)();\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.initEvents)();\n app.rootController = app.rootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n app.globalRootController = app.globalRootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n }\n app.tagNames = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.tagList)();\n const $globalDiv = $('<div></div>');\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.forEach(tagName => {\n const ControllerClass = _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][0];\n $globalDiv.append(`<${ControllerClass.prototype._tagName}></${ControllerClass.prototype._tagName}>`);\n });\n const {\n refreshProcess\n } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(null, app.rootController);\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(app.tagNames, $globalDiv, app.globalRootController, refreshProcess).then(() => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(app.tagNames, (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBody)(), app.rootController, refreshProcess).then(res => {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n return res;\n });\n });\n },\n updateJquery: () => {\n $.fn.safeReplace = function ($elem) {\n return app.safeReplace($(this), $elem);\n };\n $.fn.safeEmpty = function () {\n return app.safeEmpty($(this));\n };\n $.fn.safeRemove = function () {\n return app.safeRemove($(this));\n };\n },\n controllerToTag: Controller => {\n let tagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(Controller.name);\n return tagName.replace(/-controller$/, '');\n },\n /**\n *\n * @param {AbstractSDC} Controller\n */\n registerGlobal: Controller => {\n app.register(Controller);\n let tagName = Controller.prototype._tagName;\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.push(tagName);\n },\n cleanCache: () => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.cleanCache)();\n },\n /**\n *\n * @param {AbstractSDC} Controller\n * @param overwrite\n */\n register: (Controller, overwrite = false) => {\n let tagName = app.controllerToTag(Controller);\n if (!_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] || overwrite) {\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] = [Controller, []];\n Controller.prototype._tagName = tagName;\n return {\n /**\n *\n * @param {Array<string>} mixins Controller tag names\n */\n addMixin: (...mixins) => {\n for (let mixin of mixins) {\n let mixinName;\n if (typeof mixin === \"string\") {\n mixinName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(mixin);\n } else if (mixin) {\n mixinName = app.controllerToTag(mixin);\n }\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][1].push(mixinName);\n }\n }\n };\n }\n return {\n addMixin: (...mixins) => {}\n };\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n post: (controller, url, args) => {\n if (!args) {\n args = {};\n }\n args.CSRF_TOKEN = app.CSRF_TOKEN;\n return app.ajax(controller, url, params, $.post);\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n get: (controller, url, args) => {\n return app.ajax(controller, url, args, $.get);\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @param {function} method $.get or $.post\n * @return {Promise}\n */\n ajax: (controller, url, args, method) => {\n if (!args) {\n args = {};\n }\n args.VERSION = app.VERSION;\n args._method = args._method || 'api';\n const p = new Promise((resolve, reject) => {\n return method(url, args).then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === 'redirect') {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)('onNavLink', a['url-link']);\n } else {\n p.then(() => {\n app.refresh(controller.$container);\n });\n }\n }).catch(reject);\n });\n return p;\n },\n submitFormAndUpdateView: (controller, form, url, method) => {\n let formData = new FormData(form);\n const redirector = a => {\n if (a['url-link']) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)('onNavLink', a['url-link']);\n } else {\n window.location.href = a['url'];\n }\n };\n const p = new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method).then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === 'redirect') {\n redirector(a);\n } else {\n p.then(() => {\n app.refresh(controller.$container, controller);\n });\n }\n }).catch((a, b, c) => {\n if (a.status === 301) {\n a = a.responseJSON;\n redirector(a);\n resolve(a, b, c);\n } else {\n reject(a, b, c);\n }\n });\n });\n return p;\n },\n submitForm: (form, url, method) => {\n let formData = new FormData(form);\n return new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method).then(resolve).catch(reject);\n });\n },\n /**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\n getController: $elem => (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($elem),\n /**\n * safeEmpty removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM container to be emptyed\n */\n safeEmpty: $elem => {\n let $children = $elem.children();\n $children.each(function (_, element) {\n let $element = $(element);\n app.safeRemove($element);\n });\n return $elem;\n },\n /**\n * safeReplace removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM to be repleaced\n * @param $new - jQuery new DOM container\n */\n safeReplace: ($elem, $new) => {\n $new.insertBefore($elem);\n return app.safeRemove($elem);\n },\n /**\n * safeRemove removes a dom and deletes all child controller safely.\n *\n * @param $elem - jQuery Dom\n */\n safeRemove: $elem => {\n $elem.each(function () {\n let $this = $(this);\n if ($this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`)) {\n $this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`).remove();\n }\n });\n $elem.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const controller = $(this).data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`);\n controller && controller.remove();\n });\n return $elem.remove();\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @return {Promise<jQuery>}\n */\n reloadController: controller => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reloadHTMLController)(controller).then(html => {\n let $html = $(html);\n return app.reconcile(controller, $html);\n });\n },\n /**\n *\n * @param {AbstractSDC} controller\n * @param {jquery} $virtualNode\n * @param {jquery} $realNode\n * @param {Object} process - Process object containing the refresh process\n */\n reconcile: (controller, $virtualNode, $realNode = null, process = null) => {\n if (!$realNode) {\n let $temp = controller.$container.clone().empty();\n $temp.data(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY, null);\n $temp.removeClass(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS);\n $temp.append($virtualNode);\n $virtualNode = $temp;\n }\n $realNode = $realNode ?? controller.$container;\n const {\n refreshProcess,\n isRunningProcess\n } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(process, controller);\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($virtualNode, controller, refreshProcess).then(() => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reconcile)($virtualNode, $realNode);\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.resetChildren)(controller);\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n return controller;\n });\n },\n /**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @return {Promise<void>}\n */\n refresh: ($dom, leafController) => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($dom, leafController);\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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VUFBVSxDQUFDO01BQ3pCLElBQUksQ0FBQzhDLGdCQUFnQixFQUFFO1FBQ3JCL0gsa0ZBQThCLENBQUMrRCxjQUFjLENBQUM7TUFDaEQ7TUFDQSxPQUFPa0IsVUFBVTtJQUNuQixDQUFDLENBQUM7RUFFSixDQUFDO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0V2RixPQUFPLEVBQUVBLENBQUNzSSxJQUFJLEVBQUVDLGNBQWMsS0FBSztJQUNqQyxPQUFPdkkscURBQU8sQ0FBQ3NJLElBQUksRUFBRUMsY0FBYyxDQUFDO0VBQ3RDO0FBQ0YsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfbWFpbi5qcz8wOGZjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNhbWVsQ2FzZVRvVGFnTmFtZSxcbiAgZ2V0Qm9keSxcbiAgdXBsb2FkRmlsZUZvcm1EYXRhLFxufSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcbmltcG9ydCB7XG4gIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyLFxuICByZWxvYWRIVE1MQ29udHJvbGxlcixcbiAgREFUQV9DT05UUk9MTEVSX0tFWSxcbiAgQ09OVFJPTExFUl9DTEFTUywgZ2V0Q29udHJvbGxlciwgY2xlYW5DYWNoZSwgcmVmcmVzaFxufSBmcm9tIFwiLi9zZGNfdmlldy5qc1wiO1xuaW1wb3J0IHtBYnN0cmFjdFNEQ30gZnJvbSBcIi4vQWJzdHJhY3RTREMuanNcIjtcbmltcG9ydCB7XG4gIEdsb2JhbCxcbiAgY29udHJvbGxlckxpc3QsXG4gIHRhZ0xpc3QsXG4gIHJlc2V0Q2hpbGRyZW4sXG4gIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaCxcbiAgcHJlcGFyZVJlZnJlc2hQcm9jZXNzXG59IGZyb20gXCIuL3NkY19jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQge2luaXRFdmVudHMsIFNURF9FVkVOVF9MSVNULCB3aW5kb3dFdmVudEhhbmRsZXJ9IGZyb20gXCIuL3NkY19kb21fZXZlbnRzLmpzXCI7XG5pbXBvcnQge3JlY29uY2lsZX0gZnJvbSBcIi4vc2RjX3ZpZXcuanNcIjtcbmltcG9ydCB7dHJpZ2dlcn0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuaW1wb3J0IHtpc0Nvbm5lY3RlZCwgY2xvc2V9IGZyb20gXCIuL3NkY19zZXJ2ZXJfY2FsbC5qc1wiO1xuXG5jb25zdCBQUk9QRVJUSUVTX1VQREFURSA9IHsnY2xhc3NuYW1lJzogJ2NsYXNzJ31cblxubGV0IHNkY0RvbUZyYWdtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHByb3BzKSB7XG4gIGxldCAkbmV3X2VsZW0sIGlzX3NlbGYgPSBmYWxzZTtcbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICRuZXdfZWxlbSA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtZW50KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IGB0aGlzLiR7ZWxlbWVudC5uYW1lfWA7XG4gICAgJG5ld19lbGVtID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpKTtcbiAgICAkbmV3X2VsZW0uZGF0YSgnaGFuZGxlcicsIGVsZW1lbnQpO1xuICAgIGlzX3NlbGYgPSB0cnVlXG4gIH1cblxuXG4gIGlmIChwcm9wcykge1xuICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgIGlmIChrLnN0YXJ0c1dpdGgoJ29uJykpIHtcbiAgICAgICAgJG5ld19lbGVtWzBdLmFkZEV2ZW50TGlzdGVuZXIoay5zdWJzdHJpbmcoMikudG9Mb3dlckNhc2UoKSwgdik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoUFJPUEVSVElFU19VUERBVEVbay50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgIGsgPSBQUk9QRVJUSUVTX1VQREFURVtrLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICB9XG4gICAgICAgICRuZXdfZWxlbVswXS5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXNfc2VsZikge1xuICAgICRuZXdfZWxlbS5hZGRDbGFzcygnX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIgX3dpdGhfaGFuZGxlcicpO1xuICB9XG5cbiAgcmV0dXJuICRuZXdfZWxlbTtcbn1cblxud2luZG93LnNkY0RvbSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBwcm9wcywgLi4uY2hpbGRyZW4pIHtcbiAgaWYgKCF0YWdOYW1lKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0ICRuZXdfZWxlbSA9IHNkY0RvbUZyYWdtZW50KHRhZ05hbWUsIHByb3BzKTtcbiAgZm9yIChjb25zdCBjIG9mIGNoaWxkcmVuKSB7XG4gICAgJG5ld19lbGVtLmFwcGVuZChjKTtcbiAgfVxuICByZXR1cm4gJG5ld19lbGVtO1xuXG59XG5cbmV4cG9ydCBsZXQgYXBwID0ge1xuICBDU1JGX1RPS0VOOiB3aW5kb3cuQ1NSRl9UT0tFTiB8fCAnJyxcbiAgTEFOR1VBR0VfQ09ERTogd2luZG93LkxBTkdVQUdFX0NPREUgfHwgJ2VuJyxcbiAgREVCVUc6IHdpbmRvdy5ERUJVRyB8fCBmYWxzZSxcbiAgVkVSU0lPTjogd2luZG93LlZFUlNJT04gfHwgJzAuMCcsXG4gIHRhZ05hbWVzOiBbXSxcbiAgR2xvYmFsOiBHbG9iYWwsXG4gIHJvb3RDb250cm9sbGVyOiBudWxsLFxuICBnbG9iYWxSb290Q29udHJvbGxlcjogbnVsbCxcbiAgX2lzSW5pdDogZmFsc2UsXG4gIF9vcmlnaW5fdHJpZ2dlcjogbnVsbCxcbiAgX2dsb2JhbENvbnRyb2xsZXJDbGFzc2VzOiBbXSxcblxuICBpbml0X3NkYzogKCkgPT4ge1xuICAgIGlmICghYXBwLl9pc0luaXQpIHtcbiAgICAgIGFwcC5faXNJbml0ID0gdHJ1ZTtcbiAgICAgIGlmICghYXBwLl9vcmlnaW5fdHJpZ2dlcikge1xuICAgICAgICBhcHAuX29yaWdpbl90cmlnZ2VyID0gJC5mbi50cmlnZ2VyO1xuICAgICAgICAkLmZuLnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBjb25zdCBldl90eXBlID0ge30uaGFzT3duUHJvcGVydHkuY2FsbChldmVudCwgXCJ0eXBlXCIpID8gZXZlbnQudHlwZSA6IGV2ZW50O1xuICAgICAgICAgIGlmICghU1REX0VWRU5UX0xJU1QuaW5jbHVkZXMoZXZfdHlwZSkpIHtcbiAgICAgICAgICAgIFNURF9FVkVOVF9MSVNULnB1c2goZXZfdHlwZSk7XG4gICAgICAgICAgICAkKHdpbmRvdykub24oZXZfdHlwZSwgd2luZG93RXZlbnRIYW5kbGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFwcC5fb3JpZ2luX3RyaWdnZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBhcHAudXBkYXRlSnF1ZXJ5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9zZSgpO1xuICAgICAgfVxuXG4gICAgICBpc0Nvbm5lY3RlZCgpO1xuXG4gICAgICBpbml0RXZlbnRzKCk7XG5cbiAgICAgIGFwcC5yb290Q29udHJvbGxlciA9IGFwcC5yb290Q29udHJvbGxlciB8fCBuZXcgQWJzdHJhY3RTREMoKTtcbiAgICAgIGFwcC5nbG9iYWxSb290Q29udHJvbGxlciA9IGFwcC5nbG9iYWxSb290Q29udHJvbGxlciB8fCBuZXcgQWJzdHJhY3RTREMoKTtcbiAgICB9XG5cbiAgICBhcHAudGFnTmFtZXMgPSB0YWdMaXN0KCk7XG5cbiAgICBjb25zdCAkZ2xvYmFsRGl2ID0gJCgnPGRpdj48L2Rpdj4nKTtcbiAgICBHbG9iYWwuZm9yRWFjaCgodGFnTmFtZSkgPT4ge1xuICAgICAgY29uc3QgQ29udHJvbGxlckNsYXNzID0gY29udHJvbGxlckxpc3RbdGFnTmFtZV1bMF07XG4gICAgICAkZ2xvYmFsRGl2LmFwcGVuZChgPCR7Q29udHJvbGxlckNsYXNzLnByb3RvdHlwZS5fdGFnTmFtZX0+PC8ke0NvbnRyb2xsZXJDbGFzcy5wcm90b3R5cGUuX3RhZ05hbWV9PmApO1xuICAgIH0pO1xuXG4gICAgY29uc3Qge3JlZnJlc2hQcm9jZXNzfSA9IHByZXBhcmVSZWZyZXNoUHJvY2VzcyhudWxsLCBhcHAucm9vdENvbnRyb2xsZXIpO1xuXG4gICAgcmV0dXJuIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKGFwcC50YWdOYW1lcywgJGdsb2JhbERpdiwgYXBwLmdsb2JhbFJvb3RDb250cm9sbGVyLCByZWZyZXNoUHJvY2VzcykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoYXBwLnRhZ05hbWVzLCBnZXRCb2R5KCksIGFwcC5yb290Q29udHJvbGxlciwgcmVmcmVzaFByb2Nlc3MpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2gocmVmcmVzaFByb2Nlc3MpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgdXBkYXRlSnF1ZXJ5OiAoKSA9PiB7XG4gICAgJC5mbi5zYWZlUmVwbGFjZSA9IGZ1bmN0aW9uICgkZWxlbSkge1xuICAgICAgcmV0dXJuIGFwcC5zYWZlUmVwbGFjZSgkKHRoaXMpLCAkZWxlbSk7XG4gICAgfVxuICAgICQuZm4uc2FmZUVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGFwcC5zYWZlRW1wdHkoJCh0aGlzKSk7XG4gICAgfVxuICAgICQuZm4uc2FmZVJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhcHAuc2FmZVJlbW92ZSgkKHRoaXMpKTtcbiAgICB9XG4gIH0sXG5cbiAgY29udHJvbGxlclRvVGFnOiAoQ29udHJvbGxlcikgPT4ge1xuICAgIGxldCB0YWdOYW1lID0gY2FtZWxDYXNlVG9UYWdOYW1lKENvbnRyb2xsZXIubmFtZSk7XG4gICAgcmV0dXJuIHRhZ05hbWUucmVwbGFjZSgvLWNvbnRyb2xsZXIkLywgJycpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBDb250cm9sbGVyXG4gICAqL1xuICByZWdpc3Rlckdsb2JhbDogKENvbnRyb2xsZXIpID0+IHtcbiAgICBhcHAucmVnaXN0ZXIoQ29udHJvbGxlcik7XG4gICAgbGV0IHRhZ05hbWUgPSBDb250cm9sbGVyLnByb3RvdHlwZS5fdGFnTmFtZTtcbiAgICBHbG9iYWwucHVzaCh0YWdOYW1lKTtcbiAgfSxcblxuICBjbGVhbkNhY2hlOiAoKSA9PiB7XG4gICAgY2xlYW5DYWNoZSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBDb250cm9sbGVyXG4gICAqIEBwYXJhbSBvdmVyd3JpdGVcbiAgICovXG4gIHJlZ2lzdGVyOiAoQ29udHJvbGxlciwgb3ZlcndyaXRlID0gZmFsc2UpID0+IHtcbiAgICBsZXQgdGFnTmFtZSA9IGFwcC5jb250cm9sbGVyVG9UYWcoQ29udHJvbGxlcik7XG4gICAgaWYgKCFjb250cm9sbGVyTGlzdFt0YWdOYW1lXSB8fCBvdmVyd3JpdGUpIHtcbiAgICAgIGNvbnRyb2xsZXJMaXN0W3RhZ05hbWVdID0gW0NvbnRyb2xsZXIsIFtdXTtcbiAgICAgIENvbnRyb2xsZXIucHJvdG90eXBlLl90YWdOYW1lID0gdGFnTmFtZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gbWl4aW5zIENvbnRyb2xsZXIgdGFnIG5hbWVzXG4gICAgICAgICAqL1xuICAgICAgICBhZGRNaXhpbjogKC4uLm1peGlucykgPT4ge1xuICAgICAgICAgIGZvciAobGV0IG1peGluIG9mIG1peGlucykge1xuICAgICAgICAgICAgbGV0IG1peGluTmFtZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWl4aW4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgbWl4aW5OYW1lID0gY2FtZWxDYXNlVG9UYWdOYW1lKG1peGluKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWl4aW4pIHtcbiAgICAgICAgICAgICAgbWl4aW5OYW1lID0gYXBwLmNvbnRyb2xsZXJUb1RhZyhtaXhpbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRyb2xsZXJMaXN0W3RhZ05hbWVdWzFdLnB1c2gobWl4aW5OYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZE1peGluOiAoLi4ubWl4aW5zKSA9PiB7fVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuICBwb3N0OiAoY29udHJvbGxlciwgdXJsLCBhcmdzKSA9PiB7XG4gICAgaWYgKCFhcmdzKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuXG4gICAgYXJncy5DU1JGX1RPS0VOID0gYXBwLkNTUkZfVE9LRU47XG4gICAgcmV0dXJuIGFwcC5hamF4KGNvbnRyb2xsZXIsIHVybCwgcGFyYW1zLCAkLnBvc3QpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIGdldDogKGNvbnRyb2xsZXIsIHVybCwgYXJncykgPT4ge1xuICAgIHJldHVybiBhcHAuYWpheChjb250cm9sbGVyLCB1cmwsIGFyZ3MsICQuZ2V0KTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCAkLmdldCBvciAkLnBvc3RcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIGFqYXg6IChjb250cm9sbGVyLCB1cmwsIGFyZ3MsIG1ldGhvZCkgPT4ge1xuICAgIGlmICghYXJncykge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cblxuICAgIGFyZ3MuVkVSU0lPTiA9IGFwcC5WRVJTSU9OO1xuICAgIGFyZ3MuX21ldGhvZCA9IGFyZ3MuX21ldGhvZCB8fCAnYXBpJztcblxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXR1cm4gbWV0aG9kKHVybCwgYXJncykudGhlbigoYSwgYiwgYykgPT4ge1xuICAgICAgICByZXNvbHZlKGEsIGIsIGMpO1xuICAgICAgICBpZiAoYS5zdGF0dXMgPT09ICdyZWRpcmVjdCcpIHtcbiAgICAgICAgICB0cmlnZ2VyKCdvbk5hdkxpbmsnLCBhWyd1cmwtbGluayddKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgYXBwLnJlZnJlc2goY29udHJvbGxlci4kY29udGFpbmVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkuY2F0Y2gocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwO1xuICB9LFxuXG4gIHN1Ym1pdEZvcm1BbmRVcGRhdGVWaWV3OiAoY29udHJvbGxlciwgZm9ybSwgdXJsLCBtZXRob2QpID0+IHtcbiAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSk7XG4gICAgY29uc3QgcmVkaXJlY3RvciA9IChhKSA9PiB7XG4gICAgICBpZiAoYVsndXJsLWxpbmsnXSkge1xuICAgICAgICB0cmlnZ2VyKCdvbk5hdkxpbmsnLCBhWyd1cmwtbGluayddKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYVsndXJsJ107XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBjb25zdCBwID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCAodXJsIHx8IGZvcm0uYWN0aW9uKSwgKG1ldGhvZCB8fCBmb3JtLm1ldGhvZCkpXG4gICAgICAgIC50aGVuKChhLCBiLCBjKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICBpZiAoYS5zdGF0dXMgPT09ICdyZWRpcmVjdCcpIHtcbiAgICAgICAgICAgIHJlZGlyZWN0b3IoYSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGFwcC5yZWZyZXNoKGNvbnRyb2xsZXIuJGNvbnRhaW5lciwgY29udHJvbGxlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoYSwgYiwgYykgPT4ge1xuICAgICAgICAgIGlmIChhLnN0YXR1cyA9PT0gMzAxKSB7XG4gICAgICAgICAgICBhID0gYS5yZXNwb25zZUpTT047XG4gICAgICAgICAgICByZWRpcmVjdG9yKGEpO1xuICAgICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KGEsIGIsIGMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcDtcblxuICB9LFxuXG4gIHN1Ym1pdEZvcm06IChmb3JtLCB1cmwsIG1ldGhvZCkgPT4ge1xuICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCAodXJsIHx8IGZvcm0uYWN0aW9uKSwgKG1ldGhvZCB8fCBmb3JtLm1ldGhvZCkpXG4gICAgICAgIC50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbVxuICAgKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ31cbiAgICovXG4gIGdldENvbnRyb2xsZXI6ICgkZWxlbSkgPT4gZ2V0Q29udHJvbGxlcigkZWxlbSksXG5cbiAgLyoqXG4gICAqIHNhZmVFbXB0eSByZW1vdmVzIGFsbCBjb250ZW50IG9mIGEgZG9tXG4gICAqIGFuZCBkZWxldGVzIGFsbCBjaGlsZCBjb250cm9sbGVyIHNhZmVseS5cbiAgICpcbiAgICogQHBhcmFtICRlbGVtIC0galF1ZXJ5IERPTSBjb250YWluZXIgdG8gYmUgZW1wdHllZFxuICAgKi9cbiAgc2FmZUVtcHR5OiAoJGVsZW0pID0+IHtcbiAgICBsZXQgJGNoaWxkcmVuID0gJGVsZW0uY2hpbGRyZW4oKTtcbiAgICAkY2hpbGRyZW4uZWFjaChmdW5jdGlvbiAoXywgZWxlbWVudCkge1xuICAgICAgbGV0ICRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICAgIGFwcC5zYWZlUmVtb3ZlKCRlbGVtZW50KTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZWxlbTtcbiAgfSxcblxuICAvKipcbiAgICogc2FmZVJlcGxhY2UgcmVtb3ZlcyBhbGwgY29udGVudCBvZiBhIGRvbVxuICAgKiBhbmQgZGVsZXRlcyBhbGwgY2hpbGQgY29udHJvbGxlciBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSAkZWxlbSAtIGpRdWVyeSBET00gdG8gYmUgcmVwbGVhY2VkXG4gICAqIEBwYXJhbSAkbmV3IC0galF1ZXJ5IG5ldyBET00gY29udGFpbmVyXG4gICAqL1xuICBzYWZlUmVwbGFjZTogKCRlbGVtLCAkbmV3KSA9PiB7XG4gICAgJG5ldy5pbnNlcnRCZWZvcmUoJGVsZW0pO1xuICAgIHJldHVybiBhcHAuc2FmZVJlbW92ZSgkZWxlbSk7XG4gIH0sXG5cblxuICAvKipcbiAgICogc2FmZVJlbW92ZSByZW1vdmVzIGEgZG9tIGFuZCBkZWxldGVzIGFsbCBjaGlsZCBjb250cm9sbGVyIHNhZmVseS5cbiAgICpcbiAgICogQHBhcmFtICRlbGVtIC0galF1ZXJ5IERvbVxuICAgKi9cbiAgc2FmZVJlbW92ZTogKCRlbGVtKSA9PiB7XG4gICAgJGVsZW0uZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpO1xuICAgICAgaWYgKCR0aGlzLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKSkge1xuICAgICAgICAkdGhpcy5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCkucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAkZWxlbS5maW5kKGAuJHtDT05UUk9MTEVSX0NMQVNTfWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9ICQodGhpcykuZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApO1xuICAgICAgY29udHJvbGxlciAmJiBjb250cm9sbGVyLnJlbW92ZSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICRlbGVtLnJlbW92ZSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8alF1ZXJ5Pn1cbiAgICovXG4gIHJlbG9hZENvbnRyb2xsZXI6IChjb250cm9sbGVyKSA9PiB7XG4gICAgcmV0dXJuIHJlbG9hZEhUTUxDb250cm9sbGVyKGNvbnRyb2xsZXIpLnRoZW4oKGh0bWwpID0+IHtcbiAgICAgIGxldCAkaHRtbCA9ICQoaHRtbCk7XG4gICAgICByZXR1cm4gYXBwLnJlY29uY2lsZShjb250cm9sbGVyLCAkaHRtbCk7XG4gICAgfSk7XG4gIH0sXG5cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcGFyYW0ge2pxdWVyeX0gJHZpcnR1YWxOb2RlXG4gICAqIEBwYXJhbSB7anF1ZXJ5fSAkcmVhbE5vZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAgICovXG4gIHJlY29uY2lsZTogKGNvbnRyb2xsZXIsICR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlID0gbnVsbCwgcHJvY2VzcyA9IG51bGwpID0+IHtcbiAgICBpZiAoISRyZWFsTm9kZSkge1xuICAgICAgbGV0ICR0ZW1wID0gY29udHJvbGxlci4kY29udGFpbmVyLmNsb25lKCkuZW1wdHkoKTtcbiAgICAgICR0ZW1wLmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSwgbnVsbCk7XG4gICAgICAkdGVtcC5yZW1vdmVDbGFzcyhDT05UUk9MTEVSX0NMQVNTKTtcbiAgICAgICR0ZW1wLmFwcGVuZCgkdmlydHVhbE5vZGUpO1xuICAgICAgJHZpcnR1YWxOb2RlID0gJHRlbXA7XG4gICAgfVxuXG4gICAgJHJlYWxOb2RlID0gJHJlYWxOb2RlID8/IGNvbnRyb2xsZXIuJGNvbnRhaW5lcjtcblxuICAgIGNvbnN0IHtyZWZyZXNoUHJvY2VzcywgaXNSdW5uaW5nUHJvY2Vzc30gPSBwcmVwYXJlUmVmcmVzaFByb2Nlc3MocHJvY2VzcywgY29udHJvbGxlcik7XG5cbiAgICByZXR1cm4gcmVmcmVzaCgkdmlydHVhbE5vZGUsIGNvbnRyb2xsZXIsIHJlZnJlc2hQcm9jZXNzKS50aGVuKCgpID0+IHtcbiAgICAgIHJlY29uY2lsZSgkdmlydHVhbE5vZGUsICRyZWFsTm9kZSk7XG4gICAgICByZXNldENoaWxkcmVuKGNvbnRyb2xsZXIpO1xuICAgICAgaWYgKCFpc1J1bm5pbmdQcm9jZXNzKSB7XG4gICAgICAgIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaChyZWZyZXNoUHJvY2Vzcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udHJvbGxlcjtcbiAgICB9KTtcblxuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2pxdWVyeX0gJGRvbVxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBsZWFmQ29udHJvbGxlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgcmVmcmVzaDogKCRkb20sIGxlYWZDb250cm9sbGVyKSA9PiB7XG4gICAgcmV0dXJuIHJlZnJlc2goJGRvbSwgbGVhZkNvbnRyb2xsZXIpO1xuICB9LFxufTsiXSwibmFtZXMiOlsiY2FtZWxDYXNlVG9UYWdOYW1lIiwiZ2V0Qm9keSIsInVwbG9hZEZpbGVGb3JtRGF0YSIsInJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyIiwicmVsb2FkSFRNTENvbnRyb2xsZXIiLCJEQVRBX0NPTlRST0xMRVJfS0VZIiwiQ09OVFJPTExFUl9DTEFTUyIsImdldENvbnRyb2xsZXIiLCJjbGVhbkNhY2hlIiwicmVmcmVzaCIsIkFic3RyYWN0U0RDIiwiR2xvYmFsIiwiY29udHJvbGxlckxpc3QiLCJ0YWdMaXN0IiwicmVzZXRDaGlsZHJlbiIsInVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaCIsInByZXBhcmVSZWZyZXNoUHJvY2VzcyIsImluaXRFdmVudHMiLCJTVERfRVZFTlRfTElTVCIsIndpbmRvd0V2ZW50SGFuZGxlciIsInJlY29uY2lsZSIsInRyaWdnZXIiLCJpc0Nvbm5lY3RlZCIsImNsb3NlIiwiUFJPUEVSVElFU19VUERBVEUiLCJzZGNEb21GcmFnbWVudCIsImVsZW1lbnQiLCJwcm9wcyIsIiRuZXdfZWxlbSIsImlzX3NlbGYiLCIkIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwidGFnTmFtZSIsIm5hbWUiLCJkYXRhIiwiT2JqZWN0IiwiZW50cmllcyIsImZvckVhY2giLCJrIiwidiIsInN0YXJ0c1dpdGgiLCJhZGRFdmVudExpc3RlbmVyIiwic3Vic3RyaW5nIiwidG9Mb3dlckNhc2UiLCJzZXRBdHRyaWJ1dGUiLCJhZGRDbGFzcyIsIndpbmRvdyIsInNkY0RvbSIsImNoaWxkcmVuIiwiYyIsImFwcGVuZCIsImFwcCIsIkNTUkZfVE9LRU4iLCJMQU5HVUFHRV9DT0RFIiwiREVCVUciLCJWRVJTSU9OIiwidGFnTmFtZXMiLCJyb290Q29udHJvbGxlciIsImdsb2JhbFJvb3RDb250cm9sbGVyIiwiX2lzSW5pdCIsIl9vcmlnaW5fdHJpZ2dlciIsIl9nbG9iYWxDb250cm9sbGVyQ2xhc3NlcyIsImluaXRfc2RjIiwiZm4iLCJldmVudCIsImV2X3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJ0eXBlIiwiaW5jbHVkZXMiLCJwdXNoIiwib24iLCJ1cGRhdGVKcXVlcnkiLCIkZ2xvYmFsRGl2IiwiQ29udHJvbGxlckNsYXNzIiwicHJvdG90eXBlIiwiX3RhZ05hbWUiLCJyZWZyZXNoUHJvY2VzcyIsInRoZW4iLCJyZXMiLCJzYWZlUmVwbGFjZSIsIiRlbGVtIiwic2FmZUVtcHR5Iiwic2FmZVJlbW92ZSIsImNvbnRyb2xsZXJUb1RhZyIsIkNvbnRyb2xsZXIiLCJyZXBsYWNlIiwicmVnaXN0ZXJHbG9iYWwiLCJyZWdpc3RlciIsIm92ZXJ3cml0ZSIsImFkZE1peGluIiwibWl4aW5zIiwibWl4aW4iLCJtaXhpbk5hbWUiLCJwb3N0IiwiY29udHJvbGxlciIsInVybCIsImFyZ3MiLCJhamF4IiwicGFyYW1zIiwiZ2V0IiwibWV0aG9kIiwiX21ldGhvZCIsInAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImEiLCJiIiwic3RhdHVzIiwiJGNvbnRhaW5lciIsImNhdGNoIiwic3VibWl0Rm9ybUFuZFVwZGF0ZVZpZXciLCJmb3JtIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsInJlZGlyZWN0b3IiLCJsb2NhdGlvbiIsImhyZWYiLCJhY3Rpb24iLCJyZXNwb25zZUpTT04iLCJzdWJtaXRGb3JtIiwiJGNoaWxkcmVuIiwiZWFjaCIsIl8iLCIkZWxlbWVudCIsIiRuZXciLCJpbnNlcnRCZWZvcmUiLCIkdGhpcyIsInJlbW92ZSIsImZpbmQiLCJyZWxvYWRDb250cm9sbGVyIiwiaHRtbCIsIiRodG1sIiwiJHZpcnR1YWxOb2RlIiwiJHJlYWxOb2RlIiwicHJvY2VzcyIsIiR0ZW1wIiwiY2xvbmUiLCJlbXB0eSIsInJlbW92ZUNsYXNzIiwiaXNSdW5uaW5nUHJvY2VzcyIsIiRkb20iLCJsZWFmQ29udHJvbGxlciJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_main.js\n\n}");
68
68
 
69
69
  /***/ }),
70
70
 
@@ -94,7 +94,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
94
94
  \********************************************/
95
95
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
96
96
 
97
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Model: () => (/* binding */ Model)\n/* harmony export */ });\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n\nconst MAX_FILE_UPLOAD = 25000;\nclass SubModel {\n constructor(pk, model) {\n this.pk = pk;\n this._model = model;\n }\n\n /**\n * SDC Model Name\n * @param {string} model\n */\n set model(model) {\n this._model = model;\n }\n get model() {\n return this._model;\n }\n\n /**\n * Load the sub model.\n *\n * @param {AbstractSDC} controller\n * @returns {Model}\n */\n load(controller) {\n if (!this._model) {\n throw new TypeError(\"Model is not set!!\");\n }\n if (this.pk instanceof Array) {\n return controller.newModel(this._model, {\n pk__in: this.pk\n });\n }\n return controller.newModel(this._model, {\n pk: this.pk\n });\n }\n}\nconst ModelProxyHandler = {\n get(target, key) {\n const value = target[key] ?? undefined;\n if (value instanceof SubModel) {\n if (!value.pk && value.pk !== 0) {\n return null;\n }\n let newVal;\n if (value.pk instanceof Array) {\n newVal = value.pk.slice();\n } else {\n newVal = new Number(value.pk);\n }\n newVal.load = value.load.bind(value);\n return newVal;\n }\n return value;\n },\n set(target, key, value) {\n if (key in target) {\n const oldVal = target[key];\n if (oldVal instanceof SubModel) {\n if (value.hasOwnProperty('pk')) {\n oldVal.pk = value.pk;\n } else {\n try {\n oldVal.pk = JSON.parse(value);\n } catch {\n oldVal.pk = value;\n }\n }\n } else {\n target[key] = value;\n }\n } else {\n target[key] = value;\n }\n return true;\n }\n};\nfunction parse_hidden_inputs(value) {\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n if (value.toLowerCase().match(isBoolReg)) {\n return value.toLowerCase() === 'true';\n } else if (value === 'undefined') {\n return undefined;\n } else if (value.toLowerCase() === 'none') {\n return null;\n } else if (value.match(isIntReg)) {\n return parseInt(value);\n } else if (value.match(isFloatReg)) {\n return parseFloat(value);\n } else if (value.match(isStringReg)) {\n return value.substring(1, value.length - 1);\n }\n return value;\n}\nclass Model {\n /**\n *\n * @param model_name {string}\n * @param model_query {json}\n */\n constructor(model_name, model_query = {}) {\n this._onNoOpenRequests = [];\n this.values_list = [];\n this.values = {};\n this.model_name = model_name;\n this.model_query = model_query;\n this._is_connected = false;\n this._is_conneting_process = false;\n this._auto_reconnect = true;\n this.socket = null;\n this.open_request = {};\n this.on_update = () => {};\n this.on_create = () => {};\n this.form_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n }\n [Symbol.iterator]() {\n let idx = -1;\n return {\n next: () => {\n ++idx;\n if (idx < this.values_list.length) {\n return {\n value: this.values_list[idx],\n done: false\n };\n }\n return {\n value: null,\n done: true\n };\n }\n };\n }\n length() {\n return this.values_list.length;\n }\n byPk(pk) {\n if (pk !== null) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let elem = this.values_list.find(elm => elm.pk === pk);\n if (!elem) {\n elem = new Proxy({\n pk: pk\n }, ModelProxyHandler);\n this.values_list.push(elem);\n }\n return elem;\n }\n return {\n pk: pk\n };\n }\n filter(model_query) {\n this.model_query = Object.assign({}, this.model_query, model_query);\n return this;\n }\n load() {\n return this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'load',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n });\n }\n listView(filter = {}, cbResolve = null, cbReject = null, templateContext = {}) {\n return this.view({\n filter,\n cbResolve,\n cbReject,\n templateContext\n });\n }\n view({\n viewName = 'html_list_template',\n filter = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n let $div_list = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'named_view',\n event_id: id,\n args: {\n view_name: viewName,\n model_name: this.model_name,\n model_query: this.model_query,\n filter,\n template_context: templateContext\n }\n }));\n this.open_request[id] = [data => {\n $div_list.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_list);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n });\n return $div_list;\n }\n detailView(pk = null, cb_resolve = null, cb_reject = null, template_context = {}) {\n pk = pk ?? -1;\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let $div_list = $('<div class=\"container-fluid\">');\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n load_promise.then(() => {\n if (pk === -1) {\n pk = this.values_list[0].pk;\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'detail_view',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk,\n template_context\n }\n }));\n this.open_request[id] = [data => {\n $div_list.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_list);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n });\n return $div_list;\n }\n syncFormToModel($forms) {\n return this.syncForm($forms);\n }\n syncModelToForm($forms) {\n if (!$forms || !$forms.hasClass(this.form_id)) {\n $forms = $(`.${this.form_id}`);\n }\n let self = this;\n $forms.each(function () {\n if (!this.hasAttribute('data-model_pk')) {\n return;\n }\n let pk = $(this).data('model_pk');\n let instance = self.byPk(pk);\n for (let form_item of this.elements) {\n let name = form_item.name;\n if (name && name !== '') {\n if (form_item.type === 'checkbox') {\n form_item.checked = instance[name];\n } else if (form_item.type === 'file' && instance[name] instanceof File) {\n let container = new DataTransfer();\n container.items.add(instance[name]);\n form_item.files = container;\n } else {\n $(form_item).val(instance[name]);\n }\n }\n }\n });\n }\n syncForm($forms) {\n if (!$forms || !$forms.hasClass(this.form_id)) {\n $forms = $(`.${this.form_id}`);\n }\n const self = this;\n let instances = [];\n $forms.each(function () {\n let $form = $(this);\n let pk = $form.data('model_pk');\n let instance = self.byPk(pk);\n for (let form_item of this.elements) {\n let name = form_item.name;\n if (name && name !== '') {\n if (form_item.type === 'hidden') {\n instance[name] = parse_hidden_inputs($(form_item).val());\n } else if (form_item.type === 'checkbox') {\n instance[name] = form_item.checked;\n } else if (form_item.type === 'file') {\n instance[name] = form_item.files[0];\n } else {\n instance[name] = $(form_item).val();\n }\n }\n }\n instances.push(instance);\n return instance;\n });\n if (this.values_list.length <= 1 && instances.length > 0) {\n this.values = instances.at(-1);\n }\n return instances;\n }\n createForm(cb_resolve = null, cb_reject = null) {\n let $div_form = $('<div>');\n this.isConnected().then(() => {\n this._getForm(null, 'create_form', null, $div_form, cb_resolve, cb_reject);\n });\n return $div_form;\n }\n editForm(pk = -1, cb_resolve = null, cb_reject = null) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n let $div_form = $('<div>');\n load_promise.then(() => {\n if (pk <= -1) {\n pk = this.values_list.at(pk).pk;\n }\n this._getForm(pk, 'edit_form', null, $div_form, cb_resolve, cb_reject);\n });\n return $div_form;\n }\n namedForm(pk = -1, formName, cb_resolve = null, cb_reject = null) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n let $div_form = $('<div class=\"container-fluid\">');\n load_promise.then(() => {\n if (pk <= -1) {\n pk = this.values_list.at(pk).pk;\n }\n this._getForm(pk, 'named_form', formName, $div_form, cb_resolve, cb_reject);\n });\n return $div_form;\n }\n _getForm(pk, event_type, formName, $div_form, cb_resolve, cb_reject) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: event_type,\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk: pk,\n form_name: formName\n }\n }));\n const className = pk === null || pk === -1 ? 'create' : 'edit';\n this.open_request[id] = [data => {\n $div_form.append(data.html);\n let $form = $div_form.closest('form').addClass(`sdc-model-${className}-form sdc-model-form ${this.form_id}`).data('model', this).data('model_pk', pk).data('form_name', formName);\n if ($form.length > 0 && !$form[0].hasAttribute('sdc_submit')) {\n $form.attr('sdc_submit', 'submitModelFormDistributor');\n }\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_form);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n }\n new() {\n return new Promise((resolve, reject) => {\n const $form = $('<form>').append(this.createForm(() => {\n this.syncFormToModel($form);\n resolve();\n }, reject));\n });\n }\n save(pk = -1, fromName = 'edit_form') {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n return this.isConnected().then(() => {\n let elem_list;\n if (pk > -1) {\n elem_list = [this.byPk(pk)];\n } else {\n elem_list = this.values_list;\n }\n let p_list = [];\n elem_list.forEach(elem => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n p_list.push(new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'save',\n event_id: id,\n args: {\n form_name: fromName,\n model_name: this.model_name,\n model_query: this.model_query,\n data: elem,\n files: files\n }\n }));\n this.open_request[id] = [res => {\n let data = typeof res.data.instance === 'string' ? JSON.parse(res.data.instance) : res.data.instance;\n res.data.instance = this._parseServerRes(data);\n resolve(res);\n }, reject];\n });\n }));\n });\n return Promise.all(p_list);\n });\n }\n create(values = this.values) {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this._readFiles(values).then(files => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'create',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n data: values,\n files: files\n }\n }));\n this.open_request[id] = [res => {\n let data = typeof res.data.instance === 'string' ? JSON.parse(res.data.instance) : res.data.instance;\n if (this.values?.pk === -1) {\n this.values_list = [];\n this.values = null;\n }\n res.data.instance = this._parseServerRes(data)[0];\n resolve(res);\n }, reject];\n });\n });\n });\n }\n delete(pk = -1) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n if (pk === -1) pk = this.values?.pk;\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'delete',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk: pk\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n });\n }\n isConnected() {\n return new Promise((resolve, reject) => {\n if (this._is_connected) {\n resolve();\n } else if (!this._is_conneting_process) {\n this._is_conneting_process = true;\n this.open_request['_connecting_process'] = [() => {}, () => {}];\n this._connectToServer().then(() => {\n resolve(this._checkConnection());\n });\n } else {\n const [resolve_origin, reject_origin] = this.open_request['_connecting_process'];\n this.open_request['_connecting_process'] = [() => {\n resolve_origin();\n resolve();\n }, () => {\n reject_origin();\n reject();\n }];\n }\n });\n }\n close() {\n if (this.socket) {\n this._auto_reconnect = false;\n this.socket.onclose = () => {};\n this.socket.close();\n delete this['socket'];\n }\n }\n clean() {\n this.values_list = [];\n this.values = {};\n return this;\n }\n _readFiles(elem) {\n let to_solve = [];\n 100;\n let files = {};\n for (const [key, value] of Object.entries(elem)) {\n if (value instanceof File) {\n to_solve.push(new Promise((resolve, reject) => {\n ((key, value) => {\n let reader = new FileReader();\n reader.onload = e => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.open_request[id] = [resolve, reject];\n let result = e.target.result;\n let number_of_chunks = parseInt(Math.ceil(result.length / MAX_FILE_UPLOAD));\n files[key] = {\n id: id,\n file_name: value.name,\n field_name: key,\n content_length: value.size\n };\n for (let i = 0; i < number_of_chunks; ++i) {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'upload',\n event_id: id,\n args: {\n chunk: result.slice(MAX_FILE_UPLOAD * i, MAX_FILE_UPLOAD * (i + 1)),\n idx: i,\n number_of_chunks: number_of_chunks,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n content_type: value.type,\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n }\n };\n reader.onerror = () => {\n reject();\n };\n reader.readAsBinaryString(value);\n })(key, value);\n }));\n }\n }\n return Promise.all(to_solve).then(() => {\n return files;\n });\n }\n _onMessage(e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (this.open_request.hasOwnProperty(data.event_id)) {\n this.open_request[data.event_id][1](data);\n this._closeOpenRequest(data.event_id);\n }\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushErrorMsg', data.header || '', data.msg || '');\n }\n if (data.type === 'connect') {\n this.open_request['_connecting_process'][1](data);\n this._closeOpenRequest('_connecting_process');\n this._auto_reconnect = false;\n this.socket.close();\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushMsg', data.header || '', data.msg || '');\n }\n if (data.type === 'connect') {\n this._is_connected = true;\n this._is_conneting_process = false;\n this.open_request['_connecting_process'][0](data);\n this._closeOpenRequest('_connecting_process');\n } else if (['load', 'named_view', 'detail_view'].includes(data.type)) {\n const json_res = JSON.parse(data.args.data);\n this.values_list = [];\n data.args.data = this._parseServerRes(json_res);\n } else if (data.type === 'on_update' || data.type === 'on_create') {\n const json_res = JSON.parse(data.args.data);\n let obj = this._parseServerRes(json_res);\n let cb;\n if (data.type === 'on_create') {\n cb = this.on_create;\n } else {\n cb = this.on_update;\n }\n cb(obj);\n data.args.data = obj;\n }\n let instance = data.data?.instance;\n if (instance) {\n data.data.instance = JSON.parse(data.data.instance);\n }\n if (this.open_request.hasOwnProperty(data.event_id)) {\n this.open_request[data.event_id][0](data);\n this._closeOpenRequest(data.event_id);\n }\n }\n }\n noOpenRequests() {\n return new Promise(resolve => {\n if (Object.keys(this.open_request).length === 0) {\n return resolve();\n }\n this._onNoOpenRequests.push(resolve);\n });\n }\n _closeOpenRequest(event_id) {\n delete this.open_request[event_id];\n if (Object.keys(this.open_request).length === 0) {\n this._onNoOpenRequests.forEach(x => x());\n this._onNoOpenRequests = [];\n }\n }\n _connectToServer() {\n return new Promise(resolve => {\n const model_identifier = `${this.model_name}` + (this.model_id > 0 ? `/${this.model_id}` : '');\n if (window.location.protocol === \"https:\") {\n this.socket = new WebSocket(`wss://${window.location.host}/sdc_ws/model/${model_identifier}`);\n } else {\n this.socket = new WebSocket(`ws://${window.location.host}/sdc_ws/model/${model_identifier}`);\n }\n this.socket.onmessage = this._onMessage.bind(this);\n this.socket.onclose = e => {\n console.error(`SDC Model (${this.model_name}, ${this.model_id}) Socket closed unexpectedly`);\n this._is_connected = false;\n for (const [_key, value] of Object.entries(this.open_request)) {\n value[1](e);\n }\n this.open_request = {};\n setTimeout(() => {\n if (this._auto_reconnect) {\n this._connectToServer().then(() => {});\n }\n }, 1000);\n };\n this.socket.onerror = err => {\n console.error(`Model Socket encountered error: ${err} Closing socket`);\n if (this._is_connected) {\n try {\n this.socket.close();\n } catch (e) {}\n }\n };\n this.socket.onopen = () => {\n resolve();\n };\n });\n }\n _checkConnection() {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'connect',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n }\n _parseServerRes(res) {\n let updated = [];\n for (let json_data of res) {\n const pk = json_data.pk;\n const obj = this.byPk(pk);\n for (const [k, v] of Object.entries(json_data.fields)) {\n if (v && typeof v === 'object' && v['__is_sdc_model__']) {\n obj[k] = new SubModel(v['pk'], v['model']);\n } else {\n obj[k] = v;\n }\n }\n updated.push(obj);\n }\n if (this.values_list.length === 1) {\n this.values = this.values_list.at(-1);\n } else {\n this.values = {};\n }\n return updated;\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc29ja2V0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBa0M7QUFDTTtBQUNGO0FBRXRDLE1BQU1HLGVBQWUsR0FBRyxLQUFLO0FBRzdCLE1BQU1DLFFBQVEsQ0FBQztFQUViQyxXQUFXQSxDQUFDQyxFQUFFLEVBQUVDLEtBQUssRUFBRTtJQUNyQixJQUFJLENBQUNELEVBQUUsR0FBR0EsRUFBRTtJQUNaLElBQUksQ0FBQ0UsTUFBTSxHQUFHRCxLQUFLO0VBQ3JCOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0VBQ0UsSUFBSUEsS0FBS0EsQ0FBQ0EsS0FBSyxFQUFFO0lBQ2YsSUFBSSxDQUFDQyxNQUFNLEdBQUdELEtBQUs7RUFDckI7RUFFQSxJQUFJQSxLQUFLQSxDQUFBLEVBQUc7SUFDVixPQUFPLElBQUksQ0FBQ0MsTUFBTTtFQUNwQjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRUMsSUFBSUEsQ0FBQ0MsVUFBVSxFQUFFO0lBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQ0YsTUFBTSxFQUFFO01BQ2hCLE1BQU0sSUFBSUcsU0FBUyxDQUFDLG9CQUFvQixDQUFDO0lBQzNDO0lBQ0EsSUFBSSxJQUFJLENBQUNMLEVBQUUsWUFBWU0sS0FBSyxFQUFFO01BQzVCLE9BQU9GLFVBQVUsQ0FBQ0csUUFBUSxDQUFDLElBQUksQ0FBQ0wsTUFBTSxFQUFFO1FBQUNNLE1BQU0sRUFBRSxJQUFJLENBQUNSO01BQUUsQ0FBQyxDQUFDO0lBQzVEO0lBQ0EsT0FBT0ksVUFBVSxDQUFDRyxRQUFRLENBQUMsSUFBSSxDQUFDTCxNQUFNLEVBQUU7TUFBQ0YsRUFBRSxFQUFFLElBQUksQ0FBQ0E7SUFBRSxDQUFDLENBQUM7RUFDeEQ7QUFDRjtBQUVBLE1BQU1TLGlCQUFpQixHQUFHO0VBQ3hCQyxHQUFHQSxDQUFDQyxNQUFNLEVBQUVDLEdBQUcsRUFBRTtJQUNmLE1BQU1DLEtBQUssR0FBR0YsTUFBTSxDQUFDQyxHQUFHLENBQUMsSUFBSUUsU0FBUztJQUN0QyxJQUFJRCxLQUFLLFlBQVlmLFFBQVEsRUFBRTtNQUM3QixJQUFJLENBQUNlLEtBQUssQ0FBQ2IsRUFBRSxJQUFJYSxLQUFLLENBQUNiLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDL0IsT0FBTyxJQUFJO01BQ2I7TUFDQSxJQUFJZSxNQUFNO01BQ1YsSUFBSUYsS0FBSyxDQUFDYixFQUFFLFlBQVlNLEtBQUssRUFBRTtRQUM3QlMsTUFBTSxHQUFHRixLQUFLLENBQUNiLEVBQUUsQ0FBQ2dCLEtBQUssQ0FBQyxDQUFDO01BQzNCLENBQUMsTUFBTTtRQUNMRCxNQUFNLEdBQUcsSUFBSUUsTUFBTSxDQUFDSixLQUFLLENBQUNiLEVBQUUsQ0FBQztNQUMvQjtNQUNBZSxNQUFNLENBQUNaLElBQUksR0FBR1UsS0FBSyxDQUFDVixJQUFJLENBQUNlLElBQUksQ0FBQ0wsS0FBSyxDQUFDO01BQ3BDLE9BQU9FLE1BQU07SUFDZjtJQUNBLE9BQU9GLEtBQUs7RUFDZCxDQUFDO0VBQ0RNLEdBQUdBLENBQUNSLE1BQU0sRUFBRUMsR0FBRyxFQUFFQyxLQUFLLEVBQUU7SUFDdEIsSUFBSUQsR0FBRyxJQUFJRCxNQUFNLEVBQUU7TUFDakIsTUFBTVMsTUFBTSxHQUFHVCxNQUFNLENBQUNDLEdBQUcsQ0FBQztNQUMxQixJQUFJUSxNQUFNLFlBQVl0QixRQUFRLEVBQUU7UUFDOUIsSUFBSWUsS0FBSyxDQUFDUSxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7VUFDOUJELE1BQU0sQ0FBQ3BCLEVBQUUsR0FBR2EsS0FBSyxDQUFDYixFQUFFO1FBQ3RCLENBQUMsTUFBTTtVQUNMLElBQUk7WUFDRm9CLE1BQU0sQ0FBQ3BCLEVBQUUsR0FBR3NCLElBQUksQ0FBQ0MsS0FBSyxDQUFDVixLQUFLLENBQUM7VUFDL0IsQ0FBQyxDQUFDLE1BQU07WUFDTk8sTUFBTSxDQUFDcEIsRUFBRSxHQUFHYSxLQUFLO1VBQ25CO1FBRUY7TUFDRixDQUFDLE1BQU07UUFDTEYsTUFBTSxDQUFDQyxHQUFHLENBQUMsR0FBR0MsS0FBSztNQUNyQjtJQUNGLENBQUMsTUFBTTtNQUNMRixNQUFNLENBQUNDLEdBQUcsQ0FBQyxHQUFHQyxLQUFLO0lBQ3JCO0lBQ0EsT0FBTyxJQUFJO0VBQ2I7QUFDRixDQUFDO0FBR0QsU0FBU1csbUJBQW1CQSxDQUFDWCxLQUFLLEVBQUU7RUFFbEMsSUFBSVksVUFBVSxHQUFHLGVBQWU7RUFDaEMsSUFBSUMsUUFBUSxHQUFHLFNBQVM7RUFDeEIsSUFBSUMsU0FBUyxHQUFHLGdCQUFnQjtFQUNoQyxJQUFJQyxXQUFXLEdBQUcsK0JBQStCO0VBR2pELElBQUlmLEtBQUssQ0FBQ2dCLFdBQVcsQ0FBQyxDQUFDLENBQUNDLEtBQUssQ0FBQ0gsU0FBUyxDQUFDLEVBQUU7SUFDeEMsT0FBT2QsS0FBSyxDQUFDZ0IsV0FBVyxDQUFDLENBQUMsS0FBSyxNQUFNO0VBQ3ZDLENBQUMsTUFBTSxJQUFJaEIsS0FBSyxLQUFLLFdBQVcsRUFBRTtJQUNoQyxPQUFPQyxTQUFTO0VBQ2xCLENBQUMsTUFBTSxJQUFJRCxLQUFLLENBQUNnQixXQUFXLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRTtJQUN6QyxPQUFPLElBQUk7RUFDYixDQUFDLE1BQU0sSUFBSWhCLEtBQUssQ0FBQ2lCLEtBQUssQ0FBQ0osUUFBUSxDQUFDLEVBQUU7SUFDaEMsT0FBT0ssUUFBUSxDQUFDbEIsS0FBSyxDQUFDO0VBQ3hCLENBQUMsTUFBTSxJQUFJQSxLQUFLLENBQUNpQixLQUFLLENBQUNMLFVBQVUsQ0FBQyxFQUFFO0lBQ2xDLE9BQU9PLFVBQVUsQ0FBQ25CLEtBQUssQ0FBQztFQUMxQixDQUFDLE1BQU0sSUFBSUEsS0FBSyxDQUFDaUIsS0FBSyxDQUFDRixXQUFXLENBQUMsRUFBRTtJQUNuQyxPQUFPZixLQUFLLENBQUNvQixTQUFTLENBQUMsQ0FBQyxFQUFFcEIsS0FBSyxDQUFDcUIsTUFBTSxHQUFHLENBQUMsQ0FBQztFQUM3QztFQUNBLE9BQU9yQixLQUFLO0FBQ2Q7QUFHTyxNQUFNc0IsS0FBSyxDQUFDO0VBQ2pCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7RUFDRXBDLFdBQVdBLENBQUNxQyxVQUFVLEVBQUVDLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRTtJQUN4QyxJQUFJLENBQUNDLGlCQUFpQixHQUFHLEVBQUU7SUFDM0IsSUFBSSxDQUFDQyxXQUFXLEdBQUcsRUFBRTtJQUNyQixJQUFJLENBQUNDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDaEIsSUFBSSxDQUFDSixVQUFVLEdBQUdBLFVBQVU7SUFDNUIsSUFBSSxDQUFDQyxXQUFXLEdBQUdBLFdBQVc7SUFDOUIsSUFBSSxDQUFDSSxhQUFhLEdBQUcsS0FBSztJQUMxQixJQUFJLENBQUNDLHFCQUFxQixHQUFHLEtBQUs7SUFDbEMsSUFBSSxDQUFDQyxlQUFlLEdBQUcsSUFBSTtJQUMzQixJQUFJLENBQUNDLE1BQU0sR0FBRyxJQUFJO0lBQ2xCLElBQUksQ0FBQ0MsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN0QixJQUFJLENBQUNDLFNBQVMsR0FBRyxNQUFNLENBQ3ZCLENBQUM7SUFDRCxJQUFJLENBQUNDLFNBQVMsR0FBRyxNQUFNLENBQ3ZCLENBQUM7SUFFRCxJQUFJLENBQUNDLE9BQU8sR0FBR3BELHFEQUFNLENBQUMsQ0FBQztFQUN6QjtFQUVBLENBQUNxRCxNQUFNLENBQUNDLFFBQVEsSUFBSTtJQUNsQixJQUFJQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osT0FBTztNQUNMQyxJQUFJLEVBQUVBLENBQUEsS0FBTTtRQUNWLEVBQUVELEdBQUc7UUFDTCxJQUFJQSxHQUFHLEdBQUcsSUFBSSxDQUFDWixXQUFXLENBQUNMLE1BQU0sRUFBRTtVQUNqQyxPQUFPO1lBQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDMEIsV0FBVyxDQUFDWSxHQUFHLENBQUM7WUFBRUUsSUFBSSxFQUFFO1VBQUssQ0FBQztRQUNwRDtRQUNBLE9BQU87VUFBQ3hDLEtBQUssRUFBRSxJQUFJO1VBQUV3QyxJQUFJLEVBQUU7UUFBSSxDQUFDO01BQ2xDO0lBQ0YsQ0FBQztFQUNIO0VBRUFuQixNQUFNQSxDQUFBLEVBQUc7SUFDUCxPQUFPLElBQUksQ0FBQ0ssV0FBVyxDQUFDTCxNQUFNO0VBQ2hDO0VBRUFvQixJQUFJQSxDQUFDdEQsRUFBRSxFQUFFO0lBQ1AsSUFBSUEsRUFBRSxLQUFLLElBQUksRUFBRTtNQUNmQSxFQUFFLEdBQUcrQixRQUFRLENBQUMvQixFQUFFLENBQUM7TUFDakIsSUFBSXVELEtBQUssQ0FBQ3ZELEVBQUUsQ0FBQyxFQUFFO1FBQ2JBLEVBQUUsR0FBRyxDQUFDLENBQUM7TUFDVDtNQUNBLElBQUl3RCxJQUFJLEdBQUcsSUFBSSxDQUFDakIsV0FBVyxDQUFDa0IsSUFBSSxDQUFDQyxHQUFHLElBQUlBLEdBQUcsQ0FBQzFELEVBQUUsS0FBS0EsRUFBRSxDQUFDO01BQ3RELElBQUksQ0FBQ3dELElBQUksRUFBRTtRQUNUQSxJQUFJLEdBQUcsSUFBSUcsS0FBSyxDQUFDO1VBQUMzRCxFQUFFLEVBQUVBO1FBQUUsQ0FBQyxFQUFFUyxpQkFBaUIsQ0FBQztRQUM3QyxJQUFJLENBQUM4QixXQUFXLENBQUNxQixJQUFJLENBQUNKLElBQUksQ0FBQztNQUM3QjtNQUNBLE9BQU9BLElBQUk7SUFDYjtJQUNBLE9BQU87TUFBQ3hELEVBQUUsRUFBRUE7SUFBRSxDQUFDO0VBRWpCO0VBRUE2RCxNQUFNQSxDQUFDeEIsV0FBVyxFQUFFO0lBQ2xCLElBQUksQ0FBQ0EsV0FBVyxHQUFHeUIsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDMUIsV0FBVyxFQUFFQSxXQUFXLENBQUM7SUFDbkUsT0FBTyxJQUFJO0VBQ2I7RUFFQWxDLElBQUlBLENBQUEsRUFBRztJQUNMLE9BQU8sSUFBSSxDQUFDNkQsV0FBVyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLE1BQU07TUFDbkMsTUFBTUMsRUFBRSxHQUFHdEUscURBQU0sQ0FBQyxDQUFDO01BQ25CLE9BQU8sSUFBSXVFLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztRQUN0QyxJQUFJLENBQUN6QixNQUFNLENBQUMwQixJQUFJLENBQUNoRCxJQUFJLENBQUNpRCxTQUFTLENBQUM7VUFDOUJDLEtBQUssRUFBRSxPQUFPO1VBQ2RDLFVBQVUsRUFBRSxNQUFNO1VBQ2xCQyxRQUFRLEVBQUVSLEVBQUU7VUFDWlMsSUFBSSxFQUFFO1lBQ0p2QyxVQUFVLEVBQUUsSUFBSSxDQUFDQSxVQUFVO1lBQzNCQyxXQUFXLEVBQUUsSUFBSSxDQUFDQTtVQUNwQjtRQUNGLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDUSxZQUFZLENBQUNxQixFQUFFLENBQUMsR0FBRyxDQUFDRSxPQUFPLEVBQUVDLE1BQU0sQ0FBQztNQUMzQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7RUFDSjtFQUVBTyxRQUFRQSxDQUFDZixNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUVnQixTQUFTLEdBQUcsSUFBSSxFQUFFQyxRQUFRLEdBQUcsSUFBSSxFQUFFQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLEVBQUU7SUFDN0UsT0FBTyxJQUFJLENBQUNDLElBQUksQ0FBQztNQUFDbkIsTUFBTTtNQUFFZ0IsU0FBUztNQUFFQyxRQUFRO01BQUVDO0lBQWUsQ0FBQyxDQUFDO0VBQ2xFO0VBRUFDLElBQUlBLENBQUM7SUFBQ0MsUUFBUSxHQUFHLG9CQUFvQjtJQUFFcEIsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUFFZ0IsU0FBUyxHQUFHLElBQUk7SUFBRUMsUUFBUSxHQUFHLElBQUk7SUFBRUMsZUFBZSxHQUFHLENBQUM7RUFBQyxDQUFDLEVBQUU7SUFDNUcsSUFBSUcsU0FBUyxHQUFHQyxDQUFDLENBQUMsK0JBQStCLENBQUM7SUFDbEQsSUFBSSxDQUFDbkIsV0FBVyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLE1BQU07TUFDNUIsTUFBTUMsRUFBRSxHQUFHdEUscURBQU0sQ0FBQyxDQUFDO01BQ25CLElBQUksQ0FBQ2dELE1BQU0sQ0FBQzBCLElBQUksQ0FBQ2hELElBQUksQ0FBQ2lELFNBQVMsQ0FBQztRQUM5QkMsS0FBSyxFQUFFLE9BQU87UUFDZEMsVUFBVSxFQUFFLFlBQVk7UUFDeEJDLFFBQVEsRUFBRVIsRUFBRTtRQUNaUyxJQUFJLEVBQUU7VUFDSlMsU0FBUyxFQUFFSCxRQUFRO1VBQ25CN0MsVUFBVSxFQUFFLElBQUksQ0FBQ0EsVUFBVTtVQUMzQkMsV0FBVyxFQUFFLElBQUksQ0FBQ0EsV0FBVztVQUM3QndCLE1BQU07VUFDTndCLGdCQUFnQixFQUFFTjtRQUNwQjtNQUNGLENBQUMsQ0FBQyxDQUFDO01BRUgsSUFBSSxDQUFDbEMsWUFBWSxDQUFDcUIsRUFBRSxDQUFDLEdBQUcsQ0FBRW9CLElBQUksSUFBSztRQUNqQ0osU0FBUyxDQUFDSyxNQUFNLENBQUNELElBQUksQ0FBQ0UsSUFBSSxDQUFDO1FBQzNCOUYsNkNBQUcsQ0FBQytGLE9BQU8sQ0FBQ1AsU0FBUyxDQUFDO1FBQ3RCTCxTQUFTLElBQUlBLFNBQVMsQ0FBQ1MsSUFBSSxDQUFDO01BQzlCLENBQUMsRUFBR0ksR0FBRyxJQUFLO1FBQ1ZaLFFBQVEsSUFBSUEsUUFBUSxDQUFDWSxHQUFHLENBQUM7TUFDM0IsQ0FBQyxDQUFDO0lBRUosQ0FBQyxDQUFDO0lBRUYsT0FBT1IsU0FBUztFQUNsQjtFQUVBUyxVQUFVQSxDQUFDM0YsRUFBRSxHQUFHLElBQUksRUFBRTRGLFVBQVUsR0FBRyxJQUFJLEVBQUVDLFNBQVMsR0FBRyxJQUFJLEVBQUVSLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQ2hGckYsRUFBRSxHQUFHQSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2JBLEVBQUUsR0FBRytCLFFBQVEsQ0FBQy9CLEVBQUUsQ0FBQztJQUNqQixJQUFJdUQsS0FBSyxDQUFDdkQsRUFBRSxDQUFDLEVBQUU7TUFDYkEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNUO0lBQ0EsSUFBSWtGLFNBQVMsR0FBR0MsQ0FBQyxDQUFDLCtCQUErQixDQUFDO0lBRWxELElBQUlXLFlBQVk7SUFDaEIsSUFBSSxJQUFJLENBQUN2RCxXQUFXLENBQUNMLE1BQU0sS0FBSyxDQUFDLEVBQUU7TUFDakM0RCxZQUFZLEdBQUcsSUFBSSxDQUFDOUIsV0FBVyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxNQUFNO01BQ0w4QixZQUFZLEdBQUcsSUFBSSxDQUFDM0YsSUFBSSxDQUFDLENBQUM7SUFDNUI7SUFFQTJGLFlBQVksQ0FBQzdCLElBQUksQ0FBQyxNQUFNO01BQ3RCLElBQUlqRSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDYkEsRUFBRSxHQUFHLElBQUksQ0FBQ3VDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQ3ZDLEVBQUU7TUFDN0I7TUFDQSxNQUFNa0UsRUFBRSxHQUFHdEUscURBQU0sQ0FBQyxDQUFDO01BQ25CLElBQUksQ0FBQ2dELE1BQU0sQ0FBQzBCLElBQUksQ0FBQ2hELElBQUksQ0FBQ2lELFNBQVMsQ0FBQztRQUM5QkMsS0FBSyxFQUFFLE9BQU87UUFDZEMsVUFBVSxFQUFFLGFBQWE7UUFDekJDLFFBQVEsRUFBRVIsRUFBRTtRQUNaUyxJQUFJLEVBQUU7VUFDSnZDLFVBQVUsRUFBRSxJQUFJLENBQUNBLFVBQVU7VUFDM0JDLFdBQVcsRUFBRSxJQUFJLENBQUNBLFdBQVc7VUFDN0JyQyxFQUFFO1VBQ0ZxRjtRQUNGO01BQ0YsQ0FBQyxDQUFDLENBQUM7TUFFSCxJQUFJLENBQUN4QyxZQUFZLENBQUNxQixFQUFFLENBQUMsR0FBRyxDQUFFb0IsSUFBSSxJQUFLO1FBQ2pDSixTQUFTLENBQUNLLE1BQU0sQ0FBQ0QsSUFBSSxDQUFDRSxJQUFJLENBQUM7UUFDM0I5Riw2Q0FBRyxDQUFDK0YsT0FBTyxDQUFDUCxTQUFTLENBQUM7UUFDdEJVLFVBQVUsSUFBSUEsVUFBVSxDQUFDTixJQUFJLENBQUM7TUFDaEMsQ0FBQyxFQUFHSSxHQUFHLElBQUs7UUFDVkcsU0FBUyxJQUFJQSxTQUFTLENBQUNILEdBQUcsQ0FBQztNQUM3QixDQUFDLENBQUM7SUFFSixDQUFDLENBQUM7SUFFRixPQUFPUixTQUFTO0VBQ2xCO0VBRUFhLGVBQWVBLENBQUNDLE1BQU0sRUFBRTtJQUN0QixPQUFPLElBQUksQ0FBQ0MsUUFBUSxDQUFDRCxNQUFNLENBQUM7RUFDOUI7RUFFQUUsZUFBZUEsQ0FBQ0YsTUFBTSxFQUFFO0lBQ3RCLElBQUksQ0FBQ0EsTUFBTSxJQUFJLENBQUNBLE1BQU0sQ0FBQ0csUUFBUSxDQUFDLElBQUksQ0FBQ25ELE9BQU8sQ0FBQyxFQUFFO01BQzdDZ0QsTUFBTSxHQUFHYixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUNuQyxPQUFPLEVBQUUsQ0FBQztJQUNoQztJQUVBLElBQUlvRCxJQUFJLEdBQUcsSUFBSTtJQUNmSixNQUFNLENBQUNLLElBQUksQ0FBQyxZQUFZO01BQ3RCLElBQUksQ0FBQyxJQUFJLENBQUNDLFlBQVksQ0FBQyxlQUFlLENBQUMsRUFBRTtRQUN2QztNQUNGO01BQ0EsSUFBSXRHLEVBQUUsR0FBR21GLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQ0csSUFBSSxDQUFDLFVBQVUsQ0FBQztNQUNqQyxJQUFJaUIsUUFBUSxHQUFHSCxJQUFJLENBQUM5QyxJQUFJLENBQUN0RCxFQUFFLENBQUM7TUFDNUIsS0FBSyxJQUFJd0csU0FBUyxJQUFJLElBQUksQ0FBQ0MsUUFBUSxFQUFFO1FBQ25DLElBQUlDLElBQUksR0FBR0YsU0FBUyxDQUFDRSxJQUFJO1FBQ3pCLElBQUlBLElBQUksSUFBSUEsSUFBSSxLQUFLLEVBQUUsRUFBRTtVQUN2QixJQUFJRixTQUFTLENBQUNHLElBQUksS0FBSyxVQUFVLEVBQUU7WUFDakNILFNBQVMsQ0FBQ0ksT0FBTyxHQUFHTCxRQUFRLENBQUNHLElBQUksQ0FBQztVQUNwQyxDQUFDLE1BQU0sSUFBSUYsU0FBUyxDQUFDRyxJQUFJLEtBQUssTUFBTSxJQUFJSixRQUFRLENBQUNHLElBQUksQ0FBQyxZQUFZRyxJQUFJLEVBQUU7WUFDdEUsSUFBSUMsU0FBUyxHQUFHLElBQUlDLFlBQVksQ0FBQyxDQUFDO1lBQ2xDRCxTQUFTLENBQUNFLEtBQUssQ0FBQ0MsR0FBRyxDQUFDVixRQUFRLENBQUNHLElBQUksQ0FBQyxDQUFDO1lBQ25DRixTQUFTLENBQUNVLEtBQUssR0FBR0osU0FBUztVQUM3QixDQUFDLE1BQU07WUFDTDNCLENBQUMsQ0FBQ3FCLFNBQVMsQ0FBQyxDQUFDVyxHQUFHLENBQUNaLFFBQVEsQ0FBQ0csSUFBSSxDQUFDLENBQUM7VUFDbEM7UUFDRjtNQUNGO0lBQ0YsQ0FBQyxDQUFDO0VBRUo7RUFFQVQsUUFBUUEsQ0FBQ0QsTUFBTSxFQUFFO0lBQ2YsSUFBSSxDQUFDQSxNQUFNLElBQUksQ0FBQ0EsTUFBTSxDQUFDRyxRQUFRLENBQUMsSUFBSSxDQUFDbkQsT0FBTyxDQUFDLEVBQUU7TUFDN0NnRCxNQUFNLEdBQUdiLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQ25DLE9BQU8sRUFBRSxDQUFDO0lBQ2hDO0lBRUEsTUFBTW9ELElBQUksR0FBRyxJQUFJO0lBQ2pCLElBQUlnQixTQUFTLEdBQUcsRUFBRTtJQUVsQnBCLE1BQU0sQ0FBQ0ssSUFBSSxDQUFDLFlBQVk7TUFDdEIsSUFBSWdCLEtBQUssR0FBR2xDLENBQUMsQ0FBQyxJQUFJLENBQUM7TUFDbkIsSUFBSW5GLEVBQUUsR0FBR3FILEtBQUssQ0FBQy9CLElBQUksQ0FBQyxVQUFVLENBQUM7TUFDL0IsSUFBSWlCLFFBQVEsR0FBR0gsSUFBSSxDQUFDOUMsSUFBSSxDQUFDdEQsRUFBRSxDQUFDO01BQzVCLEtBQUssSUFBSXdHLFNBQVMsSUFBSSxJQUFJLENBQUNDLFFBQVEsRUFBRTtRQUNuQyxJQUFJQyxJQUFJLEdBQUdGLFNBQVMsQ0FBQ0UsSUFBSTtRQUN6QixJQUFJQSxJQUFJLElBQUlBLElBQUksS0FBSyxFQUFFLEVBQUU7VUFDdkIsSUFBSUYsU0FBUyxDQUFDRyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQy9CSixRQUFRLENBQUNHLElBQUksQ0FBQyxHQUFHbEYsbUJBQW1CLENBQUMyRCxDQUFDLENBQUNxQixTQUFTLENBQUMsQ0FBQ1csR0FBRyxDQUFDLENBQUMsQ0FBQztVQUMxRCxDQUFDLE1BQU0sSUFBSVgsU0FBUyxDQUFDRyxJQUFJLEtBQUssVUFBVSxFQUFFO1lBQ3hDSixRQUFRLENBQUNHLElBQUksQ0FBQyxHQUFHRixTQUFTLENBQUNJLE9BQU87VUFDcEMsQ0FBQyxNQUFNLElBQUlKLFNBQVMsQ0FBQ0csSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUNwQ0osUUFBUSxDQUFDRyxJQUFJLENBQUMsR0FBR0YsU0FBUyxDQUFDVSxLQUFLLENBQUMsQ0FBQyxDQUFDO1VBQ3JDLENBQUMsTUFBTTtZQUNMWCxRQUFRLENBQUNHLElBQUksQ0FBQyxHQUFHdkIsQ0FBQyxDQUFDcUIsU0FBUyxDQUFDLENBQUNXLEdBQUcsQ0FBQyxDQUFDO1VBQ3JDO1FBQ0Y7TUFDRjtNQUVBQyxTQUFTLENBQUN4RCxJQUFJLENBQUMyQyxRQUFRLENBQUM7TUFDeEIsT0FBT0EsUUFBUTtJQUNqQixDQUFDLENBQUM7SUFFRixJQUFJLElBQUksQ0FBQ2hFLFdBQVcsQ0FBQ0wsTUFBTSxJQUFJLENBQUMsSUFBSWtGLFNBQVMsQ0FBQ2xGLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDeEQsSUFBSSxDQUFDTSxNQUFNLEdBQUc0RSxTQUFTLENBQUNFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQztJQUVBLE9BQU9GLFNBQVM7RUFFbEI7RUFFQUcsVUFBVUEsQ0FBQzNCLFVBQVUsR0FBRyxJQUFJLEVBQUVDLFNBQVMsR0FBRyxJQUFJLEVBQUU7SUFDOUMsSUFBSTJCLFNBQVMsR0FBR3JDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDMUIsSUFBSSxDQUFDbkIsV0FBVyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLE1BQU07TUFDNUIsSUFBSSxDQUFDd0QsUUFBUSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFRCxTQUFTLEVBQUU1QixVQUFVLEVBQUVDLFNBQVMsQ0FBQztJQUM1RSxDQUFDLENBQUM7SUFFRixPQUFPMkIsU0FBUztFQUNsQjtFQUVBRSxRQUFRQSxDQUFDMUgsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFNEYsVUFBVSxHQUFHLElBQUksRUFBRUMsU0FBUyxHQUFHLElBQUksRUFBRTtJQUNyRDdGLEVBQUUsR0FBRytCLFFBQVEsQ0FBQy9CLEVBQUUsQ0FBQztJQUNqQixJQUFJdUQsS0FBSyxDQUFDdkQsRUFBRSxDQUFDLEVBQUU7TUFDYkEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNUO0lBQ0EsSUFBSThGLFlBQVk7SUFDaEIsSUFBSSxJQUFJLENBQUN2RCxXQUFXLENBQUNMLE1BQU0sS0FBSyxDQUFDLEVBQUU7TUFDakM0RCxZQUFZLEdBQUcsSUFBSSxDQUFDOUIsV0FBVyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxNQUFNO01BQ0w4QixZQUFZLEdBQUcsSUFBSSxDQUFDM0YsSUFBSSxDQUFDLENBQUM7SUFDNUI7SUFFQSxJQUFJcUgsU0FBUyxHQUFHckMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUUxQlcsWUFBWSxDQUFDN0IsSUFBSSxDQUFDLE1BQU07TUFDdEIsSUFBSWpFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTtRQUNaQSxFQUFFLEdBQUcsSUFBSSxDQUFDdUMsV0FBVyxDQUFDK0UsRUFBRSxDQUFDdEgsRUFBRSxDQUFDLENBQUNBLEVBQUU7TUFDakM7TUFFQSxJQUFJLENBQUN5SCxRQUFRLENBQUN6SCxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRXdILFNBQVMsRUFBRTVCLFVBQVUsRUFBRUMsU0FBUyxDQUFDO0lBQ3hFLENBQUMsQ0FBQztJQUVGLE9BQU8yQixTQUFTO0VBQ2xCO0VBRUFHLFNBQVNBLENBQUMzSCxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUU0SCxRQUFRLEVBQUVoQyxVQUFVLEdBQUcsSUFBSSxFQUFFQyxTQUFTLEdBQUcsSUFBSSxFQUFFO0lBQ2hFN0YsRUFBRSxHQUFHK0IsUUFBUSxDQUFDL0IsRUFBRSxDQUFDO0lBQ2pCLElBQUl1RCxLQUFLLENBQUN2RCxFQUFFLENBQUMsRUFBRTtNQUNiQSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1Q7SUFDQSxJQUFJOEYsWUFBWTtJQUNoQixJQUFJLElBQUksQ0FBQ3ZELFdBQVcsQ0FBQ0wsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUNqQzRELFlBQVksR0FBRyxJQUFJLENBQUM5QixXQUFXLENBQUMsQ0FBQztJQUNuQyxDQUFDLE1BQU07TUFDTDhCLFlBQVksR0FBRyxJQUFJLENBQUMzRixJQUFJLENBQUMsQ0FBQztJQUM1QjtJQUVBLElBQUlxSCxTQUFTLEdBQUdyQyxDQUFDLENBQUMsZ0NBQWdDLENBQUM7SUFFbkRXLFlBQVksQ0FBQzdCLElBQUksQ0FBQyxNQUFNO01BQ3RCLElBQUlqRSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUU7UUFDWkEsRUFBRSxHQUFHLElBQUksQ0FBQ3VDLFdBQVcsQ0FBQytFLEVBQUUsQ0FBQ3RILEVBQUUsQ0FBQyxDQUFDQSxFQUFFO01BQ2pDO01BRUEsSUFBSSxDQUFDeUgsUUFBUSxDQUFDekgsRUFBRSxFQUFFLFlBQVksRUFBRTRILFFBQVEsRUFBRUosU0FBUyxFQUFFNUIsVUFBVSxFQUFFQyxTQUFTLENBQUM7SUFDN0UsQ0FBQyxDQUFDO0lBRUYsT0FBTzJCLFNBQVM7RUFDbEI7RUFHQUMsUUFBUUEsQ0FBQ3pILEVBQUUsRUFBRXlFLFVBQVUsRUFBRW1ELFFBQVEsRUFBRUosU0FBUyxFQUFFNUIsVUFBVSxFQUFFQyxTQUFTLEVBQUU7SUFDbkU3RixFQUFFLEdBQUcrQixRQUFRLENBQUMvQixFQUFFLENBQUM7SUFDakIsSUFBSXVELEtBQUssQ0FBQ3ZELEVBQUUsQ0FBQyxFQUFFO01BQ2JBLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVDtJQUNBLE1BQU1rRSxFQUFFLEdBQUd0RSxxREFBTSxDQUFDLENBQUM7SUFDbkIsSUFBSSxDQUFDZ0QsTUFBTSxDQUFDMEIsSUFBSSxDQUFDaEQsSUFBSSxDQUFDaUQsU0FBUyxDQUFDO01BQzlCQyxLQUFLLEVBQUUsT0FBTztNQUNkQyxVQUFVLEVBQUVBLFVBQVU7TUFDdEJDLFFBQVEsRUFBRVIsRUFBRTtNQUNaUyxJQUFJLEVBQUU7UUFDSnZDLFVBQVUsRUFBRSxJQUFJLENBQUNBLFVBQVU7UUFDM0JDLFdBQVcsRUFBRSxJQUFJLENBQUNBLFdBQVc7UUFDN0JyQyxFQUFFLEVBQUVBLEVBQUU7UUFDTjZILFNBQVMsRUFBRUQ7TUFDYjtJQUNGLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTUUsU0FBUyxHQUFHOUgsRUFBRSxLQUFLLElBQUksSUFBSUEsRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxNQUFNO0lBRTlELElBQUksQ0FBQzZDLFlBQVksQ0FBQ3FCLEVBQUUsQ0FBQyxHQUFHLENBQUVvQixJQUFJLElBQUs7TUFDakNrQyxTQUFTLENBQUNqQyxNQUFNLENBQUNELElBQUksQ0FBQ0UsSUFBSSxDQUFDO01BQzNCLElBQUk2QixLQUFLLEdBQUdHLFNBQVMsQ0FBQ08sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUNsQ0MsUUFBUSxDQUFDLGFBQWFGLFNBQVMsd0JBQXdCLElBQUksQ0FBQzlFLE9BQU8sRUFBRSxDQUFDLENBQ3RFc0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FDbkJBLElBQUksQ0FBQyxVQUFVLEVBQUV0RixFQUFFLENBQUMsQ0FDcEJzRixJQUFJLENBQUMsV0FBVyxFQUFFc0MsUUFBUSxDQUFDO01BQzlCLElBQUlQLEtBQUssQ0FBQ25GLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQ21GLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQ2YsWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQzVEZSxLQUFLLENBQUNZLElBQUksQ0FBQyxZQUFZLEVBQUUsNEJBQTRCLENBQUM7TUFDeEQ7TUFFQXZJLDZDQUFHLENBQUMrRixPQUFPLENBQUMrQixTQUFTLENBQUM7TUFDdEI1QixVQUFVLElBQUlBLFVBQVUsQ0FBQ04sSUFBSSxDQUFDO0lBQ2hDLENBQUMsRUFBR0ksR0FBRyxJQUFLO01BQ1ZHLFNBQVMsSUFBSUEsU0FBUyxDQUFDSCxHQUFHLENBQUM7SUFDN0IsQ0FBQyxDQUFDO0VBQ0o7RUFFQXdDLEdBQUdBLENBQUEsRUFBRztJQUNKLE9BQU8sSUFBSS9ELE9BQU8sQ0FBQyxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztNQUN0QyxNQUFNZ0QsS0FBSyxHQUFHbEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDZ0MsVUFBVSxDQUFDLE1BQU07UUFDckQsSUFBSSxDQUFDeEIsZUFBZSxDQUFDc0IsS0FBSyxDQUFDO1FBQzNCakQsT0FBTyxDQUFDLENBQUM7TUFDWCxDQUFDLEVBQUVDLE1BQU0sQ0FBQyxDQUFDO0lBQ2IsQ0FBQyxDQUFDO0VBQ0o7RUFFQThELElBQUlBLENBQUNuSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUVvSSxRQUFRLEdBQUcsV0FBVyxFQUFFO0lBQ3BDcEksRUFBRSxHQUFHK0IsUUFBUSxDQUFDL0IsRUFBRSxDQUFDO0lBQ2pCLElBQUl1RCxLQUFLLENBQUN2RCxFQUFFLENBQUMsRUFBRTtNQUNiQSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1Q7SUFDQSxPQUFPLElBQUksQ0FBQ2dFLFdBQVcsQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQyxNQUFNO01BQ25DLElBQUlvRSxTQUFTO01BQ2IsSUFBSXJJLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRTtRQUNYcUksU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDL0UsSUFBSSxDQUFDdEQsRUFBRSxDQUFDLENBQUM7TUFDN0IsQ0FBQyxNQUFNO1FBQ0xxSSxTQUFTLEdBQUcsSUFBSSxDQUFDOUYsV0FBVztNQUM5QjtNQUNBLElBQUkrRixNQUFNLEdBQUcsRUFBRTtNQUNmRCxTQUFTLENBQUNFLE9BQU8sQ0FBRS9FLElBQUksSUFBSztRQUMxQixNQUFNVSxFQUFFLEdBQUd0RSxxREFBTSxDQUFDLENBQUM7UUFDbkIwSSxNQUFNLENBQUMxRSxJQUFJLENBQUMsSUFBSU8sT0FBTyxDQUFDLENBQUNDLE9BQU8sRUFBRUMsTUFBTSxLQUFLO1VBQzNDLElBQUksQ0FBQ21FLFVBQVUsQ0FBQ2hGLElBQUksQ0FBQyxDQUFDUyxJQUFJLENBQUVpRCxLQUFLLElBQUs7WUFDcEMsSUFBSSxDQUFDdEUsTUFBTSxDQUFDMEIsSUFBSSxDQUFDaEQsSUFBSSxDQUFDaUQsU0FBUyxDQUFDO2NBQzlCQyxLQUFLLEVBQUUsT0FBTztjQUNkQyxVQUFVLEVBQUUsTUFBTTtjQUNsQkMsUUFBUSxFQUFFUixFQUFFO2NBQ1pTLElBQUksRUFBRTtnQkFDSmtELFNBQVMsRUFBRU8sUUFBUTtnQkFDbkJoRyxVQUFVLEVBQUUsSUFBSSxDQUFDQSxVQUFVO2dCQUMzQkMsV0FBVyxFQUFFLElBQUksQ0FBQ0EsV0FBVztnQkFDN0JpRCxJQUFJLEVBQUU5QixJQUFJO2dCQUNWMEQsS0FBSyxFQUFFQTtjQUNUO1lBQ0YsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUNyRSxZQUFZLENBQUNxQixFQUFFLENBQUMsR0FBRyxDQUFFd0IsR0FBRyxJQUFLO2NBQ2hDLElBQUlKLElBQUksR0FBRyxPQUFPSSxHQUFHLENBQUNKLElBQUksQ0FBQ2lCLFFBQVEsS0FBSyxRQUFRLEdBQUdqRixJQUFJLENBQUNDLEtBQUssQ0FBQ21FLEdBQUcsQ0FBQ0osSUFBSSxDQUFDaUIsUUFBUSxDQUFDLEdBQUdiLEdBQUcsQ0FBQ0osSUFBSSxDQUFDaUIsUUFBUTtjQUNwR2IsR0FBRyxDQUFDSixJQUFJLENBQUNpQixRQUFRLEdBQUcsSUFBSSxDQUFDa0MsZUFBZSxDQUFDbkQsSUFBSSxDQUFDO2NBQzlDbEIsT0FBTyxDQUFDc0IsR0FBRyxDQUFDO1lBQ2QsQ0FBQyxFQUFFckIsTUFBTSxDQUFDO1VBQ1osQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7TUFDTCxDQUFDLENBQUM7TUFFRixPQUFPRixPQUFPLENBQUN1RSxHQUFHLENBQUNKLE1BQU0sQ0FBQztJQUM1QixDQUFDLENBQUM7RUFDSjtFQUVBSyxNQUFNQSxDQUFDbkcsTUFBTSxHQUFHLElBQUksQ0FBQ0EsTUFBTSxFQUFFO0lBQzNCLE1BQU0wQixFQUFFLEdBQUd0RSxxREFBTSxDQUFDLENBQUM7SUFDbkIsT0FBTyxJQUFJLENBQUNvRSxXQUFXLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsTUFBTTtNQUNuQyxPQUFPLElBQUlFLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztRQUN0QyxJQUFJLENBQUNtRSxVQUFVLENBQUNoRyxNQUFNLENBQUMsQ0FBQ3lCLElBQUksQ0FBRWlELEtBQUssSUFBSztVQUN0QyxJQUFJLENBQUN0RSxNQUFNLENBQUMwQixJQUFJLENBQUNoRCxJQUFJLENBQUNpRCxTQUFTLENBQUM7WUFDOUJDLEtBQUssRUFBRSxPQUFPO1lBQ2RDLFVBQVUsRUFBRSxRQUFRO1lBQ3BCQyxRQUFRLEVBQUVSLEVBQUU7WUFDWlMsSUFBSSxFQUFFO2NBQ0p2QyxVQUFVLEVBQUUsSUFBSSxDQUFDQSxVQUFVO2NBQzNCQyxXQUFXLEVBQUUsSUFBSSxDQUFDQSxXQUFXO2NBQzdCaUQsSUFBSSxFQUFFOUMsTUFBTTtjQUNaMEUsS0FBSyxFQUFFQTtZQUNUO1VBQ0YsQ0FBQyxDQUFDLENBQUM7VUFFSCxJQUFJLENBQUNyRSxZQUFZLENBQUNxQixFQUFFLENBQUMsR0FBRyxDQUFFd0IsR0FBRyxJQUFLO1lBQ2hDLElBQUlKLElBQUksR0FBRyxPQUFPSSxHQUFHLENBQUNKLElBQUksQ0FBQ2lCLFFBQVEsS0FBSyxRQUFRLEdBQUdqRixJQUFJLENBQUNDLEtBQUssQ0FBQ21FLEdBQUcsQ0FBQ0osSUFBSSxDQUFDaUIsUUFBUSxDQUFDLEdBQUdiLEdBQUcsQ0FBQ0osSUFBSSxDQUFDaUIsUUFBUTtZQUNwRyxJQUFJLElBQUksQ0FBQy9ELE1BQU0sRUFBRXhDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRTtjQUMxQixJQUFJLENBQUN1QyxXQUFXLEdBQUcsRUFBRTtjQUNyQixJQUFJLENBQUNDLE1BQU0sR0FBRyxJQUFJO1lBQ3BCO1lBQ0FrRCxHQUFHLENBQUNKLElBQUksQ0FBQ2lCLFFBQVEsR0FBRyxJQUFJLENBQUNrQyxlQUFlLENBQUNuRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakRsQixPQUFPLENBQUNzQixHQUFHLENBQUM7VUFDZCxDQUFDLEVBQUVyQixNQUFNLENBQUM7UUFDWixDQUFDLENBQUM7TUFDSixDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7RUFDSjtFQUVBdUUsTUFBTUEsQ0FBQzVJLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRTtJQUNkQSxFQUFFLEdBQUcrQixRQUFRLENBQUMvQixFQUFFLENBQUM7SUFDakIsSUFBSXVELEtBQUssQ0FBQ3ZELEVBQUUsQ0FBQyxFQUFFO01BQ2JBLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVDtJQUNBLElBQUlBLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRUEsRUFBRSxHQUFHLElBQUksQ0FBQ3dDLE1BQU0sRUFBRXhDLEVBQUU7SUFDbkMsTUFBTWtFLEVBQUUsR0FBR3RFLHFEQUFNLENBQUMsQ0FBQztJQUNuQixPQUFPLElBQUksQ0FBQ29FLFdBQVcsQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQyxNQUFNO01BQ25DLE9BQU8sSUFBSUUsT0FBTyxDQUFDLENBQUNDLE9BQU8sRUFBRUMsTUFBTSxLQUFLO1FBQ3RDLElBQUksQ0FBQ3pCLE1BQU0sQ0FBQzBCLElBQUksQ0FBQ2hELElBQUksQ0FBQ2lELFNBQVMsQ0FBQztVQUM5QkMsS0FBSyxFQUFFLE9BQU87VUFDZEMsVUFBVSxFQUFFLFFBQVE7VUFDcEJDLFFBQVEsRUFBRVIsRUFBRTtVQUNaUyxJQUFJLEVBQUU7WUFDSnZDLFVBQVUsRUFBRSxJQUFJLENBQUNBLFVBQVU7WUFDM0JDLFdBQVcsRUFBRSxJQUFJLENBQUNBLFdBQVc7WUFDN0JyQyxFQUFFLEVBQUVBO1VBQ047UUFDRixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQzZDLFlBQVksQ0FBQ3FCLEVBQUUsQ0FBQyxHQUFHLENBQUNFLE9BQU8sRUFBRUMsTUFBTSxDQUFDO01BQzNDLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztFQUNKO0VBRUFMLFdBQVdBLENBQUEsRUFBRztJQUNaLE9BQU8sSUFBSUcsT0FBTyxDQUFDLENBQUNDLE9BQU8sRUFBRUMsTUFBTSxLQUFLO01BQ3RDLElBQUksSUFBSSxDQUFDNUIsYUFBYSxFQUFFO1FBQ3RCMkIsT0FBTyxDQUFDLENBQUM7TUFDWCxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQzFCLHFCQUFxQixFQUFFO1FBQ3RDLElBQUksQ0FBQ0EscUJBQXFCLEdBQUcsSUFBSTtRQUNqQyxJQUFJLENBQUNHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUNsRCxDQUFDLEVBQUUsTUFBTSxDQUNULENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQ2dHLGdCQUFnQixDQUFDLENBQUMsQ0FBQzVFLElBQUksQ0FBQyxNQUFNO1VBQ2pDRyxPQUFPLENBQUMsSUFBSSxDQUFDMEUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQztNQUNKLENBQUMsTUFBTTtRQUNMLE1BQU0sQ0FBQ0MsY0FBYyxFQUFFQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUNuRyxZQUFZLENBQUMscUJBQXFCLENBQUM7UUFDaEYsSUFBSSxDQUFDQSxZQUFZLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUN6QyxNQUFNO1VBQ0prRyxjQUFjLENBQUMsQ0FBQztVQUNoQjNFLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxFQUNELE1BQU07VUFDSjRFLGFBQWEsQ0FBQyxDQUFDO1VBQ2YzRSxNQUFNLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FDRjtNQUNIO0lBQ0YsQ0FBQyxDQUFDO0VBQ0o7RUFFQTRFLEtBQUtBLENBQUEsRUFBRztJQUNOLElBQUksSUFBSSxDQUFDckcsTUFBTSxFQUFFO01BQ2YsSUFBSSxDQUFDRCxlQUFlLEdBQUcsS0FBSztNQUM1QixJQUFJLENBQUNDLE1BQU0sQ0FBQ3NHLE9BQU8sR0FBRyxNQUFNLENBQzVCLENBQUM7TUFDRCxJQUFJLENBQUN0RyxNQUFNLENBQUNxRyxLQUFLLENBQUMsQ0FBQztNQUNuQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkI7RUFDRjtFQUVBRSxLQUFLQSxDQUFBLEVBQUc7SUFDTixJQUFJLENBQUM1RyxXQUFXLEdBQUcsRUFBRTtJQUNyQixJQUFJLENBQUNDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDaEIsT0FBTyxJQUFJO0VBQ2I7RUFFQWdHLFVBQVVBLENBQUNoRixJQUFJLEVBQUU7SUFDZixJQUFJNEYsUUFBUSxHQUFHLEVBQUU7SUFDakIsR0FBRztJQUNILElBQUlsQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsS0FBSyxNQUFNLENBQUN0RyxHQUFHLEVBQUVDLEtBQUssQ0FBQyxJQUFJaUQsTUFBTSxDQUFDdUYsT0FBTyxDQUFDN0YsSUFBSSxDQUFDLEVBQUU7TUFDL0MsSUFBSTNDLEtBQUssWUFBWWdHLElBQUksRUFBRTtRQUN6QnVDLFFBQVEsQ0FBQ3hGLElBQUksQ0FBQyxJQUFJTyxPQUFPLENBQUMsQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLEtBQUs7VUFDN0MsQ0FBQyxDQUFDekQsR0FBRyxFQUFFQyxLQUFLLEtBQUs7WUFDZixJQUFJeUksTUFBTSxHQUFHLElBQUlDLFVBQVUsQ0FBQyxDQUFDO1lBQzdCRCxNQUFNLENBQUNFLE1BQU0sR0FBR0MsQ0FBQyxJQUFJO2NBQ25CLE1BQU12RixFQUFFLEdBQUd0RSxxREFBTSxDQUFDLENBQUM7Y0FDbkIsSUFBSSxDQUFDaUQsWUFBWSxDQUFDcUIsRUFBRSxDQUFDLEdBQUcsQ0FBQ0UsT0FBTyxFQUFFQyxNQUFNLENBQUM7Y0FFekMsSUFBSXFGLE1BQU0sR0FBR0QsQ0FBQyxDQUFDOUksTUFBTSxDQUFDK0ksTUFBTTtjQUM1QixJQUFJQyxnQkFBZ0IsR0FBRzVILFFBQVEsQ0FBQzZILElBQUksQ0FBQ0MsSUFBSSxDQUFDSCxNQUFNLENBQUN4SCxNQUFNLEdBQUdyQyxlQUFlLENBQUMsQ0FBQztjQUMzRXFILEtBQUssQ0FBQ3RHLEdBQUcsQ0FBQyxHQUFHO2dCQUNYc0QsRUFBRSxFQUFFQSxFQUFFO2dCQUNONEYsU0FBUyxFQUFFakosS0FBSyxDQUFDNkYsSUFBSTtnQkFDckJxRCxVQUFVLEVBQUVuSixHQUFHO2dCQUNmb0osY0FBYyxFQUFFbkosS0FBSyxDQUFDb0o7Y0FDeEIsQ0FBQztjQUNELEtBQUssSUFBSUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHUCxnQkFBZ0IsRUFBRSxFQUFFTyxDQUFDLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQ3RILE1BQU0sQ0FBQzBCLElBQUksQ0FBQ2hELElBQUksQ0FBQ2lELFNBQVMsQ0FBQztrQkFDOUJDLEtBQUssRUFBRSxPQUFPO2tCQUNkQyxVQUFVLEVBQUUsUUFBUTtrQkFDcEJDLFFBQVEsRUFBRVIsRUFBRTtrQkFDWlMsSUFBSSxFQUFFO29CQUNKd0YsS0FBSyxFQUFFVCxNQUFNLENBQUMxSSxLQUFLLENBQUNuQixlQUFlLEdBQUdxSyxDQUFDLEVBQUVySyxlQUFlLElBQUlxSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ25FL0csR0FBRyxFQUFFK0csQ0FBQztvQkFDTlAsZ0JBQWdCLEVBQUVBLGdCQUFnQjtvQkFDbENHLFNBQVMsRUFBRWpKLEtBQUssQ0FBQzZGLElBQUk7b0JBQ3JCcUQsVUFBVSxFQUFFbkosR0FBRztvQkFDZm9KLGNBQWMsRUFBRW5KLEtBQUssQ0FBQ29KLElBQUk7b0JBQzFCRyxZQUFZLEVBQUV2SixLQUFLLENBQUM4RixJQUFJO29CQUN4QnZFLFVBQVUsRUFBRSxJQUFJLENBQUNBLFVBQVU7b0JBQzNCQyxXQUFXLEVBQUUsSUFBSSxDQUFDQTtrQkFDcEI7Z0JBQ0YsQ0FBQyxDQUFDLENBQUM7Y0FDTDtZQUNGLENBQUM7WUFDRGlILE1BQU0sQ0FBQ2UsT0FBTyxHQUFHLE1BQU07Y0FDckJoRyxNQUFNLENBQUMsQ0FBQztZQUNWLENBQUM7WUFDRGlGLE1BQU0sQ0FBQ2dCLGtCQUFrQixDQUFDekosS0FBSyxDQUFDO1VBQ2xDLENBQUMsRUFBRUQsR0FBRyxFQUFFQyxLQUFLLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7TUFDTDtJQUNGO0lBRUEsT0FBT3NELE9BQU8sQ0FBQ3VFLEdBQUcsQ0FBQ1UsUUFBUSxDQUFDLENBQUNuRixJQUFJLENBQUMsTUFBTTtNQUN0QyxPQUFPaUQsS0FBSztJQUNkLENBQUMsQ0FBQztFQUNKO0VBRUFxRCxVQUFVQSxDQUFDZCxDQUFDLEVBQUU7SUFDWixJQUFJbkUsSUFBSSxHQUFHaEUsSUFBSSxDQUFDQyxLQUFLLENBQUNrSSxDQUFDLENBQUNuRSxJQUFJLENBQUM7SUFDN0IsSUFBSUEsSUFBSSxDQUFDa0YsUUFBUSxFQUFFO01BQ2pCLElBQUksSUFBSSxDQUFDM0gsWUFBWSxDQUFDeEIsY0FBYyxDQUFDaUUsSUFBSSxDQUFDWixRQUFRLENBQUMsRUFBRTtRQUNuRCxJQUFJLENBQUM3QixZQUFZLENBQUN5QyxJQUFJLENBQUNaLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDWSxJQUFJLENBQUM7UUFDekMsSUFBSSxDQUFDbUYsaUJBQWlCLENBQUNuRixJQUFJLENBQUNaLFFBQVEsQ0FBQztNQUN2QztNQUNBLElBQUlZLElBQUksQ0FBQ29GLEdBQUcsSUFBSXBGLElBQUksQ0FBQ3FGLE1BQU0sRUFBRTtRQUMzQmhMLHVEQUFPLENBQUMsY0FBYyxFQUFFMkYsSUFBSSxDQUFDcUYsTUFBTSxJQUFJLEVBQUUsRUFBRXJGLElBQUksQ0FBQ29GLEdBQUcsSUFBSSxFQUFFLENBQUM7TUFDNUQ7TUFFQSxJQUFJcEYsSUFBSSxDQUFDcUIsSUFBSSxLQUFLLFNBQVMsRUFBRTtRQUMzQixJQUFJLENBQUM5RCxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ3lDLElBQUksQ0FBQztRQUNqRCxJQUFJLENBQUNtRixpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQztRQUM3QyxJQUFJLENBQUM5SCxlQUFlLEdBQUcsS0FBSztRQUM1QixJQUFJLENBQUNDLE1BQU0sQ0FBQ3FHLEtBQUssQ0FBQyxDQUFDO01BQ3JCO0lBQ0YsQ0FBQyxNQUFNO01BRUwsSUFBSTNELElBQUksQ0FBQ29GLEdBQUcsSUFBSXBGLElBQUksQ0FBQ3FGLE1BQU0sRUFBRTtRQUMzQmhMLHVEQUFPLENBQUMsU0FBUyxFQUFFMkYsSUFBSSxDQUFDcUYsTUFBTSxJQUFJLEVBQUUsRUFBRXJGLElBQUksQ0FBQ29GLEdBQUcsSUFBSSxFQUFFLENBQUM7TUFDdkQ7TUFFQSxJQUFJcEYsSUFBSSxDQUFDcUIsSUFBSSxLQUFLLFNBQVMsRUFBRTtRQUMzQixJQUFJLENBQUNsRSxhQUFhLEdBQUcsSUFBSTtRQUN6QixJQUFJLENBQUNDLHFCQUFxQixHQUFHLEtBQUs7UUFDbEMsSUFBSSxDQUFDRyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ3lDLElBQUksQ0FBQztRQUNqRCxJQUFJLENBQUNtRixpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQztNQUMvQyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUNHLFFBQVEsQ0FBQ3RGLElBQUksQ0FBQ3FCLElBQUksQ0FBQyxFQUFFO1FBQ3BFLE1BQU1rRSxRQUFRLEdBQUd2SixJQUFJLENBQUNDLEtBQUssQ0FBQytELElBQUksQ0FBQ1gsSUFBSSxDQUFDVyxJQUFJLENBQUM7UUFDM0MsSUFBSSxDQUFDL0MsV0FBVyxHQUFHLEVBQUU7UUFDckIrQyxJQUFJLENBQUNYLElBQUksQ0FBQ1csSUFBSSxHQUFHLElBQUksQ0FBQ21ELGVBQWUsQ0FBQ29DLFFBQVEsQ0FBQztNQUVqRCxDQUFDLE1BQU0sSUFBSXZGLElBQUksQ0FBQ3FCLElBQUksS0FBSyxXQUFXLElBQUlyQixJQUFJLENBQUNxQixJQUFJLEtBQUssV0FBVyxFQUFFO1FBQ2pFLE1BQU1rRSxRQUFRLEdBQUd2SixJQUFJLENBQUNDLEtBQUssQ0FBQytELElBQUksQ0FBQ1gsSUFBSSxDQUFDVyxJQUFJLENBQUM7UUFFM0MsSUFBSXdGLEdBQUcsR0FBRyxJQUFJLENBQUNyQyxlQUFlLENBQUNvQyxRQUFRLENBQUM7UUFDeEMsSUFBSUUsRUFBRTtRQUVOLElBQUl6RixJQUFJLENBQUNxQixJQUFJLEtBQUssV0FBVyxFQUFFO1VBQzdCb0UsRUFBRSxHQUFHLElBQUksQ0FBQ2hJLFNBQVM7UUFDckIsQ0FBQyxNQUFNO1VBQ0xnSSxFQUFFLEdBQUcsSUFBSSxDQUFDakksU0FBUztRQUNyQjtRQUVBaUksRUFBRSxDQUFDRCxHQUFHLENBQUM7UUFDUHhGLElBQUksQ0FBQ1gsSUFBSSxDQUFDVyxJQUFJLEdBQUd3RixHQUFHO01BRXRCO01BRUEsSUFBSXZFLFFBQVEsR0FBR2pCLElBQUksQ0FBQ0EsSUFBSSxFQUFFaUIsUUFBUTtNQUNsQyxJQUFJQSxRQUFRLEVBQUU7UUFDWmpCLElBQUksQ0FBQ0EsSUFBSSxDQUFDaUIsUUFBUSxHQUFHakYsSUFBSSxDQUFDQyxLQUFLLENBQUMrRCxJQUFJLENBQUNBLElBQUksQ0FBQ2lCLFFBQVEsQ0FBQztNQUNyRDtNQUVBLElBQUksSUFBSSxDQUFDMUQsWUFBWSxDQUFDeEIsY0FBYyxDQUFDaUUsSUFBSSxDQUFDWixRQUFRLENBQUMsRUFBRTtRQUNuRCxJQUFJLENBQUM3QixZQUFZLENBQUN5QyxJQUFJLENBQUNaLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDWSxJQUFJLENBQUM7UUFDekMsSUFBSSxDQUFDbUYsaUJBQWlCLENBQUNuRixJQUFJLENBQUNaLFFBQVEsQ0FBQztNQUN2QztJQUNGO0VBQ0Y7RUFFQXNHLGNBQWNBLENBQUEsRUFBRztJQUNmLE9BQU8sSUFBSTdHLE9BQU8sQ0FBQ0MsT0FBTyxJQUFJO01BQzVCLElBQUlOLE1BQU0sQ0FBQ21ILElBQUksQ0FBQyxJQUFJLENBQUNwSSxZQUFZLENBQUMsQ0FBQ1gsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMvQyxPQUFPa0MsT0FBTyxDQUFDLENBQUM7TUFDbEI7TUFFQSxJQUFJLENBQUM5QixpQkFBaUIsQ0FBQ3NCLElBQUksQ0FBQ1EsT0FBTyxDQUFDO0lBQ3RDLENBQUMsQ0FBQztFQUNKO0VBRUFxRyxpQkFBaUJBLENBQUMvRixRQUFRLEVBQUU7SUFDMUIsT0FBTyxJQUFJLENBQUM3QixZQUFZLENBQUM2QixRQUFRLENBQUM7SUFDbEMsSUFBSVosTUFBTSxDQUFDbUgsSUFBSSxDQUFDLElBQUksQ0FBQ3BJLFlBQVksQ0FBQyxDQUFDWCxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQy9DLElBQUksQ0FBQ0ksaUJBQWlCLENBQUNpRyxPQUFPLENBQUMyQyxDQUFDLElBQUlBLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDeEMsSUFBSSxDQUFDNUksaUJBQWlCLEdBQUcsRUFBRTtJQUM3QjtFQUVGO0VBRUF1RyxnQkFBZ0JBLENBQUEsRUFBRztJQUNqQixPQUFPLElBQUkxRSxPQUFPLENBQUVDLE9BQU8sSUFBSztNQUU5QixNQUFNK0csZ0JBQWdCLEdBQUcsR0FBRyxJQUFJLENBQUMvSSxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUNnSixRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDQSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUM7TUFDOUYsSUFBSUMsTUFBTSxDQUFDQyxRQUFRLENBQUNDLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFDekMsSUFBSSxDQUFDM0ksTUFBTSxHQUFHLElBQUk0SSxTQUFTLENBQUMsU0FBU0gsTUFBTSxDQUFDQyxRQUFRLENBQUNHLElBQUksaUJBQWlCTixnQkFBZ0IsRUFBRSxDQUFDO01BQy9GLENBQUMsTUFBTTtRQUNMLElBQUksQ0FBQ3ZJLE1BQU0sR0FBRyxJQUFJNEksU0FBUyxDQUFDLFFBQVFILE1BQU0sQ0FBQ0MsUUFBUSxDQUFDRyxJQUFJLGlCQUFpQk4sZ0JBQWdCLEVBQUUsQ0FBQztNQUM5RjtNQUdBLElBQUksQ0FBQ3ZJLE1BQU0sQ0FBQzhJLFNBQVMsR0FBRyxJQUFJLENBQUNuQixVQUFVLENBQUNySixJQUFJLENBQUMsSUFBSSxDQUFDO01BRWxELElBQUksQ0FBQzBCLE1BQU0sQ0FBQ3NHLE9BQU8sR0FBSU8sQ0FBQyxJQUFLO1FBQzNCa0MsT0FBTyxDQUFDQyxLQUFLLENBQUMsY0FBYyxJQUFJLENBQUN4SixVQUFVLEtBQUssSUFBSSxDQUFDZ0osUUFBUSw4QkFBOEIsQ0FBQztRQUM1RixJQUFJLENBQUMzSSxhQUFhLEdBQUcsS0FBSztRQUMxQixLQUFLLE1BQU0sQ0FBQ29KLElBQUksRUFBRWhMLEtBQUssQ0FBQyxJQUFJaUQsTUFBTSxDQUFDdUYsT0FBTyxDQUFDLElBQUksQ0FBQ3hHLFlBQVksQ0FBQyxFQUFFO1VBQzdEaEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDNEksQ0FBQyxDQUFDO1FBQ2I7UUFDQSxJQUFJLENBQUM1RyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRXRCaUosVUFBVSxDQUFDLE1BQU07VUFDZixJQUFJLElBQUksQ0FBQ25KLGVBQWUsRUFBRTtZQUN4QixJQUFJLENBQUNrRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM1RSxJQUFJLENBQUMsTUFBTSxDQUNuQyxDQUFDLENBQUM7VUFDSjtRQUNGLENBQUMsRUFBRSxJQUFJLENBQUM7TUFDVixDQUFDO01BRUQsSUFBSSxDQUFDckIsTUFBTSxDQUFDeUgsT0FBTyxHQUFJMEIsR0FBRyxJQUFLO1FBQzdCSixPQUFPLENBQUNDLEtBQUssQ0FBQyxtQ0FBbUNHLEdBQUcsaUJBQWlCLENBQUM7UUFDdEUsSUFBSSxJQUFJLENBQUN0SixhQUFhLEVBQUU7VUFDdEIsSUFBSTtZQUNGLElBQUksQ0FBQ0csTUFBTSxDQUFDcUcsS0FBSyxDQUFDLENBQUM7VUFDckIsQ0FBQyxDQUFDLE9BQU9RLENBQUMsRUFBRSxDQUVaO1FBQ0Y7TUFDRixDQUFDO01BR0QsSUFBSSxDQUFDN0csTUFBTSxDQUFDb0osTUFBTSxHQUFHLE1BQU07UUFDekI1SCxPQUFPLENBQUMsQ0FBQztNQUNYLENBQUM7SUFDSCxDQUFDLENBQUM7RUFFSjtFQUVBMEUsZ0JBQWdCQSxDQUFBLEVBQUc7SUFDakIsTUFBTTVFLEVBQUUsR0FBR3RFLHFEQUFNLENBQUMsQ0FBQztJQUNuQixPQUFPLElBQUl1RSxPQUFPLENBQUMsQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLEtBQUs7TUFDdEMsSUFBSSxDQUFDekIsTUFBTSxDQUFDMEIsSUFBSSxDQUFDaEQsSUFBSSxDQUFDaUQsU0FBUyxDQUFDO1FBQzlCQyxLQUFLLEVBQUUsT0FBTztRQUNkQyxVQUFVLEVBQUUsU0FBUztRQUNyQkMsUUFBUSxFQUFFUixFQUFFO1FBQ1pTLElBQUksRUFBRTtVQUNKdkMsVUFBVSxFQUFFLElBQUksQ0FBQ0EsVUFBVTtVQUMzQkMsV0FBVyxFQUFFLElBQUksQ0FBQ0E7UUFDcEI7TUFDRixDQUFDLENBQUMsQ0FBQztNQUVILElBQUksQ0FBQ1EsWUFBWSxDQUFDcUIsRUFBRSxDQUFDLEdBQUcsQ0FBQ0UsT0FBTyxFQUFFQyxNQUFNLENBQUM7SUFDM0MsQ0FBQyxDQUFDO0VBQ0o7RUFFQW9FLGVBQWVBLENBQUMvQyxHQUFHLEVBQUU7SUFDbkIsSUFBSXVHLE9BQU8sR0FBRyxFQUFFO0lBQ2hCLEtBQUssSUFBSUMsU0FBUyxJQUFJeEcsR0FBRyxFQUFFO01BQ3pCLE1BQU0xRixFQUFFLEdBQUdrTSxTQUFTLENBQUNsTSxFQUFFO01BQ3ZCLE1BQU04SyxHQUFHLEdBQUcsSUFBSSxDQUFDeEgsSUFBSSxDQUFDdEQsRUFBRSxDQUFDO01BQ3pCLEtBQUssTUFBTSxDQUFDbU0sQ0FBQyxFQUFFQyxDQUFDLENBQUMsSUFBSXRJLE1BQU0sQ0FBQ3VGLE9BQU8sQ0FBQzZDLFNBQVMsQ0FBQ0csTUFBTSxDQUFDLEVBQUU7UUFDckQsSUFBSUQsQ0FBQyxJQUFJLE9BQU9BLENBQUMsS0FBSyxRQUFRLElBQUlBLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO1VBQ3ZEdEIsR0FBRyxDQUFDcUIsQ0FBQyxDQUFDLEdBQUcsSUFBSXJNLFFBQVEsQ0FBQ3NNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLENBQUMsTUFBTTtVQUNMdEIsR0FBRyxDQUFDcUIsQ0FBQyxDQUFDLEdBQUdDLENBQUM7UUFDWjtNQUNGO01BRUFILE9BQU8sQ0FBQ3JJLElBQUksQ0FBQ2tILEdBQUcsQ0FBQztJQUNuQjtJQUVBLElBQUksSUFBSSxDQUFDdkksV0FBVyxDQUFDTCxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ2pDLElBQUksQ0FBQ00sTUFBTSxHQUFHLElBQUksQ0FBQ0QsV0FBVyxDQUFDK0UsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsTUFBTTtNQUNMLElBQUksQ0FBQzlFLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbEI7SUFFQSxPQUFPeUosT0FBTztFQUVoQjtBQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19zb2NrZXQuanM/YWRiYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FwcH0gZnJvbSAnLi9zZGNfbWFpbi5qcyc7XG5pbXBvcnQge3RyaWdnZXJ9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcblxuY29uc3QgTUFYX0ZJTEVfVVBMT0FEID0gMjUwMDA7XG5cblxuY2xhc3MgU3ViTW9kZWwge1xuXG4gIGNvbnN0cnVjdG9yKHBrLCBtb2RlbCkge1xuICAgIHRoaXMucGsgPSBwaztcbiAgICB0aGlzLl9tb2RlbCA9IG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNEQyBNb2RlbCBOYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbFxuICAgKi9cbiAgc2V0IG1vZGVsKG1vZGVsKSB7XG4gICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgfVxuXG4gIGdldCBtb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgc3ViIG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEByZXR1cm5zIHtNb2RlbH1cbiAgICovXG4gIGxvYWQoY29udHJvbGxlcikge1xuICAgIGlmICghdGhpcy5fbW9kZWwpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNb2RlbCBpcyBub3Qgc2V0ISFcIik7XG4gICAgfVxuICAgIGlmICh0aGlzLnBrIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLm5ld01vZGVsKHRoaXMuX21vZGVsLCB7cGtfX2luOiB0aGlzLnBrfSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyLm5ld01vZGVsKHRoaXMuX21vZGVsLCB7cGs6IHRoaXMucGt9KTtcbiAgfVxufVxuXG5jb25zdCBNb2RlbFByb3h5SGFuZGxlciA9IHtcbiAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXRba2V5XSA/PyB1bmRlZmluZWQ7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3ViTW9kZWwpIHtcbiAgICAgIGlmICghdmFsdWUucGsgJiYgdmFsdWUucGsgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGxldCBuZXdWYWw7XG4gICAgICBpZiAodmFsdWUucGsgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBuZXdWYWwgPSB2YWx1ZS5way5zbGljZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3VmFsID0gbmV3IE51bWJlcih2YWx1ZS5wayk7XG4gICAgICB9XG4gICAgICBuZXdWYWwubG9hZCA9IHZhbHVlLmxvYWQuYmluZCh2YWx1ZSk7XG4gICAgICByZXR1cm4gbmV3VmFsO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG4gIHNldCh0YXJnZXQsIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5IGluIHRhcmdldCkge1xuICAgICAgY29uc3Qgb2xkVmFsID0gdGFyZ2V0W2tleV07XG4gICAgICBpZiAob2xkVmFsIGluc3RhbmNlb2YgU3ViTW9kZWwpIHtcbiAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KCdwaycpKSB7XG4gICAgICAgICAgb2xkVmFsLnBrID0gdmFsdWUucGs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG9sZFZhbC5wayA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgb2xkVmFsLnBrID0gdmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cblxuZnVuY3Rpb24gcGFyc2VfaGlkZGVuX2lucHV0cyh2YWx1ZSkge1xuXG4gIGxldCBpc0Zsb2F0UmVnID0gL14tP1xcZCtcXC4/XFxkKyQvO1xuICBsZXQgaXNJbnRSZWcgPSAvXi0/XFxkKyQvO1xuICBsZXQgaXNCb29sUmVnID0gL14odHJ1ZXxmYWxzZSkkLztcbiAgbGV0IGlzU3RyaW5nUmVnID0gL14oWyddW14nXSpbJ10pfChbXCJdW15cIl0qW1wiXSkkLztcblxuXG4gIGlmICh2YWx1ZS50b0xvd2VyQ2FzZSgpLm1hdGNoKGlzQm9vbFJlZykpIHtcbiAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSBpZiAodmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAodmFsdWUubWF0Y2goaXNJbnRSZWcpKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc0Zsb2F0UmVnKSkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc1N0cmluZ1JlZykpIHtcbiAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuXG5leHBvcnQgY2xhc3MgTW9kZWwge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsX25hbWUge3N0cmluZ31cbiAgICogQHBhcmFtIG1vZGVsX3F1ZXJ5IHtqc29ufVxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kZWxfbmFtZSwgbW9kZWxfcXVlcnkgPSB7fSkge1xuICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLnZhbHVlc19saXN0ID0gW107XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICB0aGlzLm1vZGVsX25hbWUgPSBtb2RlbF9uYW1lO1xuICAgIHRoaXMubW9kZWxfcXVlcnkgPSBtb2RlbF9xdWVyeTtcbiAgICB0aGlzLl9pc19jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc19jb25uZXRpbmdfcHJvY2VzcyA9IGZhbHNlO1xuICAgIHRoaXMuX2F1dG9fcmVjb25uZWN0ID0gdHJ1ZTtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgdGhpcy5vcGVuX3JlcXVlc3QgPSB7fTtcbiAgICB0aGlzLm9uX3VwZGF0ZSA9ICgpID0+IHtcbiAgICB9O1xuICAgIHRoaXMub25fY3JlYXRlID0gKCkgPT4ge1xuICAgIH07XG5cbiAgICB0aGlzLmZvcm1faWQgPSB1dWlkdjQoKTtcbiAgfVxuXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIGxldCBpZHggPSAtMTtcbiAgICByZXR1cm4ge1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICArK2lkeDtcbiAgICAgICAgaWYgKGlkeCA8IHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHt2YWx1ZTogdGhpcy52YWx1ZXNfbGlzdFtpZHhdLCBkb25lOiBmYWxzZX07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHt2YWx1ZTogbnVsbCwgZG9uZTogdHJ1ZX07XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXNfbGlzdC5sZW5ndGg7XG4gIH1cblxuICBieVBrKHBrKSB7XG4gICAgaWYgKHBrICE9PSBudWxsKSB7XG4gICAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICAgIGlmIChpc05hTihwaykpIHtcbiAgICAgICAgcGsgPSAtMTtcbiAgICAgIH1cbiAgICAgIGxldCBlbGVtID0gdGhpcy52YWx1ZXNfbGlzdC5maW5kKGVsbSA9PiBlbG0ucGsgPT09IHBrKTtcbiAgICAgIGlmICghZWxlbSkge1xuICAgICAgICBlbGVtID0gbmV3IFByb3h5KHtwazogcGt9LCBNb2RlbFByb3h5SGFuZGxlcik7XG4gICAgICAgIHRoaXMudmFsdWVzX2xpc3QucHVzaChlbGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGVtO1xuICAgIH1cbiAgICByZXR1cm4ge3BrOiBwa307XG5cbiAgfVxuXG4gIGZpbHRlcihtb2RlbF9xdWVyeSkge1xuICAgIHRoaXMubW9kZWxfcXVlcnkgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm1vZGVsX3F1ZXJ5LCBtb2RlbF9xdWVyeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgZXZlbnRfdHlwZTogJ2xvYWQnLFxuICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeVxuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBsaXN0VmlldyhmaWx0ZXIgPSB7fSwgY2JSZXNvbHZlID0gbnVsbCwgY2JSZWplY3QgPSBudWxsLCB0ZW1wbGF0ZUNvbnRleHQgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLnZpZXcoe2ZpbHRlciwgY2JSZXNvbHZlLCBjYlJlamVjdCwgdGVtcGxhdGVDb250ZXh0fSlcbiAgfVxuXG4gIHZpZXcoe3ZpZXdOYW1lID0gJ2h0bWxfbGlzdF90ZW1wbGF0ZScsIGZpbHRlciA9IHt9LCBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwsIHRlbXBsYXRlQ29udGV4dCA9IHt9fSkge1xuICAgIGxldCAkZGl2X2xpc3QgPSAkKCc8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgZXZlbnRfdHlwZTogJ25hbWVkX3ZpZXcnLFxuICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICB2aWV3X25hbWU6IHZpZXdOYW1lLFxuICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgdGVtcGxhdGVfY29udGV4dDogdGVtcGxhdGVDb250ZXh0XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhkYXRhKSA9PiB7XG4gICAgICAgICRkaXZfbGlzdC5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgICAgYXBwLnJlZnJlc2goJGRpdl9saXN0KTtcbiAgICAgICAgY2JSZXNvbHZlICYmIGNiUmVzb2x2ZShkYXRhKTtcbiAgICAgIH0sIChyZXMpID0+IHtcbiAgICAgICAgY2JSZWplY3QgJiYgY2JSZWplY3QocmVzKTtcbiAgICAgIH1dO1xuXG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdl9saXN0O1xuICB9XG5cbiAgZGV0YWlsVmlldyhwayA9IG51bGwsIGNiX3Jlc29sdmUgPSBudWxsLCBjYl9yZWplY3QgPSBudWxsLCB0ZW1wbGF0ZV9jb250ZXh0ID0ge30pIHtcbiAgICBwayA9IHBrID8/IC0xO1xuICAgIHBrID0gcGFyc2VJbnQocGspO1xuICAgIGlmIChpc05hTihwaykpIHtcbiAgICAgIHBrID0gLTE7XG4gICAgfVxuICAgIGxldCAkZGl2X2xpc3QgPSAkKCc8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG5cbiAgICBsZXQgbG9hZF9wcm9taXNlO1xuICAgIGlmICh0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5pc0Nvbm5lY3RlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkX3Byb21pc2UgPSB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBsb2FkX3Byb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBpZiAocGsgPT09IC0xKSB7XG4gICAgICAgIHBrID0gdGhpcy52YWx1ZXNfbGlzdFswXS5wa1xuICAgICAgfVxuICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgZXZlbnRfdHlwZTogJ2RldGFpbF92aWV3JyxcbiAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgIHBrLFxuICAgICAgICAgIHRlbXBsYXRlX2NvbnRleHRcbiAgICAgICAgfVxuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbKGRhdGEpID0+IHtcbiAgICAgICAgJGRpdl9saXN0LmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICBhcHAucmVmcmVzaCgkZGl2X2xpc3QpO1xuICAgICAgICBjYl9yZXNvbHZlICYmIGNiX3Jlc29sdmUoZGF0YSk7XG4gICAgICB9LCAocmVzKSA9PiB7XG4gICAgICAgIGNiX3JlamVjdCAmJiBjYl9yZWplY3QocmVzKTtcbiAgICAgIH1dO1xuXG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdl9saXN0O1xuICB9XG5cbiAgc3luY0Zvcm1Ub01vZGVsKCRmb3Jtcykge1xuICAgIHJldHVybiB0aGlzLnN5bmNGb3JtKCRmb3Jtcyk7XG4gIH1cblxuICBzeW5jTW9kZWxUb0Zvcm0oJGZvcm1zKSB7XG4gICAgaWYgKCEkZm9ybXMgfHwgISRmb3Jtcy5oYXNDbGFzcyh0aGlzLmZvcm1faWQpKSB7XG4gICAgICAkZm9ybXMgPSAkKGAuJHt0aGlzLmZvcm1faWR9YCk7XG4gICAgfVxuXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICRmb3Jtcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtbW9kZWxfcGsnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgcGsgPSAkKHRoaXMpLmRhdGEoJ21vZGVsX3BrJyk7XG4gICAgICBsZXQgaW5zdGFuY2UgPSBzZWxmLmJ5UGsocGspO1xuICAgICAgZm9yIChsZXQgZm9ybV9pdGVtIG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmb3JtX2l0ZW0ubmFtZTtcbiAgICAgICAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gJycpIHtcbiAgICAgICAgICBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICAgIGZvcm1faXRlbS5jaGVja2VkID0gaW5zdGFuY2VbbmFtZV07XG4gICAgICAgICAgfSBlbHNlIGlmIChmb3JtX2l0ZW0udHlwZSA9PT0gJ2ZpbGUnICYmIGluc3RhbmNlW25hbWVdIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IG5ldyBEYXRhVHJhbnNmZXIoKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pdGVtcy5hZGQoaW5zdGFuY2VbbmFtZV0pO1xuICAgICAgICAgICAgZm9ybV9pdGVtLmZpbGVzID0gY29udGFpbmVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKGZvcm1faXRlbSkudmFsKGluc3RhbmNlW25hbWVdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgc3luY0Zvcm0oJGZvcm1zKSB7XG4gICAgaWYgKCEkZm9ybXMgfHwgISRmb3Jtcy5oYXNDbGFzcyh0aGlzLmZvcm1faWQpKSB7XG4gICAgICAkZm9ybXMgPSAkKGAuJHt0aGlzLmZvcm1faWR9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgbGV0IGluc3RhbmNlcyA9IFtdO1xuXG4gICAgJGZvcm1zLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbGV0ICRmb3JtID0gJCh0aGlzKTtcbiAgICAgIGxldCBwayA9ICRmb3JtLmRhdGEoJ21vZGVsX3BrJyk7XG4gICAgICBsZXQgaW5zdGFuY2UgPSBzZWxmLmJ5UGsocGspO1xuICAgICAgZm9yIChsZXQgZm9ybV9pdGVtIG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmb3JtX2l0ZW0ubmFtZTtcbiAgICAgICAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gJycpIHtcbiAgICAgICAgICBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9IHBhcnNlX2hpZGRlbl9pbnB1dHMoJChmb3JtX2l0ZW0pLnZhbCgpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1faXRlbS50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9IGZvcm1faXRlbS5jaGVja2VkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgaW5zdGFuY2VbbmFtZV0gPSBmb3JtX2l0ZW0uZmlsZXNbMF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluc3RhbmNlW25hbWVdID0gJChmb3JtX2l0ZW0pLnZhbCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy52YWx1ZXNfbGlzdC5sZW5ndGggPD0gMSAmJiBpbnN0YW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy52YWx1ZXMgPSBpbnN0YW5jZXMuYXQoLTEpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZXM7XG5cbiAgfVxuXG4gIGNyZWF0ZUZvcm0oY2JfcmVzb2x2ZSA9IG51bGwsIGNiX3JlamVjdCA9IG51bGwpIHtcbiAgICBsZXQgJGRpdl9mb3JtID0gJCgnPGRpdj4nKTtcbiAgICB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLl9nZXRGb3JtKG51bGwsICdjcmVhdGVfZm9ybScsIG51bGwsICRkaXZfZm9ybSwgY2JfcmVzb2x2ZSwgY2JfcmVqZWN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2X2Zvcm07XG4gIH1cblxuICBlZGl0Rm9ybShwayA9IC0xLCBjYl9yZXNvbHZlID0gbnVsbCwgY2JfcmVqZWN0ID0gbnVsbCkge1xuICAgIHBrID0gcGFyc2VJbnQocGspO1xuICAgIGlmIChpc05hTihwaykpIHtcbiAgICAgIHBrID0gLTE7XG4gICAgfVxuICAgIGxldCBsb2FkX3Byb21pc2U7XG4gICAgaWYgKHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoICE9PSAwKSB7XG4gICAgICBsb2FkX3Byb21pc2UgPSB0aGlzLmlzQ29ubmVjdGVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRfcHJvbWlzZSA9IHRoaXMubG9hZCgpO1xuICAgIH1cblxuICAgIGxldCAkZGl2X2Zvcm0gPSAkKCc8ZGl2PicpO1xuXG4gICAgbG9hZF9wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHBrIDw9IC0xKSB7XG4gICAgICAgIHBrID0gdGhpcy52YWx1ZXNfbGlzdC5hdChwaykucGs7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2dldEZvcm0ocGssICdlZGl0X2Zvcm0nLCBudWxsLCAkZGl2X2Zvcm0sIGNiX3Jlc29sdmUsIGNiX3JlamVjdCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdl9mb3JtO1xuICB9XG5cbiAgbmFtZWRGb3JtKHBrID0gLTEsIGZvcm1OYW1lLCBjYl9yZXNvbHZlID0gbnVsbCwgY2JfcmVqZWN0ID0gbnVsbCkge1xuICAgIHBrID0gcGFyc2VJbnQocGspO1xuICAgIGlmIChpc05hTihwaykpIHtcbiAgICAgIHBrID0gLTE7XG4gICAgfVxuICAgIGxldCBsb2FkX3Byb21pc2U7XG4gICAgaWYgKHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoICE9PSAwKSB7XG4gICAgICBsb2FkX3Byb21pc2UgPSB0aGlzLmlzQ29ubmVjdGVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRfcHJvbWlzZSA9IHRoaXMubG9hZCgpO1xuICAgIH1cblxuICAgIGxldCAkZGl2X2Zvcm0gPSAkKCc8ZGl2ICBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuXG4gICAgbG9hZF9wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHBrIDw9IC0xKSB7XG4gICAgICAgIHBrID0gdGhpcy52YWx1ZXNfbGlzdC5hdChwaykucGs7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2dldEZvcm0ocGssICduYW1lZF9mb3JtJywgZm9ybU5hbWUsICRkaXZfZm9ybSwgY2JfcmVzb2x2ZSwgY2JfcmVqZWN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2X2Zvcm07XG4gIH1cblxuXG4gIF9nZXRGb3JtKHBrLCBldmVudF90eXBlLCBmb3JtTmFtZSwgJGRpdl9mb3JtLCBjYl9yZXNvbHZlLCBjYl9yZWplY3QpIHtcbiAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICBwayA9IC0xO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICBldmVudF90eXBlOiBldmVudF90eXBlLFxuICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgYXJnczoge1xuICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICBwazogcGssXG4gICAgICAgIGZvcm1fbmFtZTogZm9ybU5hbWVcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSBwayA9PT0gbnVsbCB8fCBwayA9PT0gLTEgPyAnY3JlYXRlJyA6ICdlZGl0JztcblxuICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsoZGF0YSkgPT4ge1xuICAgICAgJGRpdl9mb3JtLmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgbGV0ICRmb3JtID0gJGRpdl9mb3JtLmNsb3Nlc3QoJ2Zvcm0nKVxuICAgICAgICAuYWRkQ2xhc3MoYHNkYy1tb2RlbC0ke2NsYXNzTmFtZX0tZm9ybSBzZGMtbW9kZWwtZm9ybSAke3RoaXMuZm9ybV9pZH1gKVxuICAgICAgICAuZGF0YSgnbW9kZWwnLCB0aGlzKVxuICAgICAgICAuZGF0YSgnbW9kZWxfcGsnLCBwaylcbiAgICAgICAgLmRhdGEoJ2Zvcm1fbmFtZScsIGZvcm1OYW1lKTtcbiAgICAgIGlmICgkZm9ybS5sZW5ndGggPiAwICYmICEkZm9ybVswXS5oYXNBdHRyaWJ1dGUoJ3NkY19zdWJtaXQnKSkge1xuICAgICAgICAkZm9ybS5hdHRyKCdzZGNfc3VibWl0JywgJ3N1Ym1pdE1vZGVsRm9ybURpc3RyaWJ1dG9yJylcbiAgICAgIH1cblxuICAgICAgYXBwLnJlZnJlc2goJGRpdl9mb3JtKTtcbiAgICAgIGNiX3Jlc29sdmUgJiYgY2JfcmVzb2x2ZShkYXRhKTtcbiAgICB9LCAocmVzKSA9PiB7XG4gICAgICBjYl9yZWplY3QgJiYgY2JfcmVqZWN0KHJlcyk7XG4gICAgfV07XG4gIH1cblxuICBuZXcoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0ICRmb3JtID0gJCgnPGZvcm0+JykuYXBwZW5kKHRoaXMuY3JlYXRlRm9ybSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3luY0Zvcm1Ub01vZGVsKCRmb3JtKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwgcmVqZWN0KSk7XG4gICAgfSlcbiAgfVxuXG4gIHNhdmUocGsgPSAtMSwgZnJvbU5hbWUgPSAnZWRpdF9mb3JtJykge1xuICAgIHBrID0gcGFyc2VJbnQocGspO1xuICAgIGlmIChpc05hTihwaykpIHtcbiAgICAgIHBrID0gLTE7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBsZXQgZWxlbV9saXN0O1xuICAgICAgaWYgKHBrID4gLTEpIHtcbiAgICAgICAgZWxlbV9saXN0ID0gW3RoaXMuYnlQayhwayldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbV9saXN0ID0gdGhpcy52YWx1ZXNfbGlzdDtcbiAgICAgIH1cbiAgICAgIGxldCBwX2xpc3QgPSBbXVxuICAgICAgZWxlbV9saXN0LmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgcF9saXN0LnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3JlYWRGaWxlcyhlbGVtKS50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICBldmVudF90eXBlOiAnc2F2ZScsXG4gICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgIGZvcm1fbmFtZTogZnJvbU5hbWUsXG4gICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgICAgIGRhdGE6IGVsZW0sXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhyZXMpID0+IHtcbiAgICAgICAgICAgICAgbGV0IGRhdGEgPSB0eXBlb2YgcmVzLmRhdGEuaW5zdGFuY2UgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShyZXMuZGF0YS5pbnN0YW5jZSkgOiByZXMuZGF0YS5pbnN0YW5jZTtcbiAgICAgICAgICAgICAgcmVzLmRhdGEuaW5zdGFuY2UgPSB0aGlzLl9wYXJzZVNlcnZlclJlcyhkYXRhKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgfSwgcmVqZWN0XTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChwX2xpc3QpO1xuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlKHZhbHVlcyA9IHRoaXMudmFsdWVzKSB7XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fcmVhZEZpbGVzKHZhbHVlcykudGhlbigoZmlsZXMpID0+IHtcbiAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgZXZlbnRfdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnksXG4gICAgICAgICAgICAgIGRhdGE6IHZhbHVlcyxcbiAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhyZXMpID0+IHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdHlwZW9mIHJlcy5kYXRhLmluc3RhbmNlID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UocmVzLmRhdGEuaW5zdGFuY2UpIDogcmVzLmRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZXM/LnBrID09PSAtMSkge1xuICAgICAgICAgICAgICB0aGlzLnZhbHVlc19saXN0ID0gW107XG4gICAgICAgICAgICAgIHRoaXMudmFsdWVzID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5kYXRhLmluc3RhbmNlID0gdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoZGF0YSlbMF07XG4gICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgfSwgcmVqZWN0XTtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlKHBrID0gLTEpIHtcbiAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICBwayA9IC0xO1xuICAgIH1cbiAgICBpZiAocGsgPT09IC0xKSBwayA9IHRoaXMudmFsdWVzPy5waztcbiAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICBldmVudF90eXBlOiAnZGVsZXRlJyxcbiAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnksXG4gICAgICAgICAgICBwazogcGtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcblxuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc19jb25uZWN0ZWQpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MpIHtcbiAgICAgICAgdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MgPSB0cnVlO1xuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddID0gWygpID0+IHtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9XVxuICAgICAgICB0aGlzLl9jb25uZWN0VG9TZXJ2ZXIoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHRoaXMuX2NoZWNrQ29ubmVjdGlvbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbcmVzb2x2ZV9vcmlnaW4sIHJlamVjdF9vcmlnaW5dID0gdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXTtcbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXSA9IFtcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlX29yaWdpbigpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0X29yaWdpbigpO1xuICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuX2F1dG9fcmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgfTtcbiAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICBkZWxldGUgdGhpc1snc29ja2V0J107XG4gICAgfVxuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgdGhpcy52YWx1ZXNfbGlzdCA9IFtdO1xuICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBfcmVhZEZpbGVzKGVsZW0pIHtcbiAgICBsZXQgdG9fc29sdmUgPSBbXTtcbiAgICAxMDBcbiAgICBsZXQgZmlsZXMgPSB7fVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVsZW0pKSB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIHRvX3NvbHZlLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICgoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuXG4gICAgICAgICAgICAgIGxldCByZXN1bHQgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgIGxldCBudW1iZXJfb2ZfY2h1bmtzID0gcGFyc2VJbnQoTWF0aC5jZWlsKHJlc3VsdC5sZW5ndGggLyBNQVhfRklMRV9VUExPQUQpKTtcbiAgICAgICAgICAgICAgZmlsZXNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgZmlsZV9uYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICAgIGZpZWxkX25hbWU6IGtleSxcbiAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aDogdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJfb2ZfY2h1bmtzOyArK2kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ3VwbG9hZCcsXG4gICAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rOiByZXN1bHQuc2xpY2UoTUFYX0ZJTEVfVVBMT0FEICogaSwgTUFYX0ZJTEVfVVBMT0FEICogKGkgKyAxKSksXG4gICAgICAgICAgICAgICAgICAgIGlkeDogaSxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2NodW5rczogbnVtYmVyX29mX2NodW5rcyxcbiAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoOiB2YWx1ZS5zaXplLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcodmFsdWUpO1xuICAgICAgICAgIH0pKGtleSwgdmFsdWUpO1xuICAgICAgICB9KSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodG9fc29sdmUpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGZpbGVzXG4gICAgfSk7XG4gIH1cblxuICBfb25NZXNzYWdlKGUpIHtcbiAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICBpZiAoZGF0YS5pc19lcnJvcikge1xuICAgICAgaWYgKHRoaXMub3Blbl9yZXF1ZXN0Lmhhc093blByb3BlcnR5KGRhdGEuZXZlbnRfaWQpKSB7XG4gICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2RhdGEuZXZlbnRfaWRdWzFdKGRhdGEpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KGRhdGEuZXZlbnRfaWQpO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICAgIHRyaWdnZXIoJ3B1c2hFcnJvck1zZycsIGRhdGEuaGVhZGVyIHx8ICcnLCBkYXRhLm1zZyB8fCAnJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdjb25uZWN0Jykge1xuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddWzFdKGRhdGEpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KCdfY29ubmVjdGluZ19wcm9jZXNzJyk7XG4gICAgICAgIHRoaXMuX2F1dG9fcmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcblxuICAgICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICAgIHRyaWdnZXIoJ3B1c2hNc2cnLCBkYXRhLmhlYWRlciB8fCAnJywgZGF0YS5tc2cgfHwgJycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS50eXBlID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgdGhpcy5faXNfY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXVswXShkYXRhKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdCgnX2Nvbm5lY3RpbmdfcHJvY2VzcycpO1xuICAgICAgfSBlbHNlIGlmIChbJ2xvYWQnLCAnbmFtZWRfdmlldycsICdkZXRhaWxfdmlldyddLmluY2x1ZGVzKGRhdGEudHlwZSkpIHtcbiAgICAgICAgY29uc3QganNvbl9yZXMgPSBKU09OLnBhcnNlKGRhdGEuYXJncy5kYXRhKTtcbiAgICAgICAgdGhpcy52YWx1ZXNfbGlzdCA9IFtdO1xuICAgICAgICBkYXRhLmFyZ3MuZGF0YSA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGpzb25fcmVzKTtcblxuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdvbl91cGRhdGUnIHx8IGRhdGEudHlwZSA9PT0gJ29uX2NyZWF0ZScpIHtcbiAgICAgICAgY29uc3QganNvbl9yZXMgPSBKU09OLnBhcnNlKGRhdGEuYXJncy5kYXRhKTtcblxuICAgICAgICBsZXQgb2JqID0gdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoanNvbl9yZXMpO1xuICAgICAgICBsZXQgY2I7XG5cbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ29uX2NyZWF0ZScpIHtcbiAgICAgICAgICBjYiA9IHRoaXMub25fY3JlYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNiID0gdGhpcy5vbl91cGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjYihvYmopO1xuICAgICAgICBkYXRhLmFyZ3MuZGF0YSA9IG9iajtcblxuICAgICAgfVxuXG4gICAgICBsZXQgaW5zdGFuY2UgPSBkYXRhLmRhdGE/Lmluc3RhbmNlXG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgZGF0YS5kYXRhLmluc3RhbmNlID0gSlNPTi5wYXJzZShkYXRhLmRhdGEuaW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcGVuX3JlcXVlc3QuaGFzT3duUHJvcGVydHkoZGF0YS5ldmVudF9pZCkpIHtcbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbZGF0YS5ldmVudF9pZF1bMF0oZGF0YSk7XG4gICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoZGF0YS5ldmVudF9pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbm9PcGVuUmVxdWVzdHMoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMub3Blbl9yZXF1ZXN0KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cy5wdXNoKHJlc29sdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgX2Nsb3NlT3BlblJlcXVlc3QoZXZlbnRfaWQpIHtcbiAgICBkZWxldGUgdGhpcy5vcGVuX3JlcXVlc3RbZXZlbnRfaWRdO1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm9wZW5fcmVxdWVzdCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzLmZvckVhY2goeCA9PiB4KCkpO1xuICAgICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cyA9IFtdO1xuICAgIH1cblxuICB9XG5cbiAgX2Nvbm5lY3RUb1NlcnZlcigpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblxuICAgICAgY29uc3QgbW9kZWxfaWRlbnRpZmllciA9IGAke3RoaXMubW9kZWxfbmFtZX1gICsgKHRoaXMubW9kZWxfaWQgPiAwID8gYC8ke3RoaXMubW9kZWxfaWR9YCA6ICcnKTtcbiAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KGB3c3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3MvbW9kZWwvJHttb2RlbF9pZGVudGlmaWVyfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy9tb2RlbC8ke21vZGVsX2lkZW50aWZpZXJ9YCk7XG4gICAgICB9XG5cblxuICAgICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fb25NZXNzYWdlLmJpbmQodGhpcyk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBTREMgTW9kZWwgKCR7dGhpcy5tb2RlbF9uYW1lfSwgJHt0aGlzLm1vZGVsX2lkfSkgU29ja2V0IGNsb3NlZCB1bmV4cGVjdGVkbHlgKTtcbiAgICAgICAgdGhpcy5faXNfY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgW19rZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9wZW5fcmVxdWVzdCkpIHtcbiAgICAgICAgICB2YWx1ZVsxXShlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdCA9IHt9O1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9hdXRvX3JlY29ubmVjdCkge1xuICAgICAgICAgICAgdGhpcy5fY29ubmVjdFRvU2VydmVyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgTW9kZWwgU29ja2V0IGVuY291bnRlcmVkIGVycm9yOiAke2Vycn0gQ2xvc2luZyBzb2NrZXRgKTtcbiAgICAgICAgaWYgKHRoaXMuX2lzX2Nvbm5lY3RlZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuXG4gICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgX2NoZWNrQ29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgIGV2ZW50X3R5cGU6ICdjb25uZWN0JyxcbiAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgfSk7XG4gIH1cblxuICBfcGFyc2VTZXJ2ZXJSZXMocmVzKSB7XG4gICAgbGV0IHVwZGF0ZWQgPSBbXTtcbiAgICBmb3IgKGxldCBqc29uX2RhdGEgb2YgcmVzKSB7XG4gICAgICBjb25zdCBwayA9IGpzb25fZGF0YS5waztcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuYnlQayhwayk7XG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhqc29uX2RhdGEuZmllbGRzKSkge1xuICAgICAgICBpZiAodiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdlsnX19pc19zZGNfbW9kZWxfXyddKSB7XG4gICAgICAgICAgb2JqW2tdID0gbmV3IFN1Yk1vZGVsKHZbJ3BrJ10sIHZbJ21vZGVsJ10pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JqW2tdID0gdjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVkLnB1c2gob2JqKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52YWx1ZXNfbGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMudmFsdWVzID0gdGhpcy52YWx1ZXNfbGlzdC5hdCgtMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG5cbiAgfVxufSJdLCJuYW1lcyI6WyJhcHAiLCJ0cmlnZ2VyIiwidXVpZHY0IiwiTUFYX0ZJTEVfVVBMT0FEIiwiU3ViTW9kZWwiLCJjb25zdHJ1Y3RvciIsInBrIiwibW9kZWwiLCJfbW9kZWwiLCJsb2FkIiwiY29udHJvbGxlciIsIlR5cGVFcnJvciIsIkFycmF5IiwibmV3TW9kZWwiLCJwa19faW4iLCJNb2RlbFByb3h5SGFuZGxlciIsImdldCIsInRhcmdldCIsImtleSIsInZhbHVlIiwidW5kZWZpbmVkIiwibmV3VmFsIiwic2xpY2UiLCJOdW1iZXIiLCJiaW5kIiwic2V0Iiwib2xkVmFsIiwiaGFzT3duUHJvcGVydHkiLCJKU09OIiwicGFyc2UiLCJwYXJzZV9oaWRkZW5faW5wdXRzIiwiaXNGbG9hdFJlZyIsImlzSW50UmVnIiwiaXNCb29sUmVnIiwiaXNTdHJpbmdSZWciLCJ0b0xvd2VyQ2FzZSIsIm1hdGNoIiwicGFyc2VJbnQiLCJwYXJzZUZsb2F0Iiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiTW9kZWwiLCJtb2RlbF9uYW1lIiwibW9kZWxfcXVlcnkiLCJfb25Ob09wZW5SZXF1ZXN0cyIsInZhbHVlc19saXN0IiwidmFsdWVzIiwiX2lzX2Nvbm5lY3RlZCIsIl9pc19jb25uZXRpbmdfcHJvY2VzcyIsIl9hdXRvX3JlY29ubmVjdCIsInNvY2tldCIsIm9wZW5fcmVxdWVzdCIsIm9uX3VwZGF0ZSIsIm9uX2NyZWF0ZSIsImZvcm1faWQiLCJTeW1ib2wiLCJpdGVyYXRvciIsImlkeCIsIm5leHQiLCJkb25lIiwiYnlQayIsImlzTmFOIiwiZWxlbSIsImZpbmQiLCJlbG0iLCJQcm94eSIsInB1c2giLCJmaWx0ZXIiLCJPYmplY3QiLCJhc3NpZ24iLCJpc0Nvbm5lY3RlZCIsInRoZW4iLCJpZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwic2VuZCIsInN0cmluZ2lmeSIsImV2ZW50IiwiZXZlbnRfdHlwZSIsImV2ZW50X2lkIiwiYXJncyIsImxpc3RWaWV3IiwiY2JSZXNvbHZlIiwiY2JSZWplY3QiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJ2aWV3Iiwidmlld05hbWUiLCIkZGl2X2xpc3QiLCIkIiwidmlld19uYW1lIiwidGVtcGxhdGVfY29udGV4dCIsImRhdGEiLCJhcHBlbmQiLCJodG1sIiwicmVmcmVzaCIsInJlcyIsImRldGFpbFZpZXciLCJjYl9yZXNvbHZlIiwiY2JfcmVqZWN0IiwibG9hZF9wcm9taXNlIiwic3luY0Zvcm1Ub01vZGVsIiwiJGZvcm1zIiwic3luY0Zvcm0iLCJzeW5jTW9kZWxUb0Zvcm0iLCJoYXNDbGFzcyIsInNlbGYiLCJlYWNoIiwiaGFzQXR0cmlidXRlIiwiaW5zdGFuY2UiLCJmb3JtX2l0ZW0iLCJlbGVtZW50cyIsIm5hbWUiLCJ0eXBlIiwiY2hlY2tlZCIsIkZpbGUiLCJjb250YWluZXIiLCJEYXRhVHJhbnNmZXIiLCJpdGVtcyIsImFkZCIsImZpbGVzIiwidmFsIiwiaW5zdGFuY2VzIiwiJGZvcm0iLCJhdCIsImNyZWF0ZUZvcm0iLCIkZGl2X2Zvcm0iLCJfZ2V0Rm9ybSIsImVkaXRGb3JtIiwibmFtZWRGb3JtIiwiZm9ybU5hbWUiLCJmb3JtX25hbWUiLCJjbGFzc05hbWUiLCJjbG9zZXN0IiwiYWRkQ2xhc3MiLCJhdHRyIiwibmV3Iiwic2F2ZSIsImZyb21OYW1lIiwiZWxlbV9saXN0IiwicF9saXN0IiwiZm9yRWFjaCIsIl9yZWFkRmlsZXMiLCJfcGFyc2VTZXJ2ZXJSZXMiLCJhbGwiLCJjcmVhdGUiLCJkZWxldGUiLCJfY29ubmVjdFRvU2VydmVyIiwiX2NoZWNrQ29ubmVjdGlvbiIsInJlc29sdmVfb3JpZ2luIiwicmVqZWN0X29yaWdpbiIsImNsb3NlIiwib25jbG9zZSIsImNsZWFuIiwidG9fc29sdmUiLCJlbnRyaWVzIiwicmVhZGVyIiwiRmlsZVJlYWRlciIsIm9ubG9hZCIsImUiLCJyZXN1bHQiLCJudW1iZXJfb2ZfY2h1bmtzIiwiTWF0aCIsImNlaWwiLCJmaWxlX25hbWUiLCJmaWVsZF9uYW1lIiwiY29udGVudF9sZW5ndGgiLCJzaXplIiwiaSIsImNodW5rIiwiY29udGVudF90eXBlIiwib25lcnJvciIsInJlYWRBc0JpbmFyeVN0cmluZyIsIl9vbk1lc3NhZ2UiLCJpc19lcnJvciIsIl9jbG9zZU9wZW5SZXF1ZXN0IiwibXNnIiwiaGVhZGVyIiwiaW5jbHVkZXMiLCJqc29uX3JlcyIsIm9iaiIsImNiIiwibm9PcGVuUmVxdWVzdHMiLCJrZXlzIiwieCIsIm1vZGVsX2lkZW50aWZpZXIiLCJtb2RlbF9pZCIsIndpbmRvdyIsImxvY2F0aW9uIiwicHJvdG9jb2wiLCJXZWJTb2NrZXQiLCJob3N0Iiwib25tZXNzYWdlIiwiY29uc29sZSIsImVycm9yIiwiX2tleSIsInNldFRpbWVvdXQiLCJlcnIiLCJvbm9wZW4iLCJ1cGRhdGVkIiwianNvbl9kYXRhIiwiayIsInYiLCJmaWVsZHMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_socket.js\n\n}");
97
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Model: () => (/* binding */ Model)\n/* harmony export */ });\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n\nconst MAX_FILE_UPLOAD = 25000;\nclass SubModel {\n constructor(pk, model) {\n this.pk = pk;\n this._model = model;\n }\n\n /**\n * SDC Model Name\n * @param {string} model\n */\n set model(model) {\n this._model = model;\n }\n get model() {\n return this._model;\n }\n\n /**\n * Load the sub model.\n *\n * @param {AbstractSDC} controller\n * @returns {Model}\n */\n load(controller) {\n if (!this._model) {\n throw new TypeError(\"Model is not set!!\");\n }\n if (this.pk instanceof Array) {\n return controller.newModel(this._model, {\n pk__in: this.pk\n });\n }\n return controller.newModel(this._model, {\n pk: this.pk\n });\n }\n}\nconst ModelProxyHandler = {\n get(target, key) {\n const value = target[key] ?? undefined;\n if (value instanceof SubModel) {\n if (!value.pk && value.pk !== 0) {\n return null;\n }\n let newVal;\n if (value.pk instanceof Array) {\n newVal = value.pk.slice();\n } else {\n newVal = new Number(value.pk);\n }\n newVal.load = value.load.bind(value);\n return newVal;\n }\n return value;\n },\n set(target, key, value) {\n if (key in target) {\n const oldVal = target[key];\n if (oldVal instanceof SubModel) {\n if (value.hasOwnProperty('pk')) {\n oldVal.pk = value.pk;\n } else {\n try {\n oldVal.pk = JSON.parse(value);\n } catch {\n oldVal.pk = value;\n }\n }\n } else {\n target[key] = value;\n }\n } else {\n target[key] = value;\n }\n return true;\n }\n};\nfunction parse_hidden_inputs(value) {\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n if (value.toLowerCase().match(isBoolReg)) {\n return value.toLowerCase() === 'true';\n } else if (value === 'undefined') {\n return undefined;\n } else if (value.toLowerCase() === 'none') {\n return null;\n } else if (value.match(isIntReg)) {\n return parseInt(value);\n } else if (value.match(isFloatReg)) {\n return parseFloat(value);\n } else if (value.match(isStringReg)) {\n return value.substring(1, value.length - 1);\n }\n return value;\n}\nclass Model {\n /**\n *\n * @param model_name {string}\n * @param model_query {json}\n */\n constructor(model_name, model_query = {}) {\n this._onNoOpenRequests = [];\n this.values_list = [];\n this.values = {};\n this.model_name = model_name;\n this.model_query = model_query;\n this._is_connected = false;\n this._is_conneting_process = false;\n this._auto_reconnect = true;\n this.socket = null;\n this.open_request = {};\n this.on_update = () => {};\n this.on_create = () => {};\n this.form_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n }\n [Symbol.iterator]() {\n let idx = -1;\n return {\n next: () => {\n ++idx;\n if (idx < this.values_list.length) {\n return {\n value: this.values_list[idx],\n done: false\n };\n }\n return {\n value: null,\n done: true\n };\n }\n };\n }\n length() {\n return this.values_list.length;\n }\n byPk(pk) {\n if (pk !== null) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let elem = this.values_list.find(elm => elm.pk === pk);\n if (!elem) {\n elem = new Proxy({\n pk: pk\n }, ModelProxyHandler);\n this.values_list.push(elem);\n }\n return elem;\n }\n return {\n pk: pk\n };\n }\n filter(model_query) {\n this.model_query = Object.assign({}, this.model_query, model_query);\n return this;\n }\n load() {\n return this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'load',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n });\n }\n listView(filter = {}, cbResolve = null, cbReject = null, templateContext = {}) {\n return this.view({\n filter,\n cbResolve,\n cbReject,\n templateContext,\n event_type: 'list_view'\n });\n }\n view({\n viewName = 'html_list_template',\n filter = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {},\n event_type = 'named_view'\n }) {\n let $div_list = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type,\n event_id: id,\n args: {\n view_name: viewName,\n model_name: this.model_name,\n model_query: this.model_query,\n filter,\n template_context: templateContext\n }\n }));\n this.open_request[id] = [data => {\n $div_list.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_list);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n });\n return $div_list;\n }\n detailView(pk = null, cb_resolve = null, cb_reject = null, template_context = {}) {\n pk = pk ?? -1;\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let $div_list = $('<div class=\"container-fluid\">');\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n load_promise.then(() => {\n if (pk === -1) {\n pk = this.values_list[0].pk;\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'detail_view',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk,\n template_context\n }\n }));\n this.open_request[id] = [data => {\n $div_list.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_list);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n });\n return $div_list;\n }\n syncFormToModel($forms) {\n return this.syncForm($forms);\n }\n syncModelToForm($forms) {\n if (!$forms || !$forms.hasClass(this.form_id)) {\n $forms = $(`.${this.form_id}`);\n }\n let self = this;\n $forms.each(function () {\n if (!this.hasAttribute('data-model_pk')) {\n return;\n }\n let pk = $(this).data('model_pk');\n let instance = self.byPk(pk);\n for (let form_item of this.elements) {\n let name = form_item.name;\n if (name && name !== '') {\n if (form_item.type === 'checkbox') {\n form_item.checked = instance[name];\n } else if (form_item.type === 'file' && instance[name] instanceof File) {\n let container = new DataTransfer();\n container.items.add(instance[name]);\n form_item.files = container;\n } else {\n $(form_item).val(instance[name]);\n }\n }\n }\n });\n }\n syncForm($forms) {\n if (!$forms || !$forms.hasClass(this.form_id)) {\n $forms = $(`.${this.form_id}`);\n }\n const self = this;\n let instances = [];\n $forms.each(function () {\n let $form = $(this);\n let pk = $form.data('model_pk');\n let instance = self.byPk(pk);\n for (let form_item of this.elements) {\n let name = form_item.name;\n if (name && name !== '') {\n if (form_item.type === 'hidden') {\n instance[name] = parse_hidden_inputs($(form_item).val());\n } else if (form_item.type === 'checkbox') {\n instance[name] = form_item.checked;\n } else if (form_item.type === 'file') {\n instance[name] = form_item.files[0];\n } else {\n instance[name] = $(form_item).val();\n }\n }\n }\n instances.push(instance);\n return instance;\n });\n if (this.values_list.length <= 1 && instances.length > 0) {\n this.values = instances.at(-1);\n }\n return instances;\n }\n createForm(cb_resolve = null, cb_reject = null) {\n let $div_form = $('<div>');\n this.isConnected().then(() => {\n this._getForm(null, 'create_form', null, $div_form, cb_resolve, cb_reject);\n });\n return $div_form;\n }\n editForm(pk = -1, cb_resolve = null, cb_reject = null) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n let $div_form = $('<div>');\n load_promise.then(() => {\n if (pk <= -1) {\n pk = this.values_list.at(pk).pk;\n }\n this._getForm(pk, 'edit_form', null, $div_form, cb_resolve, cb_reject);\n });\n return $div_form;\n }\n namedForm(pk = -1, formName, cb_resolve = null, cb_reject = null) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n let $div_form = $('<div class=\"container-fluid\">');\n load_promise.then(() => {\n if (pk <= -1) {\n pk = this.values_list.at(pk).pk;\n }\n this._getForm(pk, 'named_form', formName, $div_form, cb_resolve, cb_reject);\n });\n return $div_form;\n }\n _getForm(pk, event_type, formName, $div_form, cb_resolve, cb_reject) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: event_type,\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk: pk,\n form_name: formName\n }\n }));\n const className = pk === null || pk === -1 ? 'create' : 'edit';\n this.open_request[id] = [data => {\n $div_form.append(data.html);\n let $form = $div_form.closest('form').addClass(`sdc-model-${className}-form sdc-model-form ${this.form_id}`).data('model', this).data('model_pk', pk).data('form_name', formName);\n if ($form.length > 0 && !$form[0].hasAttribute('sdc_submit')) {\n $form.attr('sdc_submit', 'submitModelFormDistributor');\n }\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_form);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n }\n new() {\n return new Promise((resolve, reject) => {\n const $form = $('<form>').append(this.createForm(() => {\n this.syncFormToModel($form);\n resolve();\n }, reject));\n });\n }\n save(pk = -1, fromName = 'edit_form') {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n return this.isConnected().then(() => {\n let elem_list;\n if (pk > -1) {\n elem_list = [this.byPk(pk)];\n } else {\n elem_list = this.values_list;\n }\n let p_list = [];\n elem_list.forEach(elem => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n p_list.push(new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'save',\n event_id: id,\n args: {\n form_name: fromName,\n model_name: this.model_name,\n model_query: this.model_query,\n data: elem,\n files: files\n }\n }));\n this.open_request[id] = [res => {\n let data = typeof res.data.instance === 'string' ? JSON.parse(res.data.instance) : res.data.instance;\n res.data.instance = this._parseServerRes(data);\n resolve(res);\n }, reject];\n });\n }));\n });\n return Promise.all(p_list);\n });\n }\n create(values = this.values) {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this._readFiles(values).then(files => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'create',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n data: values,\n files: files\n }\n }));\n this.open_request[id] = [res => {\n let data = typeof res.data.instance === 'string' ? JSON.parse(res.data.instance) : res.data.instance;\n if (this.values?.pk === -1) {\n this.values_list = [];\n this.values = null;\n }\n res.data.instance = this._parseServerRes(data)[0];\n resolve(res);\n }, reject];\n });\n });\n });\n }\n delete(pk = -1) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n if (pk === -1) pk = this.values?.pk;\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'delete',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk: pk\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n });\n }\n isConnected() {\n return new Promise((resolve, reject) => {\n if (this._is_connected) {\n resolve();\n } else if (!this._is_conneting_process || !this.open_request['_connecting_process']) {\n this._is_conneting_process = true;\n this.open_request['_connecting_process'] = [() => {}, () => {}];\n this._connectToServer().then(() => {\n resolve(this._checkConnection());\n });\n } else {\n const [resolve_origin, reject_origin] = this.open_request['_connecting_process'];\n this.open_request['_connecting_process'] = [() => {\n resolve_origin();\n resolve();\n }, () => {\n reject_origin();\n reject();\n }];\n }\n });\n }\n close() {\n if (this.socket) {\n this._auto_reconnect = false;\n this.socket.onclose = () => {};\n this.socket.close();\n delete this['socket'];\n }\n }\n clean() {\n this.values_list = [];\n this.values = {};\n return this;\n }\n _readFiles(elem) {\n let to_solve = [];\n 100;\n let files = {};\n for (const [key, value] of Object.entries(elem)) {\n if (value instanceof File) {\n to_solve.push(new Promise((resolve, reject) => {\n ((key, value) => {\n let reader = new FileReader();\n reader.onload = e => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.open_request[id] = [resolve, reject];\n let result = e.target.result;\n let number_of_chunks = parseInt(Math.ceil(result.length / MAX_FILE_UPLOAD));\n files[key] = {\n id: id,\n file_name: value.name,\n field_name: key,\n content_length: value.size\n };\n for (let i = 0; i < number_of_chunks; ++i) {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'upload',\n event_id: id,\n args: {\n chunk: result.slice(MAX_FILE_UPLOAD * i, MAX_FILE_UPLOAD * (i + 1)),\n idx: i,\n number_of_chunks: number_of_chunks,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n content_type: value.type,\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n }\n };\n reader.onerror = () => {\n reject();\n };\n reader.readAsBinaryString(value);\n })(key, value);\n }));\n }\n }\n return Promise.all(to_solve).then(() => {\n return files;\n });\n }\n _onMessage(e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (this.open_request.hasOwnProperty(data.event_id)) {\n this.open_request[data.event_id][1](data);\n this._closeOpenRequest(data.event_id);\n }\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushErrorMsg', data.header || '', data.msg || '');\n }\n if (data.type === 'connect') {\n this.open_request['_connecting_process'][1](data);\n this._closeOpenRequest('_connecting_process');\n this._auto_reconnect = false;\n this.socket.close();\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushMsg', data.header || '', data.msg || '');\n }\n if (data.type === 'connect') {\n this._is_connected = true;\n this._is_conneting_process = false;\n this.open_request['_connecting_process'][0](data);\n this._closeOpenRequest('_connecting_process');\n } else if (['load', 'named_view', 'detail_view'].includes(data.type)) {\n const json_res = JSON.parse(data.args.data);\n this.values_list = [];\n data.args.data = this._parseServerRes(json_res);\n } else if (data.type === 'on_update' || data.type === 'on_create') {\n const json_res = JSON.parse(data.args.data);\n let obj = this._parseServerRes(json_res);\n let cb;\n if (data.type === 'on_create') {\n cb = this.on_create;\n } else {\n cb = this.on_update;\n }\n cb(obj);\n data.args.data = obj;\n }\n let instance = data.data?.instance;\n if (instance) {\n data.data.instance = JSON.parse(data.data.instance);\n }\n if (this.open_request.hasOwnProperty(data.event_id)) {\n this.open_request[data.event_id][0](data);\n this._closeOpenRequest(data.event_id);\n }\n }\n }\n noOpenRequests() {\n return new Promise(resolve => {\n if (Object.keys(this.open_request).length === 0) {\n return resolve();\n }\n this._onNoOpenRequests.push(resolve);\n });\n }\n _closeOpenRequest(event_id) {\n delete this.open_request[event_id];\n if (Object.keys(this.open_request).length === 0) {\n this._onNoOpenRequests.forEach(x => x());\n this._onNoOpenRequests = [];\n }\n }\n _connectToServer() {\n return new Promise(resolve => {\n const model_identifier = `${this.model_name}` + (this.model_id > 0 ? `/${this.model_id}` : '');\n if (window.location.protocol === \"https:\") {\n this.socket = new WebSocket(`wss://${window.location.host}/sdc_ws/model/${model_identifier}`);\n } else {\n this.socket = new WebSocket(`ws://${window.location.host}/sdc_ws/model/${model_identifier}`);\n }\n this.socket.onmessage = this._onMessage.bind(this);\n this.socket.onclose = e => {\n console.error(`SDC Model (${this.model_name}, ${this.model_id}) Socket closed unexpectedly`);\n this._is_connected = false;\n for (const [_key, value] of Object.entries(this.open_request)) {\n value[1](e);\n }\n this.open_request = {};\n setTimeout(() => {\n if (this._auto_reconnect) {\n this._connectToServer().then(() => {});\n }\n }, 1000);\n };\n this.socket.onerror = err => {\n console.error(`Model Socket encountered error: ${err} Closing socket`);\n if (this._is_connected) {\n try {\n this.socket.close();\n } catch (e) {}\n }\n };\n this.socket.onopen = () => {\n resolve();\n };\n });\n }\n _checkConnection() {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'connect',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n }\n _parseServerRes(res) {\n let updated = [];\n for (let json_data of res) {\n const pk = json_data.pk;\n const obj = this.byPk(pk);\n for (const [k, v] of Object.entries(json_data.fields)) {\n if (v && typeof v === 'object' && v['__is_sdc_model__']) {\n obj[k] = new SubModel(v['pk'], v['model']);\n } else {\n obj[k] = v;\n }\n }\n updated.push(obj);\n }\n if (this.values_list.length === 1) {\n this.values = this.values_list.at(-1);\n } else {\n this.values = {};\n }\n return updated;\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUFBRTtNQUNqQyxJQUFJLENBQUNNLE1BQU0sR0FBRyxJQUFJLENBQUNELFdBQVcsQ0FBQytFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDLE1BQU07TUFDTCxJQUFJLENBQUM5RSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCO0lBRUEsT0FBT3lKLE9BQU87RUFFaEI7QUFDRiIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc29ja2V0LmpzP2FkYmMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthcHB9IGZyb20gJy4vc2RjX21haW4uanMnO1xuaW1wb3J0IHt0cmlnZ2VyfSBmcm9tIFwiLi9zZGNfZXZlbnRzLmpzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5cbmNvbnN0IE1BWF9GSUxFX1VQTE9BRCA9IDI1MDAwO1xuXG5cbmNsYXNzIFN1Yk1vZGVsIHtcblxuICBjb25zdHJ1Y3RvcihwaywgbW9kZWwpIHtcbiAgICB0aGlzLnBrID0gcGs7XG4gICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTREMgTW9kZWwgTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxcbiAgICovXG4gIHNldCBtb2RlbChtb2RlbCkge1xuICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG4gIH1cblxuICBnZXQgbW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIHN1YiBtb2RlbC5cbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcmV0dXJucyB7TW9kZWx9XG4gICAqL1xuICBsb2FkKGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoIXRoaXMuX21vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTW9kZWwgaXMgbm90IHNldCEhXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wayBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5uZXdNb2RlbCh0aGlzLl9tb2RlbCwge3BrX19pbjogdGhpcy5wa30pO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5uZXdNb2RlbCh0aGlzLl9tb2RlbCwge3BrOiB0aGlzLnBrfSk7XG4gIH1cbn1cblxuY29uc3QgTW9kZWxQcm94eUhhbmRsZXIgPSB7XG4gIGdldCh0YXJnZXQsIGtleSkge1xuICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0W2tleV0gPz8gdW5kZWZpbmVkO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN1Yk1vZGVsKSB7XG4gICAgICBpZiAoIXZhbHVlLnBrICYmIHZhbHVlLnBrICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBsZXQgbmV3VmFsO1xuICAgICAgaWYgKHZhbHVlLnBrIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgbmV3VmFsID0gdmFsdWUucGsuc2xpY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1ZhbCA9IG5ldyBOdW1iZXIodmFsdWUucGspO1xuICAgICAgfVxuICAgICAgbmV3VmFsLmxvYWQgPSB2YWx1ZS5sb2FkLmJpbmQodmFsdWUpO1xuICAgICAgcmV0dXJuIG5ld1ZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICBzZXQodGFyZ2V0LCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSBpbiB0YXJnZXQpIHtcbiAgICAgIGNvbnN0IG9sZFZhbCA9IHRhcmdldFtrZXldO1xuICAgICAgaWYgKG9sZFZhbCBpbnN0YW5jZW9mIFN1Yk1vZGVsKSB7XG4gICAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgncGsnKSkge1xuICAgICAgICAgIG9sZFZhbC5wayA9IHZhbHVlLnBrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvbGRWYWwucGsgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIG9sZFZhbC5wayA9IHZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHBhcnNlX2hpZGRlbl9pbnB1dHModmFsdWUpIHtcblxuICBsZXQgaXNGbG9hdFJlZyA9IC9eLT9cXGQrXFwuP1xcZCskLztcbiAgbGV0IGlzSW50UmVnID0gL14tP1xcZCskLztcbiAgbGV0IGlzQm9vbFJlZyA9IC9eKHRydWV8ZmFsc2UpJC87XG4gIGxldCBpc1N0cmluZ1JlZyA9IC9eKFsnXVteJ10qWyddKXwoW1wiXVteXCJdKltcIl0pJC87XG5cblxuICBpZiAodmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaChpc0Jvb2xSZWcpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdub25lJykge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzSW50UmVnKSkge1xuICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAodmFsdWUubWF0Y2goaXNGbG9hdFJlZykpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAodmFsdWUubWF0Y2goaXNTdHJpbmdSZWcpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cblxuZXhwb3J0IGNsYXNzIE1vZGVsIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbF9uYW1lIHtzdHJpbmd9XG4gICAqIEBwYXJhbSBtb2RlbF9xdWVyeSB7anNvbn1cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vZGVsX25hbWUsIG1vZGVsX3F1ZXJ5ID0ge30pIHtcbiAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzID0gW107XG4gICAgdGhpcy52YWx1ZXNfbGlzdCA9IFtdO1xuICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgdGhpcy5tb2RlbF9uYW1lID0gbW9kZWxfbmFtZTtcbiAgICB0aGlzLm1vZGVsX3F1ZXJ5ID0gbW9kZWxfcXVlcnk7XG4gICAgdGhpcy5faXNfY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MgPSBmYWxzZTtcbiAgICB0aGlzLl9hdXRvX3JlY29ubmVjdCA9IHRydWU7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIHRoaXMub3Blbl9yZXF1ZXN0ID0ge307XG4gICAgdGhpcy5vbl91cGRhdGUgPSAoKSA9PiB7XG4gICAgfTtcbiAgICB0aGlzLm9uX2NyZWF0ZSA9ICgpID0+IHtcbiAgICB9O1xuXG4gICAgdGhpcy5mb3JtX2lkID0gdXVpZHY0KCk7XG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICBsZXQgaWR4ID0gLTE7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgKytpZHg7XG4gICAgICAgIGlmIChpZHggPCB0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7dmFsdWU6IHRoaXMudmFsdWVzX2xpc3RbaWR4XSwgZG9uZTogZmFsc2V9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoO1xuICB9XG5cbiAgYnlQayhwaykge1xuICAgIGlmIChwayAhPT0gbnVsbCkge1xuICAgICAgcGsgPSBwYXJzZUludChwayk7XG4gICAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICAgIHBrID0gLTE7XG4gICAgICB9XG4gICAgICBsZXQgZWxlbSA9IHRoaXMudmFsdWVzX2xpc3QuZmluZChlbG0gPT4gZWxtLnBrID09PSBwayk7XG4gICAgICBpZiAoIWVsZW0pIHtcbiAgICAgICAgZWxlbSA9IG5ldyBQcm94eSh7cGs6IHBrfSwgTW9kZWxQcm94eUhhbmRsZXIpO1xuICAgICAgICB0aGlzLnZhbHVlc19saXN0LnB1c2goZWxlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG4gICAgcmV0dXJuIHtwazogcGt9O1xuXG4gIH1cblxuICBmaWx0ZXIobW9kZWxfcXVlcnkpIHtcbiAgICB0aGlzLm1vZGVsX3F1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tb2RlbF9xdWVyeSwgbW9kZWxfcXVlcnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgIGV2ZW50X3R5cGU6ICdsb2FkJyxcbiAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnlcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcblxuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbGlzdFZpZXcoZmlsdGVyID0ge30sIGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVDb250ZXh0ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy52aWV3KHtmaWx0ZXIsIGNiUmVzb2x2ZSwgY2JSZWplY3QsIHRlbXBsYXRlQ29udGV4dCwgZXZlbnRfdHlwZTogJ2xpc3Rfdmlldyd9KVxuICB9XG5cbiAgdmlldyh7XG4gICAgICAgICB2aWV3TmFtZSA9ICdodG1sX2xpc3RfdGVtcGxhdGUnLFxuICAgICAgICAgZmlsdGVyID0ge30sXG4gICAgICAgICBjYlJlc29sdmUgPSBudWxsLFxuICAgICAgICAgY2JSZWplY3QgPSBudWxsLFxuICAgICAgICAgdGVtcGxhdGVDb250ZXh0ID0ge30sXG4gICAgICAgICBldmVudF90eXBlID0gJ25hbWVkX3ZpZXcnXG4gICAgICAgfSkge1xuICAgIGxldCAkZGl2X2xpc3QgPSAkKCc8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgZXZlbnRfdHlwZSxcbiAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgdmlld19uYW1lOiB2aWV3TmFtZSxcbiAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnksXG4gICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgIHRlbXBsYXRlX2NvbnRleHQ6IHRlbXBsYXRlQ29udGV4dFxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsoZGF0YSkgPT4ge1xuICAgICAgICAkZGl2X2xpc3QuYXBwZW5kKGRhdGEuaHRtbCk7XG4gICAgICAgIGFwcC5yZWZyZXNoKCRkaXZfbGlzdCk7XG4gICAgICAgIGNiUmVzb2x2ZSAmJiBjYlJlc29sdmUoZGF0YSk7XG4gICAgICB9LCAocmVzKSA9PiB7XG4gICAgICAgIGNiUmVqZWN0ICYmIGNiUmVqZWN0KHJlcyk7XG4gICAgICB9XTtcblxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZfbGlzdDtcbiAgfVxuXG4gIGRldGFpbFZpZXcocGsgPSBudWxsLCBjYl9yZXNvbHZlID0gbnVsbCwgY2JfcmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVfY29udGV4dCA9IHt9KSB7XG4gICAgcGsgPSBwayA/PyAtMTtcbiAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICBwayA9IC0xO1xuICAgIH1cbiAgICBsZXQgJGRpdl9saXN0ID0gJCgnPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuXG4gICAgbGV0IGxvYWRfcHJvbWlzZTtcbiAgICBpZiAodGhpcy52YWx1ZXNfbGlzdC5sZW5ndGggIT09IDApIHtcbiAgICAgIGxvYWRfcHJvbWlzZSA9IHRoaXMuaXNDb25uZWN0ZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgbG9hZF9wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHBrID09PSAtMSkge1xuICAgICAgICBwayA9IHRoaXMudmFsdWVzX2xpc3RbMF0ucGtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgIGV2ZW50X3R5cGU6ICdkZXRhaWxfdmlldycsXG4gICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgYXJnczoge1xuICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICBwayxcbiAgICAgICAgICB0ZW1wbGF0ZV9jb250ZXh0XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhkYXRhKSA9PiB7XG4gICAgICAgICRkaXZfbGlzdC5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgICAgYXBwLnJlZnJlc2goJGRpdl9saXN0KTtcbiAgICAgICAgY2JfcmVzb2x2ZSAmJiBjYl9yZXNvbHZlKGRhdGEpO1xuICAgICAgfSwgKHJlcykgPT4ge1xuICAgICAgICBjYl9yZWplY3QgJiYgY2JfcmVqZWN0KHJlcyk7XG4gICAgICB9XTtcblxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZfbGlzdDtcbiAgfVxuXG4gIHN5bmNGb3JtVG9Nb2RlbCgkZm9ybXMpIHtcbiAgICByZXR1cm4gdGhpcy5zeW5jRm9ybSgkZm9ybXMpO1xuICB9XG5cbiAgc3luY01vZGVsVG9Gb3JtKCRmb3Jtcykge1xuICAgIGlmICghJGZvcm1zIHx8ICEkZm9ybXMuaGFzQ2xhc3ModGhpcy5mb3JtX2lkKSkge1xuICAgICAgJGZvcm1zID0gJChgLiR7dGhpcy5mb3JtX2lkfWApO1xuICAgIH1cblxuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAkZm9ybXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLW1vZGVsX3BrJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IHBrID0gJCh0aGlzKS5kYXRhKCdtb2RlbF9waycpO1xuICAgICAgbGV0IGluc3RhbmNlID0gc2VsZi5ieVBrKHBrKTtcbiAgICAgIGZvciAobGV0IGZvcm1faXRlbSBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgIGxldCBuYW1lID0gZm9ybV9pdGVtLm5hbWU7XG4gICAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgaWYgKGZvcm1faXRlbS50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICBmb3JtX2l0ZW0uY2hlY2tlZCA9IGluc3RhbmNlW25hbWVdO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdmaWxlJyAmJiBpbnN0YW5jZVtuYW1lXSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBuZXcgRGF0YVRyYW5zZmVyKCk7XG4gICAgICAgICAgICBjb250YWluZXIuaXRlbXMuYWRkKGluc3RhbmNlW25hbWVdKTtcbiAgICAgICAgICAgIGZvcm1faXRlbS5maWxlcyA9IGNvbnRhaW5lcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJChmb3JtX2l0ZW0pLnZhbChpbnN0YW5jZVtuYW1lXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIHN5bmNGb3JtKCRmb3Jtcykge1xuICAgIGlmICghJGZvcm1zIHx8ICEkZm9ybXMuaGFzQ2xhc3ModGhpcy5mb3JtX2lkKSkge1xuICAgICAgJGZvcm1zID0gJChgLiR7dGhpcy5mb3JtX2lkfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBpbnN0YW5jZXMgPSBbXTtcblxuICAgICRmb3Jtcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCAkZm9ybSA9ICQodGhpcyk7XG4gICAgICBsZXQgcGsgPSAkZm9ybS5kYXRhKCdtb2RlbF9waycpO1xuICAgICAgbGV0IGluc3RhbmNlID0gc2VsZi5ieVBrKHBrKTtcbiAgICAgIGZvciAobGV0IGZvcm1faXRlbSBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgIGxldCBuYW1lID0gZm9ybV9pdGVtLm5hbWU7XG4gICAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgaWYgKGZvcm1faXRlbS50eXBlID09PSAnaGlkZGVuJykge1xuICAgICAgICAgICAgaW5zdGFuY2VbbmFtZV0gPSBwYXJzZV9oaWRkZW5faW5wdXRzKCQoZm9ybV9pdGVtKS52YWwoKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChmb3JtX2l0ZW0udHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgaW5zdGFuY2VbbmFtZV0gPSBmb3JtX2l0ZW0uY2hlY2tlZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1faXRlbS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgICAgIGluc3RhbmNlW25hbWVdID0gZm9ybV9pdGVtLmZpbGVzWzBdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9ICQoZm9ybV9pdGVtKS52YWwoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2VzLnB1c2goaW5zdGFuY2UpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoIDw9IDEgJiYgaW5zdGFuY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudmFsdWVzID0gaW5zdGFuY2VzLmF0KC0xKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2VzO1xuXG4gIH1cblxuICBjcmVhdGVGb3JtKGNiX3Jlc29sdmUgPSBudWxsLCBjYl9yZWplY3QgPSBudWxsKSB7XG4gICAgbGV0ICRkaXZfZm9ybSA9ICQoJzxkaXY+Jyk7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5fZ2V0Rm9ybShudWxsLCAnY3JlYXRlX2Zvcm0nLCBudWxsLCAkZGl2X2Zvcm0sIGNiX3Jlc29sdmUsIGNiX3JlamVjdCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdl9mb3JtO1xuICB9XG5cbiAgZWRpdEZvcm0ocGsgPSAtMSwgY2JfcmVzb2x2ZSA9IG51bGwsIGNiX3JlamVjdCA9IG51bGwpIHtcbiAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICBwayA9IC0xO1xuICAgIH1cbiAgICBsZXQgbG9hZF9wcm9taXNlO1xuICAgIGlmICh0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5pc0Nvbm5lY3RlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkX3Byb21pc2UgPSB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBsZXQgJGRpdl9mb3JtID0gJCgnPGRpdj4nKTtcblxuICAgIGxvYWRfcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGlmIChwayA8PSAtMSkge1xuICAgICAgICBwayA9IHRoaXMudmFsdWVzX2xpc3QuYXQocGspLnBrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9nZXRGb3JtKHBrLCAnZWRpdF9mb3JtJywgbnVsbCwgJGRpdl9mb3JtLCBjYl9yZXNvbHZlLCBjYl9yZWplY3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZfZm9ybTtcbiAgfVxuXG4gIG5hbWVkRm9ybShwayA9IC0xLCBmb3JtTmFtZSwgY2JfcmVzb2x2ZSA9IG51bGwsIGNiX3JlamVjdCA9IG51bGwpIHtcbiAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICBwayA9IC0xO1xuICAgIH1cbiAgICBsZXQgbG9hZF9wcm9taXNlO1xuICAgIGlmICh0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5pc0Nvbm5lY3RlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkX3Byb21pc2UgPSB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBsZXQgJGRpdl9mb3JtID0gJCgnPGRpdiAgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgIGxvYWRfcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGlmIChwayA8PSAtMSkge1xuICAgICAgICBwayA9IHRoaXMudmFsdWVzX2xpc3QuYXQocGspLnBrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9nZXRGb3JtKHBrLCAnbmFtZWRfZm9ybScsIGZvcm1OYW1lLCAkZGl2X2Zvcm0sIGNiX3Jlc29sdmUsIGNiX3JlamVjdCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdl9mb3JtO1xuICB9XG5cblxuICBfZ2V0Rm9ybShwaywgZXZlbnRfdHlwZSwgZm9ybU5hbWUsICRkaXZfZm9ybSwgY2JfcmVzb2x2ZSwgY2JfcmVqZWN0KSB7XG4gICAgcGsgPSBwYXJzZUludChwayk7XG4gICAgaWYgKGlzTmFOKHBrKSkge1xuICAgICAgcGsgPSAtMTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgZXZlbnRfdHlwZTogZXZlbnRfdHlwZSxcbiAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgcGs6IHBrLFxuICAgICAgICBmb3JtX25hbWU6IGZvcm1OYW1lXG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gcGsgPT09IG51bGwgfHwgcGsgPT09IC0xID8gJ2NyZWF0ZScgOiAnZWRpdCc7XG5cbiAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbKGRhdGEpID0+IHtcbiAgICAgICRkaXZfZm9ybS5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgIGxldCAkZm9ybSA9ICRkaXZfZm9ybS5jbG9zZXN0KCdmb3JtJylcbiAgICAgICAgLmFkZENsYXNzKGBzZGMtbW9kZWwtJHtjbGFzc05hbWV9LWZvcm0gc2RjLW1vZGVsLWZvcm0gJHt0aGlzLmZvcm1faWR9YClcbiAgICAgICAgLmRhdGEoJ21vZGVsJywgdGhpcylcbiAgICAgICAgLmRhdGEoJ21vZGVsX3BrJywgcGspXG4gICAgICAgIC5kYXRhKCdmb3JtX25hbWUnLCBmb3JtTmFtZSk7XG4gICAgICBpZiAoJGZvcm0ubGVuZ3RoID4gMCAmJiAhJGZvcm1bMF0uaGFzQXR0cmlidXRlKCdzZGNfc3VibWl0JykpIHtcbiAgICAgICAgJGZvcm0uYXR0cignc2RjX3N1Ym1pdCcsICdzdWJtaXRNb2RlbEZvcm1EaXN0cmlidXRvcicpXG4gICAgICB9XG5cbiAgICAgIGFwcC5yZWZyZXNoKCRkaXZfZm9ybSk7XG4gICAgICBjYl9yZXNvbHZlICYmIGNiX3Jlc29sdmUoZGF0YSk7XG4gICAgfSwgKHJlcykgPT4ge1xuICAgICAgY2JfcmVqZWN0ICYmIGNiX3JlamVjdChyZXMpO1xuICAgIH1dO1xuICB9XG5cbiAgbmV3KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCAkZm9ybSA9ICQoJzxmb3JtPicpLmFwcGVuZCh0aGlzLmNyZWF0ZUZvcm0oKCkgPT4ge1xuICAgICAgICB0aGlzLnN5bmNGb3JtVG9Nb2RlbCgkZm9ybSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0sIHJlamVjdCkpO1xuICAgIH0pXG4gIH1cblxuICBzYXZlKHBrID0gLTEsIGZyb21OYW1lID0gJ2VkaXRfZm9ybScpIHtcbiAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICBwayA9IC0xO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgbGV0IGVsZW1fbGlzdDtcbiAgICAgIGlmIChwayA+IC0xKSB7XG4gICAgICAgIGVsZW1fbGlzdCA9IFt0aGlzLmJ5UGsocGspXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1fbGlzdCA9IHRoaXMudmFsdWVzX2xpc3Q7XG4gICAgICB9XG4gICAgICBsZXQgcF9saXN0ID0gW11cbiAgICAgIGVsZW1fbGlzdC5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICAgIHBfbGlzdC5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZWFkRmlsZXMoZWxlbSkudGhlbigoZmlsZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ3NhdmUnLFxuICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICBmb3JtX25hbWU6IGZyb21OYW1lLFxuICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICBkYXRhOiBlbGVtLFxuICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlc1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsocmVzKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBkYXRhID0gdHlwZW9mIHJlcy5kYXRhLmluc3RhbmNlID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UocmVzLmRhdGEuaW5zdGFuY2UpIDogcmVzLmRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICAgIHJlcy5kYXRhLmluc3RhbmNlID0gdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoZGF0YSk7XG4gICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgIH0sIHJlamVjdF07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocF9saXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZSh2YWx1ZXMgPSB0aGlzLnZhbHVlcykge1xuICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuX3JlYWRGaWxlcyh2YWx1ZXMpLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgICBkYXRhOiB2YWx1ZXMsXG4gICAgICAgICAgICAgIGZpbGVzOiBmaWxlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsocmVzKSA9PiB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHR5cGVvZiByZXMuZGF0YS5pbnN0YW5jZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHJlcy5kYXRhLmluc3RhbmNlKSA6IHJlcy5kYXRhLmluc3RhbmNlO1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVzPy5wayA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZXNfbGlzdCA9IFtdO1xuICAgICAgICAgICAgICB0aGlzLnZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuZGF0YS5pbnN0YW5jZSA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGRhdGEpWzBdO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgIH0sIHJlamVjdF07XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZShwayA9IC0xKSB7XG4gICAgcGsgPSBwYXJzZUludChwayk7XG4gICAgaWYgKGlzTmFOKHBrKSkge1xuICAgICAgcGsgPSAtMTtcbiAgICB9XG4gICAgaWYgKHBrID09PSAtMSkgcGsgPSB0aGlzLnZhbHVlcz8ucGs7XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgZXZlbnRfdHlwZTogJ2RlbGV0ZScsXG4gICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgcGs6IHBrXG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG5cbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNfY29ubmVjdGVkKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzX2Nvbm5ldGluZ19wcm9jZXNzIHx8ICF0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddKSB7XG4gICAgICAgIHRoaXMuX2lzX2Nvbm5ldGluZ19wcm9jZXNzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXSA9IFsoKSA9PiB7XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgfV1cbiAgICAgICAgdGhpcy5fY29ubmVjdFRvU2VydmVyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9jaGVja0Nvbm5lY3Rpb24oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgW3Jlc29sdmVfb3JpZ2luLCByZWplY3Rfb3JpZ2luXSA9IHRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ107XG4gICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ10gPSBbXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZV9vcmlnaW4oKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdF9vcmlnaW4oKTtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICB0aGlzLl9hdXRvX3JlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9ICgpID0+IHtcbiAgICAgIH07XG4gICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgZGVsZXRlIHRoaXNbJ3NvY2tldCddO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIHRoaXMudmFsdWVzX2xpc3QgPSBbXTtcbiAgICB0aGlzLnZhbHVlcyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgX3JlYWRGaWxlcyhlbGVtKSB7XG4gICAgbGV0IHRvX3NvbHZlID0gW107XG4gICAgMTAwXG4gICAgbGV0IGZpbGVzID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbGVtKSkge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICB0b19zb2x2ZS5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAoKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcblxuICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgICBsZXQgbnVtYmVyX29mX2NodW5rcyA9IHBhcnNlSW50KE1hdGguY2VpbChyZXN1bHQubGVuZ3RoIC8gTUFYX0ZJTEVfVVBMT0FEKSk7XG4gICAgICAgICAgICAgIGZpbGVzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGZpbGVfbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICBmaWVsZF9uYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgY29udGVudF9sZW5ndGg6IHZhbHVlLnNpemUsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyX29mX2NodW5rczsgKytpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICd1cGxvYWQnLFxuICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICBjaHVuazogcmVzdWx0LnNsaWNlKE1BWF9GSUxFX1VQTE9BRCAqIGksIE1BWF9GSUxFX1VQTE9BRCAqIChpICsgMSkpLFxuICAgICAgICAgICAgICAgICAgICBpZHg6IGksXG4gICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9jaHVua3M6IG51bWJlcl9vZl9jaHVua3MsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aDogdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICB9KShrZXksIHZhbHVlKTtcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHRvX3NvbHZlKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBmaWxlc1xuICAgIH0pO1xuICB9XG5cbiAgX29uTWVzc2FnZShlKSB7XG4gICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgaWYgKGRhdGEuaXNfZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLm9wZW5fcmVxdWVzdC5oYXNPd25Qcm9wZXJ0eShkYXRhLmV2ZW50X2lkKSkge1xuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtkYXRhLmV2ZW50X2lkXVsxXShkYXRhKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdChkYXRhLmV2ZW50X2lkKTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICB0cmlnZ2VyKCdwdXNoRXJyb3JNc2cnLCBkYXRhLmhlYWRlciB8fCAnJywgZGF0YS5tc2cgfHwgJycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS50eXBlID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXVsxXShkYXRhKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdCgnX2Nvbm5lY3RpbmdfcHJvY2VzcycpO1xuICAgICAgICB0aGlzLl9hdXRvX3JlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG5cbiAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICB0cmlnZ2VyKCdwdXNoTXNnJywgZGF0YS5oZWFkZXIgfHwgJycsIGRhdGEubXNnIHx8ICcnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2Nvbm5lY3QnKSB7XG4gICAgICAgIHRoaXMuX2lzX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2lzX2Nvbm5ldGluZ19wcm9jZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ11bMF0oZGF0YSk7XG4gICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoJ19jb25uZWN0aW5nX3Byb2Nlc3MnKTtcbiAgICAgIH0gZWxzZSBpZiAoWydsb2FkJywgJ25hbWVkX3ZpZXcnLCAnZGV0YWlsX3ZpZXcnXS5pbmNsdWRlcyhkYXRhLnR5cGUpKSB7XG4gICAgICAgIGNvbnN0IGpzb25fcmVzID0gSlNPTi5wYXJzZShkYXRhLmFyZ3MuZGF0YSk7XG4gICAgICAgIHRoaXMudmFsdWVzX2xpc3QgPSBbXTtcbiAgICAgICAgZGF0YS5hcmdzLmRhdGEgPSB0aGlzLl9wYXJzZVNlcnZlclJlcyhqc29uX3Jlcyk7XG5cbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnb25fdXBkYXRlJyB8fCBkYXRhLnR5cGUgPT09ICdvbl9jcmVhdGUnKSB7XG4gICAgICAgIGNvbnN0IGpzb25fcmVzID0gSlNPTi5wYXJzZShkYXRhLmFyZ3MuZGF0YSk7XG5cbiAgICAgICAgbGV0IG9iaiA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGpzb25fcmVzKTtcbiAgICAgICAgbGV0IGNiO1xuXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdvbl9jcmVhdGUnKSB7XG4gICAgICAgICAgY2IgPSB0aGlzLm9uX2NyZWF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYiA9IHRoaXMub25fdXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2Iob2JqKTtcbiAgICAgICAgZGF0YS5hcmdzLmRhdGEgPSBvYmo7XG5cbiAgICAgIH1cblxuICAgICAgbGV0IGluc3RhbmNlID0gZGF0YS5kYXRhPy5pbnN0YW5jZVxuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIGRhdGEuZGF0YS5pbnN0YW5jZSA9IEpTT04ucGFyc2UoZGF0YS5kYXRhLmluc3RhbmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3Blbl9yZXF1ZXN0Lmhhc093blByb3BlcnR5KGRhdGEuZXZlbnRfaWQpKSB7XG4gICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2RhdGEuZXZlbnRfaWRdWzBdKGRhdGEpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KGRhdGEuZXZlbnRfaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5vT3BlblJlcXVlc3RzKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm9wZW5fcmVxdWVzdCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMucHVzaChyZXNvbHZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jbG9zZU9wZW5SZXF1ZXN0KGV2ZW50X2lkKSB7XG4gICAgZGVsZXRlIHRoaXMub3Blbl9yZXF1ZXN0W2V2ZW50X2lkXTtcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5vcGVuX3JlcXVlc3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cy5mb3JFYWNoKHggPT4geCgpKTtcbiAgICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMgPSBbXTtcbiAgICB9XG5cbiAgfVxuXG4gIF9jb25uZWN0VG9TZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cbiAgICAgIGNvbnN0IG1vZGVsX2lkZW50aWZpZXIgPSBgJHt0aGlzLm1vZGVsX25hbWV9YCArICh0aGlzLm1vZGVsX2lkID4gMCA/IGAvJHt0aGlzLm1vZGVsX2lkfWAgOiAnJyk7XG4gICAgICBpZiAod2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSBcImh0dHBzOlwiKSB7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChgd3NzOi8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0vc2RjX3dzL21vZGVsLyR7bW9kZWxfaWRlbnRpZmllcn1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChgd3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3MvbW9kZWwvJHttb2RlbF9pZGVudGlmaWVyfWApO1xuICAgICAgfVxuXG5cbiAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IHRoaXMuX29uTWVzc2FnZS5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gKGUpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgU0RDIE1vZGVsICgke3RoaXMubW9kZWxfbmFtZX0sICR7dGhpcy5tb2RlbF9pZH0pIFNvY2tldCBjbG9zZWQgdW5leHBlY3RlZGx5YCk7XG4gICAgICAgIHRoaXMuX2lzX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IFtfa2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5vcGVuX3JlcXVlc3QpKSB7XG4gICAgICAgICAgdmFsdWVbMV0oZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3QgPSB7fTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fYXV0b19yZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RUb1NlcnZlcigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYE1vZGVsIFNvY2tldCBlbmNvdW50ZXJlZCBlcnJvcjogJHtlcnJ9IENsb3Npbmcgc29ja2V0YCk7XG4gICAgICAgIGlmICh0aGlzLl9pc19jb25uZWN0ZWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cblxuICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIF9jaGVja0Nvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICBldmVudF90eXBlOiAnY29ubmVjdCcsXG4gICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgYXJnczoge1xuICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeVxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgIH0pO1xuICB9XG5cbiAgX3BhcnNlU2VydmVyUmVzKHJlcykge1xuICAgIGxldCB1cGRhdGVkID0gW107XG4gICAgZm9yIChsZXQganNvbl9kYXRhIG9mIHJlcykge1xuICAgICAgY29uc3QgcGsgPSBqc29uX2RhdGEucGs7XG4gICAgICBjb25zdCBvYmogPSB0aGlzLmJ5UGsocGspO1xuICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoanNvbl9kYXRhLmZpZWxkcykpIHtcbiAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHZbJ19faXNfc2RjX21vZGVsX18nXSkge1xuICAgICAgICAgIG9ialtrXSA9IG5ldyBTdWJNb2RlbCh2WydwayddLCB2Wydtb2RlbCddKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9ialtrXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlZC5wdXNoKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLnZhbHVlcyA9IHRoaXMudmFsdWVzX2xpc3QuYXQoLTEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlcyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkO1xuXG4gIH1cbn0iXSwibmFtZXMiOlsiYXBwIiwidHJpZ2dlciIsInV1aWR2NCIsIk1BWF9GSUxFX1VQTE9BRCIsIlN1Yk1vZGVsIiwiY29uc3RydWN0b3IiLCJwayIsIm1vZGVsIiwiX21vZGVsIiwibG9hZCIsImNvbnRyb2xsZXIiLCJUeXBlRXJyb3IiLCJBcnJheSIsIm5ld01vZGVsIiwicGtfX2luIiwiTW9kZWxQcm94eUhhbmRsZXIiLCJnZXQiLCJ0YXJnZXQiLCJrZXkiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsIm5ld1ZhbCIsInNsaWNlIiwiTnVtYmVyIiwiYmluZCIsInNldCIsIm9sZFZhbCIsImhhc093blByb3BlcnR5IiwiSlNPTiIsInBhcnNlIiwicGFyc2VfaGlkZGVuX2lucHV0cyIsImlzRmxvYXRSZWciLCJpc0ludFJlZyIsImlzQm9vbFJlZyIsImlzU3RyaW5nUmVnIiwidG9Mb3dlckNhc2UiLCJtYXRjaCIsInBhcnNlSW50IiwicGFyc2VGbG9hdCIsInN1YnN0cmluZyIsImxlbmd0aCIsIk1vZGVsIiwibW9kZWxfbmFtZSIsIm1vZGVsX3F1ZXJ5IiwiX29uTm9PcGVuUmVxdWVzdHMiLCJ2YWx1ZXNfbGlzdCIsInZhbHVlcyIsIl9pc19jb25uZWN0ZWQiLCJfaXNfY29ubmV0aW5nX3Byb2Nlc3MiLCJfYXV0b19yZWNvbm5lY3QiLCJzb2NrZXQiLCJvcGVuX3JlcXVlc3QiLCJvbl91cGRhdGUiLCJvbl9jcmVhdGUiLCJmb3JtX2lkIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJpZHgiLCJuZXh0IiwiZG9uZSIsImJ5UGsiLCJpc05hTiIsImVsZW0iLCJmaW5kIiwiZWxtIiwiUHJveHkiLCJwdXNoIiwiZmlsdGVyIiwiT2JqZWN0IiwiYXNzaWduIiwiaXNDb25uZWN0ZWQiLCJ0aGVuIiwiaWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNlbmQiLCJzdHJpbmdpZnkiLCJldmVudCIsImV2ZW50X3R5cGUiLCJldmVudF9pZCIsImFyZ3MiLCJsaXN0VmlldyIsImNiUmVzb2x2ZSIsImNiUmVqZWN0IiwidGVtcGxhdGVDb250ZXh0IiwidmlldyIsInZpZXdOYW1lIiwiJGRpdl9saXN0IiwiJCIsInZpZXdfbmFtZSIsInRlbXBsYXRlX2NvbnRleHQiLCJkYXRhIiwiYXBwZW5kIiwiaHRtbCIsInJlZnJlc2giLCJyZXMiLCJkZXRhaWxWaWV3IiwiY2JfcmVzb2x2ZSIsImNiX3JlamVjdCIsImxvYWRfcHJvbWlzZSIsInN5bmNGb3JtVG9Nb2RlbCIsIiRmb3JtcyIsInN5bmNGb3JtIiwic3luY01vZGVsVG9Gb3JtIiwiaGFzQ2xhc3MiLCJzZWxmIiwiZWFjaCIsImhhc0F0dHJpYnV0ZSIsImluc3RhbmNlIiwiZm9ybV9pdGVtIiwiZWxlbWVudHMiLCJuYW1lIiwidHlwZSIsImNoZWNrZWQiLCJGaWxlIiwiY29udGFpbmVyIiwiRGF0YVRyYW5zZmVyIiwiaXRlbXMiLCJhZGQiLCJmaWxlcyIsInZhbCIsImluc3RhbmNlcyIsIiRmb3JtIiwiYXQiLCJjcmVhdGVGb3JtIiwiJGRpdl9mb3JtIiwiX2dldEZvcm0iLCJlZGl0Rm9ybSIsIm5hbWVkRm9ybSIsImZvcm1OYW1lIiwiZm9ybV9uYW1lIiwiY2xhc3NOYW1lIiwiY2xvc2VzdCIsImFkZENsYXNzIiwiYXR0ciIsIm5ldyIsInNhdmUiLCJmcm9tTmFtZSIsImVsZW1fbGlzdCIsInBfbGlzdCIsImZvckVhY2giLCJfcmVhZEZpbGVzIiwiX3BhcnNlU2VydmVyUmVzIiwiYWxsIiwiY3JlYXRlIiwiZGVsZXRlIiwiX2Nvbm5lY3RUb1NlcnZlciIsIl9jaGVja0Nvbm5lY3Rpb24iLCJyZXNvbHZlX29yaWdpbiIsInJlamVjdF9vcmlnaW4iLCJjbG9zZSIsIm9uY2xvc2UiLCJjbGVhbiIsInRvX3NvbHZlIiwiZW50cmllcyIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJvbmxvYWQiLCJlIiwicmVzdWx0IiwibnVtYmVyX29mX2NodW5rcyIsIk1hdGgiLCJjZWlsIiwiZmlsZV9uYW1lIiwiZmllbGRfbmFtZSIsImNvbnRlbnRfbGVuZ3RoIiwic2l6ZSIsImkiLCJjaHVuayIsImNvbnRlbnRfdHlwZSIsIm9uZXJyb3IiLCJyZWFkQXNCaW5hcnlTdHJpbmciLCJfb25NZXNzYWdlIiwiaXNfZXJyb3IiLCJfY2xvc2VPcGVuUmVxdWVzdCIsIm1zZyIsImhlYWRlciIsImluY2x1ZGVzIiwianNvbl9yZXMiLCJvYmoiLCJjYiIsIm5vT3BlblJlcXVlc3RzIiwia2V5cyIsIngiLCJtb2RlbF9pZGVudGlmaWVyIiwibW9kZWxfaWQiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsInByb3RvY29sIiwiV2ViU29ja2V0IiwiaG9zdCIsIm9ubWVzc2FnZSIsImNvbnNvbGUiLCJlcnJvciIsIl9rZXkiLCJzZXRUaW1lb3V0IiwiZXJyIiwib25vcGVuIiwidXBkYXRlZCIsImpzb25fZGF0YSIsImsiLCJ2IiwiZmllbGRzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_socket.js\n\n}");
98
98
 
99
99
  /***/ }),
100
100
 
@@ -114,7 +114,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
114
114
  \*******************************************/
115
115
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
116
116
 
117
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ agileAggregation: () => (/* binding */ agileAggregation),\n/* harmony export */ camelCaseToTagName: () => (/* binding */ camelCaseToTagName),\n/* harmony export */ checkIfParamNumberBoolOrString: () => (/* binding */ checkIfParamNumberBoolOrString),\n/* harmony export */ clearErrorsInForm: () => (/* binding */ clearErrorsInForm),\n/* harmony export */ getBody: () => (/* binding */ getBody),\n/* harmony export */ getParamsNameOfFunction: () => (/* binding */ getParamsNameOfFunction),\n/* harmony export */ jqueryInsertAt: () => (/* binding */ jqueryInsertAt),\n/* harmony export */ promiseDummyFactory: () => (/* binding */ promiseDummyFactory),\n/* harmony export */ setErrorsInForm: () => (/* binding */ setErrorsInForm),\n/* harmony export */ tagNameToCamelCase: () => (/* binding */ tagNameToCamelCase),\n/* harmony export */ tagNameToReadableName: () => (/* binding */ tagNameToReadableName),\n/* harmony export */ uploadFileFormData: () => (/* binding */ uploadFileFormData),\n/* harmony export */ uuidv4: () => (/* binding */ uuidv4)\n/* harmony export */ });\n/**\n * Reference to the HTML body.\n * @type {*|jQuery|HTMLElement}\n * @private\n */\nlet _$body;\nconst arg_names_reg = /((?<=^|,\\s*)[^\\s,]+)/g;\nconst commend_reg = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\n\n/**\n * getBody returns the $body jQuery object.\n *\n * @returns {*|jQuery|HTMLElement} - body reference.\n */\nfunction getBody() {\n if (!_$body) {\n _$body = $('body');\n }\n return _$body;\n}\n\n/**\n *\n * @param {function} func\n * @returns {RegExpMatchArray|*[]}\n */\nfunction getParamsNameOfFunction(func) {\n var fnstr = func.toString().replace(commend_reg, '');\n var result = fnstr.slice(fnstr.indexOf('(') + 1, fnstr.indexOf(')')).match(arg_names_reg);\n if (!result) {\n return [];\n }\n return result;\n}\n\n/**\n * promiseDummyFactory generates a simple promise which returns instantly.\n * @return {Promise} window.utils\n */\nfunction promiseDummyFactory() {\n return new Promise(function (resolve) {\n resolve();\n });\n}\nfunction camelCaseToTagName(str) {\n str = str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\n str = str.replace(/[0-9]+/g, number => `-${number}`);\n return str.replace(/^[-]/g, ``);\n}\nfunction tagNameToCamelCase(str) {\n str = str.replace(/-./g, letter => `${letter[1].toUpperCase()}`);\n return str;\n}\nfunction tagNameToReadableName(str) {\n str = str.replace(/-./g, letter => ` ${letter[1].toUpperCase()}`).replace(/^./g, letter => `${letter.toUpperCase()}`);\n return str;\n}\nconst copyProps = (targetClass, sourceClass) => {\n let source = sourceClass;\n let propNamesTarget = Object.getOwnPropertyNames(targetClass.prototype).concat(Object.getOwnPropertySymbols(targetClass.prototype));\n while (source.name !== '') {\n Object.getOwnPropertyNames(source.prototype).concat(Object.getOwnPropertySymbols(source.prototype)).forEach(prop => {\n if (prop.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {\n return;\n }\n if (!propNamesTarget.includes(prop)) {\n propNamesTarget.push(prop);\n Object.defineProperty(targetClass.prototype, prop, Object.getOwnPropertyDescriptor(source.prototype, prop));\n }\n });\n source = Object.getPrototypeOf(source);\n }\n};\n\n/**\n *\n * @param {typeof AbstractSDC} baseClass\n * @param {typeof AbstractSDC} mixins\n * @returns {typeof AbstractSDC}\n */\nfunction agileAggregation(baseClass, ...mixins) {\n let base = {\n [baseClass.name]: class {\n constructor(..._args) {\n let _mixins = {};\n mixins.forEach(mixin => {\n let newMixin;\n Object.assign(this, newMixin = new mixin());\n newMixin._tagName = mixin.prototype._tagName;\n newMixin._isMixin = true;\n _mixins[mixin.name] = newMixin;\n });\n Object.assign(this, new baseClass());\n this._mixins = _mixins;\n }\n static get name() {\n return baseClass.name;\n }\n static className() {\n return this.name;\n }\n get mixins() {\n return this._mixins;\n }\n }\n }[baseClass.name];\n copyProps(base, baseClass);\n mixins.forEach(mixin => {\n copyProps(base, mixin);\n });\n return base;\n}\nfunction csrfSafeMethod(method) {\n // these HTTP methods do not require CSRF protection\n return /^(GET|HEAD|OPTIONS|TRACE)$/.test(method);\n}\nfunction uploadFileFormData(formData, url, method) {\n return $.ajax({\n url: url,\n //Server script to process data\n type: method || 'POST',\n xhr: function () {\n // Custom XMLHttpRequest\n var myXhr = $.ajaxSettings.xhr();\n if (myXhr.upload) {\n // Check if upload property exists\n myXhr.upload.addEventListener('progress', progressHandlingFunction, false); // For handling the progress of the upload\n }\n return myXhr;\n },\n //Form data\n data: formData,\n //Options to tell jQuery not to process data or worry about content-type.\n cache: false,\n contentType: false,\n processData: false,\n beforeSend: function (xhr, settings) {\n if (!csrfSafeMethod(settings.type) && !this.crossDomain) {\n xhr.setRequestHeader(\"X-CSRFToken\", window.CSRF_TOKEN);\n }\n }\n });\n}\nfunction progressHandlingFunction(e) {\n if (e.lengthComputable) {\n var percentVal = Math.round(e.loaded / e.total * 100);\n var $progressContainer = $('.progress-container');\n if (percentVal === 100) {\n $progressContainer.hide();\n } else {\n $progressContainer.show();\n }\n percentVal += '%';\n $progressContainer.find('.progress-bar').css({\n 'width': percentVal\n }).text(percentVal);\n }\n}\nfunction checkIfParamNumberBoolOrString(paramElement, controller = null) {\n if (typeof paramElement !== 'string') {\n return paramElement;\n }\n if (controller && typeof controller[paramElement] !== 'undefined') {\n if (typeof controller[paramElement] === 'function') {\n return controller[paramElement].bind(controller);\n }\n return controller[paramElement];\n }\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n if (paramElement.match(isBoolReg)) {\n return paramElement === 'true';\n } else if (paramElement === 'undefined') {\n return undefined;\n } else if (paramElement.toLowerCase() === 'none') {\n return null;\n } else if (paramElement.match(isIntReg)) {\n return parseInt(paramElement);\n } else if (paramElement.match(isFloatReg)) {\n return parseFloat(paramElement);\n } else if (paramElement.match(isStringReg)) {\n return paramElement.substr(1, paramElement.length - 2);\n }\n return paramElement;\n}\nfunction uuidv4() {\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n}\nfunction clearErrorsInForm($form) {\n $form.find('.has-error').removeClass('has-error').find('.alert-danger').remove();\n $form.find('.non-field-errors').remove();\n}\nfunction setErrorsInForm($form, $resForm) {\n $resForm = $('<div>').append($resForm);\n $form.find('.has-error').removeClass('has-error').find('.alert-danger').safeRemove();\n $form.find('.non-field-errors').safeRemove();\n let $file_container = $resForm.find('input[type=file]').parent();\n $form.find('input[type=file]').parent().each(function (index) {\n $(this).replaceWith($file_container[index]);\n });\n let hasNoError = $resForm.find('.non-field-errors').insertAfter($form.find('.hidden-form-fields')).length === 0;\n $resForm.find('.has-error').each(function () {\n hasNoError = false;\n let $resErrorField = $(this);\n let className = $resErrorField.data('auto-id');\n let $errorField = $form.find('.form-group.' + className);\n $errorField.addClass('has-error');\n $errorField.find('.form-input-container').append($resErrorField.find('.alert-danger'));\n });\n return hasNoError;\n}\nfunction jqueryInsertAt($container, index, $newElement) {\n let lastIndex = $container.children().size();\n if (index < lastIndex) {\n $container.children().eq(index).before($newElement);\n } else {\n $container.append($newElement);\n }\n return this;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxDQUFDO0VBQzFGLENBQUMsQ0FBQztFQUVGLE9BQU9rQyxVQUFVO0FBQ3JCO0FBRU8sU0FBU0ssY0FBY0EsQ0FBQ0MsVUFBVSxFQUFFUixLQUFLLEVBQUVTLFdBQVcsRUFBRTtFQUMzRCxJQUFJQyxTQUFTLEdBQUdGLFVBQVUsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLENBQUM7RUFDNUMsSUFBSVosS0FBSyxHQUFHVSxTQUFTLEVBQUU7SUFDbkJGLFVBQVUsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FBQ0UsRUFBRSxDQUFDYixLQUFLLENBQUMsQ0FBQ2MsTUFBTSxDQUFDTCxXQUFXLENBQUM7RUFDdkQsQ0FBQyxNQUFNO0lBQ0hELFVBQVUsQ0FBQ2IsTUFBTSxDQUFDYyxXQUFXLENBQUM7RUFDbEM7RUFDQSxPQUFPLElBQUk7QUFDZiIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdXRpbHMuanM/ZDBlMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlZmVyZW5jZSB0byB0aGUgSFRNTCBib2R5LlxuICogQHR5cGUgeyp8alF1ZXJ5fEhUTUxFbGVtZW50fVxuICogQHByaXZhdGVcbiAqL1xubGV0IF8kYm9keTtcbmNvbnN0IGFyZ19uYW1lc19yZWcgPSAvKCg/PD1efCxcXHMqKVteXFxzLF0rKS9nO1xuY29uc3QgY29tbWVuZF9yZWcgPSAvKChcXC9cXC8uKiQpfChcXC9cXCpbXFxzXFxTXSo/XFwqXFwvKSkvbWc7XG5cbi8qKlxuICogZ2V0Qm9keSByZXR1cm5zIHRoZSAkYm9keSBqUXVlcnkgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIHsqfGpRdWVyeXxIVE1MRWxlbWVudH0gLSBib2R5IHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJvZHkoKSB7XG4gICAgaWYgKCFfJGJvZHkpIHtcbiAgICAgICAgXyRib2R5ID0gJCgnYm9keScpO1xuICAgIH1cblxuICAgIHJldHVybiBfJGJvZHk7XG59XG5cblxuLyoqXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gZnVuY1xuICogQHJldHVybnMge1JlZ0V4cE1hdGNoQXJyYXl8KltdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyYW1zTmFtZU9mRnVuY3Rpb24oZnVuYykge1xuICAgIHZhciBmbnN0ciA9IGZ1bmMudG9TdHJpbmcoKS5yZXBsYWNlKGNvbW1lbmRfcmVnLCAnJyk7XG4gICAgdmFyIHJlc3VsdCA9IGZuc3RyLnNsaWNlKGZuc3RyLmluZGV4T2YoJygnKSArIDEsIGZuc3RyLmluZGV4T2YoJyknKSkubWF0Y2goYXJnX25hbWVzX3JlZyk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogcHJvbWlzZUR1bW15RmFjdG9yeSBnZW5lcmF0ZXMgYSBzaW1wbGUgcHJvbWlzZSB3aGljaCByZXR1cm5zIGluc3RhbnRseS5cbiAqIEByZXR1cm4ge1Byb21pc2V9IHdpbmRvdy51dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzZUR1bW15RmFjdG9yeSgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FtZWxDYXNlVG9UYWdOYW1lKHN0cikge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9bQS1aXS9nLCBsZXR0ZXIgPT4gYC0ke2xldHRlci50b0xvd2VyQ2FzZSgpfWApO1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9bMC05XSsvZywgbnVtYmVyID0+IGAtJHtudW1iZXJ9YCk7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eWy1dL2csIGBgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRhZ05hbWVUb0NhbWVsQ2FzZShzdHIpIHtcbiAgICBzdHIgPSBzdHIucmVwbGFjZSgvLS4vZywgbGV0dGVyID0+IGAke2xldHRlclsxXS50b1VwcGVyQ2FzZSgpfWApO1xuICAgIHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWdOYW1lVG9SZWFkYWJsZU5hbWUoc3RyKSB7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoLy0uL2csIGxldHRlciA9PiBgICR7bGV0dGVyWzFdLnRvVXBwZXJDYXNlKCl9YCkucmVwbGFjZSgvXi4vZywgbGV0dGVyID0+IGAke2xldHRlci50b1VwcGVyQ2FzZSgpfWApO1xuICAgIHJldHVybiBzdHI7XG59XG5cbmNvbnN0IGNvcHlQcm9wcyA9ICh0YXJnZXRDbGFzcywgc291cmNlQ2xhc3MpID0+IHtcbiAgICBsZXQgc291cmNlID0gc291cmNlQ2xhc3M7XG4gICAgbGV0IHByb3BOYW1lc1RhcmdldCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldENsYXNzLnByb3RvdHlwZSkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0Q2xhc3MucHJvdG90eXBlKSlcbiAgICB3aGlsZSAoc291cmNlLm5hbWUgIT09ICcnKSB7XG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZS5wcm90b3R5cGUpXG4gICAgICAgICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlLnByb3RvdHlwZSkpXG4gICAgICAgICAgICAuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wLm1hdGNoKC9eKD86Y29uc3RydWN0b3J8cHJvdG90eXBlfGFyZ3VtZW50c3xjYWxsZXJ8bmFtZXxiaW5kfGNhbGx8YXBwbHl8dG9TdHJpbmd8bGVuZ3RoKSQvKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFwcm9wTmFtZXNUYXJnZXQuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWVzVGFyZ2V0LnB1c2gocHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXRDbGFzcy5wcm90b3R5cGUsIHByb3AsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLnByb3RvdHlwZSwgcHJvcCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICBzb3VyY2UgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc291cmNlKTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7dHlwZW9mIEFic3RyYWN0U0RDfSBiYXNlQ2xhc3NcbiAqIEBwYXJhbSB7dHlwZW9mIEFic3RyYWN0U0RDfSBtaXhpbnNcbiAqIEByZXR1cm5zIHt0eXBlb2YgQWJzdHJhY3RTREN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2lsZUFnZ3JlZ2F0aW9uKGJhc2VDbGFzcywgLi4ubWl4aW5zKSB7XG5cbiAgICBsZXQgYmFzZSA9IHtcbiAgICAgICAgW2Jhc2VDbGFzcy5uYW1lXTogY2xhc3Mge1xuICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uX2FyZ3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgX21peGlucyA9IHt9O1xuICAgICAgICAgICAgICAgIG1peGlucy5mb3JFYWNoKChtaXhpbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3TWl4aW47XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgKG5ld01peGluID0gbmV3IG1peGluKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3TWl4aW4uX3RhZ05hbWUgPSBtaXhpbi5wcm90b3R5cGUuX3RhZ05hbWU7XG4gICAgICAgICAgICAgICAgICAgIG5ld01peGluLl9pc01peGluID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgX21peGluc1ttaXhpbi5uYW1lXSA9IG5ld01peGluO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBuZXcgYmFzZUNsYXNzKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21peGlucyA9IF9taXhpbnM7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgc3RhdGljIGdldCBuYW1lKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBiYXNlQ2xhc3MubmFtZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RhdGljIGNsYXNzTmFtZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldCBtaXhpbnMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21peGlucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1bYmFzZUNsYXNzLm5hbWVdO1xuXG4gICAgY29weVByb3BzKGJhc2UsIGJhc2VDbGFzcyk7XG5cbiAgICBtaXhpbnMuZm9yRWFjaCgobWl4aW4pID0+IHtcbiAgICAgICAgY29weVByb3BzKGJhc2UsIG1peGluKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBiYXNlO1xuXG59XG5cbmZ1bmN0aW9uIGNzcmZTYWZlTWV0aG9kKG1ldGhvZCkge1xuICAgIC8vIHRoZXNlIEhUVFAgbWV0aG9kcyBkbyBub3QgcmVxdWlyZSBDU1JGIHByb3RlY3Rpb25cbiAgICByZXR1cm4gKC9eKEdFVHxIRUFEfE9QVElPTlN8VFJBQ0UpJC8udGVzdChtZXRob2QpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZEZpbGVGb3JtRGF0YShmb3JtRGF0YSwgdXJsLCBtZXRob2QpIHtcbiAgICByZXR1cm4gJC5hamF4KHtcbiAgICAgICAgdXJsOiB1cmwsICAvL1NlcnZlciBzY3JpcHQgdG8gcHJvY2VzcyBkYXRhXG4gICAgICAgIHR5cGU6IG1ldGhvZCB8fCAnUE9TVCcsXG4gICAgICAgIHhocjogZnVuY3Rpb24gKCkgeyAgLy8gQ3VzdG9tIFhNTEh0dHBSZXF1ZXN0XG4gICAgICAgICAgICB2YXIgbXlYaHIgPSAkLmFqYXhTZXR0aW5ncy54aHIoKTtcbiAgICAgICAgICAgIGlmIChteVhoci51cGxvYWQpIHsgLy8gQ2hlY2sgaWYgdXBsb2FkIHByb3BlcnR5IGV4aXN0c1xuICAgICAgICAgICAgICAgIG15WGhyLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHByb2dyZXNzSGFuZGxpbmdGdW5jdGlvbiwgZmFsc2UpOyAvLyBGb3IgaGFuZGxpbmcgdGhlIHByb2dyZXNzIG9mIHRoZSB1cGxvYWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBteVhocjtcbiAgICAgICAgfSxcbiAgICAgICAgLy9Gb3JtIGRhdGFcbiAgICAgICAgZGF0YTogZm9ybURhdGEsXG4gICAgICAgIC8vT3B0aW9ucyB0byB0ZWxsIGpRdWVyeSBub3QgdG8gcHJvY2VzcyBkYXRhIG9yIHdvcnJ5IGFib3V0IGNvbnRlbnQtdHlwZS5cbiAgICAgICAgY2FjaGU6IGZhbHNlLFxuICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXG4gICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24gKHhociwgc2V0dGluZ3MpIHtcbiAgICAgICAgICAgIGlmICghY3NyZlNhZmVNZXRob2Qoc2V0dGluZ3MudHlwZSkgJiYgIXRoaXMuY3Jvc3NEb21haW4pIHtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQ1NSRlRva2VuXCIsIHdpbmRvdy5DU1JGX1RPS0VOKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBwcm9ncmVzc0hhbmRsaW5nRnVuY3Rpb24oZSkge1xuICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHtcbiAgICAgICAgdmFyIHBlcmNlbnRWYWwgPSBNYXRoLnJvdW5kKChlLmxvYWRlZCAvIGUudG90YWwpICogMTAwKTtcbiAgICAgICAgdmFyICRwcm9ncmVzc0NvbnRhaW5lciA9ICQoJy5wcm9ncmVzcy1jb250YWluZXInKTtcbiAgICAgICAgaWYgKHBlcmNlbnRWYWwgPT09IDEwMCkge1xuICAgICAgICAgICAgJHByb2dyZXNzQ29udGFpbmVyLmhpZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRwcm9ncmVzc0NvbnRhaW5lci5zaG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICBwZXJjZW50VmFsICs9ICclJztcblxuICAgICAgICAkcHJvZ3Jlc3NDb250YWluZXIuZmluZCgnLnByb2dyZXNzLWJhcicpLmNzcyh7J3dpZHRoJzogcGVyY2VudFZhbH0pLnRleHQocGVyY2VudFZhbCk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0lmUGFyYW1OdW1iZXJCb29sT3JTdHJpbmcocGFyYW1FbGVtZW50LCBjb250cm9sbGVyID0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgcGFyYW1FbGVtZW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcGFyYW1FbGVtZW50O1xuICAgIH1cblxuICAgIGlmIChjb250cm9sbGVyICYmIHR5cGVvZiBjb250cm9sbGVyW3BhcmFtRWxlbWVudF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29udHJvbGxlcltwYXJhbUVsZW1lbnRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlcltwYXJhbUVsZW1lbnRdLmJpbmQoY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJbcGFyYW1FbGVtZW50XTtcbiAgICB9XG5cbiAgICBsZXQgaXNGbG9hdFJlZyA9IC9eLT9cXGQrXFwuP1xcZCskLztcbiAgICBsZXQgaXNJbnRSZWcgPSAvXi0/XFxkKyQvO1xuICAgIGxldCBpc0Jvb2xSZWcgPSAvXih0cnVlfGZhbHNlKSQvO1xuICAgIGxldCBpc1N0cmluZ1JlZyA9IC9eKFsnXVteJ10qWyddKXwoW1wiXVteXCJdKltcIl0pJC87XG5cbiAgICBpZiAocGFyYW1FbGVtZW50Lm1hdGNoKGlzQm9vbFJlZykpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtRWxlbWVudCA9PT0gJ3RydWUnO1xuICAgIH0gZWxzZSBpZiAocGFyYW1FbGVtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAocGFyYW1FbGVtZW50LnRvTG93ZXJDYXNlKCkgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHBhcmFtRWxlbWVudC5tYXRjaChpc0ludFJlZykpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHBhcmFtRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQubWF0Y2goaXNGbG9hdFJlZykpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocGFyYW1FbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtRWxlbWVudC5tYXRjaChpc1N0cmluZ1JlZykpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtRWxlbWVudC5zdWJzdHIoMSwgcGFyYW1FbGVtZW50Lmxlbmd0aCAtIDIpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbUVsZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjQoKSB7XG4gICAgcmV0dXJuIChbMWU3XSArIC0xZTMgKyAtNGUzICsgLThlMyArIC0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLCBjID0+XG4gICAgICAgIChjIF4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0gJiAxNSA+PiBjIC8gNCkudG9TdHJpbmcoMTYpXG4gICAgKTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJFcnJvcnNJbkZvcm0oJGZvcm0pIHtcbiAgICAkZm9ybS5maW5kKCcuaGFzLWVycm9yJykucmVtb3ZlQ2xhc3MoJ2hhcy1lcnJvcicpLmZpbmQoJy5hbGVydC1kYW5nZXInKS5yZW1vdmUoKTtcbiAgICAkZm9ybS5maW5kKCcubm9uLWZpZWxkLWVycm9ycycpLnJlbW92ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RXJyb3JzSW5Gb3JtKCRmb3JtLCAkcmVzRm9ybSkge1xuICAgICRyZXNGb3JtID0gJCgnPGRpdj4nKS5hcHBlbmQoJHJlc0Zvcm0pO1xuXG4gICAgJGZvcm0uZmluZCgnLmhhcy1lcnJvcicpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKS5maW5kKCcuYWxlcnQtZGFuZ2VyJykuc2FmZVJlbW92ZSgpO1xuICAgICRmb3JtLmZpbmQoJy5ub24tZmllbGQtZXJyb3JzJykuc2FmZVJlbW92ZSgpO1xuICAgIGxldCAkZmlsZV9jb250YWluZXIgPSAkcmVzRm9ybS5maW5kKCdpbnB1dFt0eXBlPWZpbGVdJykucGFyZW50KCk7XG4gICAgJGZvcm0uZmluZCgnaW5wdXRbdHlwZT1maWxlXScpLnBhcmVudCgpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICQodGhpcykucmVwbGFjZVdpdGgoJGZpbGVfY29udGFpbmVyW2luZGV4XSk7XG4gICAgfSk7XG5cbiAgICBsZXQgaGFzTm9FcnJvciA9ICRyZXNGb3JtLmZpbmQoJy5ub24tZmllbGQtZXJyb3JzJykuaW5zZXJ0QWZ0ZXIoJGZvcm0uZmluZCgnLmhpZGRlbi1mb3JtLWZpZWxkcycpKS5sZW5ndGggPT09IDA7XG4gICAgJHJlc0Zvcm0uZmluZCgnLmhhcy1lcnJvcicpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBoYXNOb0Vycm9yID0gZmFsc2U7XG4gICAgICAgIGxldCAkcmVzRXJyb3JGaWVsZCA9ICQodGhpcyk7XG4gICAgICAgIGxldCBjbGFzc05hbWUgPSAkcmVzRXJyb3JGaWVsZC5kYXRhKCdhdXRvLWlkJyk7XG4gICAgICAgIGxldCAkZXJyb3JGaWVsZCA9ICRmb3JtLmZpbmQoJy5mb3JtLWdyb3VwLicgKyBjbGFzc05hbWUpO1xuICAgICAgICAkZXJyb3JGaWVsZC5hZGRDbGFzcygnaGFzLWVycm9yJyk7XG4gICAgICAgICRlcnJvckZpZWxkLmZpbmQoJy5mb3JtLWlucHV0LWNvbnRhaW5lcicpLmFwcGVuZCgkcmVzRXJyb3JGaWVsZC5maW5kKCcuYWxlcnQtZGFuZ2VyJykpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhhc05vRXJyb3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqcXVlcnlJbnNlcnRBdCgkY29udGFpbmVyLCBpbmRleCwgJG5ld0VsZW1lbnQpIHtcbiAgICBsZXQgbGFzdEluZGV4ID0gJGNvbnRhaW5lci5jaGlsZHJlbigpLnNpemUoKTtcbiAgICBpZiAoaW5kZXggPCBsYXN0SW5kZXgpIHtcbiAgICAgICAgJGNvbnRhaW5lci5jaGlsZHJlbigpLmVxKGluZGV4KS5iZWZvcmUoJG5ld0VsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgICRjb250YWluZXIuYXBwZW5kKCRuZXdFbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59XG4iXSwibmFtZXMiOlsiXyRib2R5IiwiYXJnX25hbWVzX3JlZyIsImNvbW1lbmRfcmVnIiwiZ2V0Qm9keSIsIiQiLCJnZXRQYXJhbXNOYW1lT2ZGdW5jdGlvbiIsImZ1bmMiLCJmbnN0ciIsInRvU3RyaW5nIiwicmVwbGFjZSIsInJlc3VsdCIsInNsaWNlIiwiaW5kZXhPZiIsIm1hdGNoIiwicHJvbWlzZUR1bW15RmFjdG9yeSIsIlByb21pc2UiLCJyZXNvbHZlIiwiY2FtZWxDYXNlVG9UYWdOYW1lIiwic3RyIiwibGV0dGVyIiwidG9Mb3dlckNhc2UiLCJudW1iZXIiLCJ0YWdOYW1lVG9DYW1lbENhc2UiLCJ0b1VwcGVyQ2FzZSIsInRhZ05hbWVUb1JlYWRhYmxlTmFtZSIsImNvcHlQcm9wcyIsInRhcmdldENsYXNzIiwic291cmNlQ2xhc3MiLCJzb3VyY2UiLCJwcm9wTmFtZXNUYXJnZXQiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicHJvdG90eXBlIiwiY29uY2F0IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibmFtZSIsImZvckVhY2giLCJwcm9wIiwiaW5jbHVkZXMiLCJwdXNoIiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJnZXRQcm90b3R5cGVPZiIsImFnaWxlQWdncmVnYXRpb24iLCJiYXNlQ2xhc3MiLCJtaXhpbnMiLCJiYXNlIiwiY29uc3RydWN0b3IiLCJfYXJncyIsIl9taXhpbnMiLCJtaXhpbiIsIm5ld01peGluIiwiYXNzaWduIiwiX3RhZ05hbWUiLCJfaXNNaXhpbiIsImNsYXNzTmFtZSIsImNzcmZTYWZlTWV0aG9kIiwibWV0aG9kIiwidGVzdCIsInVwbG9hZEZpbGVGb3JtRGF0YSIsImZvcm1EYXRhIiwidXJsIiwiYWpheCIsInR5cGUiLCJ4aHIiLCJteVhociIsImFqYXhTZXR0aW5ncyIsInVwbG9hZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJwcm9ncmVzc0hhbmRsaW5nRnVuY3Rpb24iLCJkYXRhIiwiY2FjaGUiLCJjb250ZW50VHlwZSIsInByb2Nlc3NEYXRhIiwiYmVmb3JlU2VuZCIsInNldHRpbmdzIiwiY3Jvc3NEb21haW4iLCJzZXRSZXF1ZXN0SGVhZGVyIiwid2luZG93IiwiQ1NSRl9UT0tFTiIsImUiLCJsZW5ndGhDb21wdXRhYmxlIiwicGVyY2VudFZhbCIsIk1hdGgiLCJyb3VuZCIsImxvYWRlZCIsInRvdGFsIiwiJHByb2dyZXNzQ29udGFpbmVyIiwiaGlkZSIsInNob3ciLCJmaW5kIiwiY3NzIiwidGV4dCIsImNoZWNrSWZQYXJhbU51bWJlckJvb2xPclN0cmluZyIsInBhcmFtRWxlbWVudCIsImNvbnRyb2xsZXIiLCJiaW5kIiwiaXNGbG9hdFJlZyIsImlzSW50UmVnIiwiaXNCb29sUmVnIiwiaXNTdHJpbmdSZWciLCJ1bmRlZmluZWQiLCJwYXJzZUludCIsInBhcnNlRmxvYXQiLCJzdWJzdHIiLCJsZW5ndGgiLCJ1dWlkdjQiLCJjIiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwiVWludDhBcnJheSIsImNsZWFyRXJyb3JzSW5Gb3JtIiwiJGZvcm0iLCJyZW1vdmVDbGFzcyIsInJlbW92ZSIsInNldEVycm9yc0luRm9ybSIsIiRyZXNGb3JtIiwiYXBwZW5kIiwic2FmZVJlbW92ZSIsIiRmaWxlX2NvbnRhaW5lciIsInBhcmVudCIsImVhY2giLCJpbmRleCIsInJlcGxhY2VXaXRoIiwiaGFzTm9FcnJvciIsImluc2VydEFmdGVyIiwiJHJlc0Vycm9yRmllbGQiLCIkZXJyb3JGaWVsZCIsImFkZENsYXNzIiwianF1ZXJ5SW5zZXJ0QXQiLCIkY29udGFpbmVyIiwiJG5ld0VsZW1lbnQiLCJsYXN0SW5kZXgiLCJjaGlsZHJlbiIsInNpemUiLCJlcSIsImJlZm9yZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_utils.js\n\n}");
117
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ agileAggregation: () => (/* binding */ agileAggregation),\n/* harmony export */ camelCaseToTagName: () => (/* binding */ camelCaseToTagName),\n/* harmony export */ checkIfParamNumberBoolOrString: () => (/* binding */ checkIfParamNumberBoolOrString),\n/* harmony export */ clearErrorsInForm: () => (/* binding */ clearErrorsInForm),\n/* harmony export */ getBody: () => (/* binding */ getBody),\n/* harmony export */ getParamsNameOfFunction: () => (/* binding */ getParamsNameOfFunction),\n/* harmony export */ jqueryInsertAt: () => (/* binding */ jqueryInsertAt),\n/* harmony export */ promiseDummyFactory: () => (/* binding */ promiseDummyFactory),\n/* harmony export */ setErrorsInForm: () => (/* binding */ setErrorsInForm),\n/* harmony export */ tagNameToCamelCase: () => (/* binding */ tagNameToCamelCase),\n/* harmony export */ tagNameToReadableName: () => (/* binding */ tagNameToReadableName),\n/* harmony export */ uploadFileFormData: () => (/* binding */ uploadFileFormData),\n/* harmony export */ uuidv4: () => (/* binding */ uuidv4)\n/* harmony export */ });\n/**\n * Reference to the HTML body.\n * @type {*|jQuery|HTMLElement}\n * @private\n */\nlet _$body;\nconst arg_names_reg = /(?<=^|,\\s?)[^=\\s,]+/g;\nconst commend_reg = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\n\n/**\n * getBody returns the $body jQuery object.\n *\n * @returns {*|jQuery|HTMLElement} - body reference.\n */\nfunction getBody() {\n if (!_$body) {\n _$body = $('body');\n }\n return _$body;\n}\n\n/**\n *\n * @param {function} func\n * @returns {RegExpMatchArray|*[]}\n */\nfunction getParamsNameOfFunction(func) {\n var fnstr = func.toString().replace(commend_reg, '');\n var result = fnstr.slice(fnstr.indexOf('(') + 1, fnstr.indexOf(')')).match(arg_names_reg);\n if (!result) {\n return [];\n }\n return result;\n}\n\n/**\n * promiseDummyFactory generates a simple promise which returns instantly.\n * @return {Promise} window.utils\n */\nfunction promiseDummyFactory() {\n return new Promise(function (resolve) {\n resolve();\n });\n}\nfunction camelCaseToTagName(str) {\n str = str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\n str = str.replace(/[0-9]+/g, number => `-${number}`);\n return str.replace(/^[-]/g, ``);\n}\nfunction tagNameToCamelCase(str) {\n str = str.replace(/-./g, letter => `${letter[1].toUpperCase()}`);\n return str;\n}\nfunction tagNameToReadableName(str) {\n str = str.replace(/-./g, letter => ` ${letter[1].toUpperCase()}`).replace(/^./g, letter => `${letter.toUpperCase()}`);\n return str;\n}\nconst copyProps = (targetClass, sourceClass) => {\n let source = sourceClass;\n let propNamesTarget = Object.getOwnPropertyNames(targetClass.prototype).concat(Object.getOwnPropertySymbols(targetClass.prototype));\n while (source.name !== '') {\n Object.getOwnPropertyNames(source.prototype).concat(Object.getOwnPropertySymbols(source.prototype)).forEach(prop => {\n if (prop.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {\n return;\n }\n if (!propNamesTarget.includes(prop)) {\n propNamesTarget.push(prop);\n Object.defineProperty(targetClass.prototype, prop, Object.getOwnPropertyDescriptor(source.prototype, prop));\n }\n });\n source = Object.getPrototypeOf(source);\n }\n};\n\n/**\n *\n * @param {typeof AbstractSDC} baseClass\n * @param {typeof AbstractSDC} mixins\n * @returns {typeof AbstractSDC}\n */\nfunction agileAggregation(baseClass, ...mixins) {\n let base = {\n [baseClass.name]: class {\n constructor(..._args) {\n let _mixins = {};\n mixins.forEach(mixin => {\n let newMixin;\n Object.assign(this, newMixin = new mixin());\n newMixin._tagName = mixin.prototype._tagName;\n newMixin._isMixin = true;\n _mixins[mixin.name] = newMixin;\n });\n Object.assign(this, new baseClass());\n this._mixins = _mixins;\n }\n static get name() {\n return baseClass.name;\n }\n static className() {\n return this.name;\n }\n get mixins() {\n return this._mixins;\n }\n }\n }[baseClass.name];\n copyProps(base, baseClass);\n mixins.forEach(mixin => {\n copyProps(base, mixin);\n });\n return base;\n}\nfunction csrfSafeMethod(method) {\n // these HTTP methods do not require CSRF protection\n return /^(GET|HEAD|OPTIONS|TRACE)$/.test(method);\n}\nfunction uploadFileFormData(formData, url, method) {\n return $.ajax({\n url: url,\n //Server script to process data\n type: method || 'POST',\n xhr: function () {\n // Custom XMLHttpRequest\n var myXhr = $.ajaxSettings.xhr();\n if (myXhr.upload) {\n // Check if upload property exists\n myXhr.upload.addEventListener('progress', progressHandlingFunction, false); // For handling the progress of the upload\n }\n return myXhr;\n },\n //Form data\n data: formData,\n //Options to tell jQuery not to process data or worry about content-type.\n cache: false,\n contentType: false,\n processData: false,\n beforeSend: function (xhr, settings) {\n if (!csrfSafeMethod(settings.type) && !this.crossDomain) {\n xhr.setRequestHeader(\"X-CSRFToken\", window.CSRF_TOKEN);\n }\n }\n });\n}\nfunction progressHandlingFunction(e) {\n if (e.lengthComputable) {\n var percentVal = Math.round(e.loaded / e.total * 100);\n var $progressContainer = $('.progress-container');\n if (percentVal === 100) {\n $progressContainer.hide();\n } else {\n $progressContainer.show();\n }\n percentVal += '%';\n $progressContainer.find('.progress-bar').css({\n 'width': percentVal\n }).text(percentVal);\n }\n}\nfunction checkIfParamNumberBoolOrString(paramElement, controller = null) {\n if (typeof paramElement !== 'string') {\n return paramElement;\n }\n if (controller && typeof controller[paramElement] !== 'undefined') {\n if (typeof controller[paramElement] === 'function') {\n return controller[paramElement].bind(controller);\n }\n return controller[paramElement];\n }\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n if (paramElement.match(isBoolReg)) {\n return paramElement === 'true';\n } else if (paramElement === 'undefined') {\n return undefined;\n } else if (paramElement.toLowerCase() === 'none') {\n return null;\n } else if (paramElement.match(isIntReg)) {\n return parseInt(paramElement);\n } else if (paramElement.match(isFloatReg)) {\n return parseFloat(paramElement);\n } else if (paramElement.match(isStringReg)) {\n return paramElement.substr(1, paramElement.length - 2);\n }\n return paramElement;\n}\nfunction uuidv4() {\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n}\nfunction clearErrorsInForm($form) {\n $form.find('.has-error').removeClass('has-error').find('.alert-danger').remove();\n $form.find('.non-field-errors').remove();\n}\nfunction setErrorsInForm($form, $resForm) {\n $resForm = $('<div>').append($resForm);\n $form.find('.has-error').removeClass('has-error').find('.alert-danger').safeRemove();\n $form.find('.non-field-errors').safeRemove();\n let $file_container = $resForm.find('input[type=file]').parent();\n $form.find('input[type=file]').parent().each(function (index) {\n $(this).replaceWith($file_container[index]);\n });\n let hasNoError = $resForm.find('.non-field-errors').insertAfter($form.find('.hidden-form-fields')).length === 0;\n $resForm.find('.has-error').each(function () {\n hasNoError = false;\n let $resErrorField = $(this);\n let className = $resErrorField.data('auto-id');\n let $errorField = $form.find('.form-group.' + className);\n $errorField.addClass('has-error');\n $errorField.find('.form-input-container').append($resErrorField.find('.alert-danger'));\n });\n return hasNoError;\n}\nfunction jqueryInsertAt($container, index, $newElement) {\n let lastIndex = $container.children().size();\n if (index < lastIndex) {\n $container.children().eq(index).before($newElement);\n } else {\n $container.append($newElement);\n }\n return this;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxDQUFDO0VBQzFGLENBQUMsQ0FBQztFQUVGLE9BQU9rQyxVQUFVO0FBQ3JCO0FBRU8sU0FBU0ssY0FBY0EsQ0FBQ0MsVUFBVSxFQUFFUixLQUFLLEVBQUVTLFdBQVcsRUFBRTtFQUMzRCxJQUFJQyxTQUFTLEdBQUdGLFVBQVUsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLENBQUM7RUFDNUMsSUFBSVosS0FBSyxHQUFHVSxTQUFTLEVBQUU7SUFDbkJGLFVBQVUsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FBQ0UsRUFBRSxDQUFDYixLQUFLLENBQUMsQ0FBQ2MsTUFBTSxDQUFDTCxXQUFXLENBQUM7RUFDdkQsQ0FBQyxNQUFNO0lBQ0hELFVBQVUsQ0FBQ2IsTUFBTSxDQUFDYyxXQUFXLENBQUM7RUFDbEM7RUFDQSxPQUFPLElBQUk7QUFDZiIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdXRpbHMuanM/ZDBlMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlZmVyZW5jZSB0byB0aGUgSFRNTCBib2R5LlxuICogQHR5cGUgeyp8alF1ZXJ5fEhUTUxFbGVtZW50fVxuICogQHByaXZhdGVcbiAqL1xubGV0IF8kYm9keTtcbmNvbnN0IGFyZ19uYW1lc19yZWcgPSAvKD88PV58LFxccz8pW149XFxzLF0rL2c7XG5jb25zdCBjb21tZW5kX3JlZyA9IC8oKFxcL1xcLy4qJCl8KFxcL1xcKltcXHNcXFNdKj9cXCpcXC8pKS9tZztcblxuLyoqXG4gKiBnZXRCb2R5IHJldHVybnMgdGhlICRib2R5IGpRdWVyeSBvYmplY3QuXG4gKlxuICogQHJldHVybnMgeyp8alF1ZXJ5fEhUTUxFbGVtZW50fSAtIGJvZHkgcmVmZXJlbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qm9keSgpIHtcbiAgICBpZiAoIV8kYm9keSkge1xuICAgICAgICBfJGJvZHkgPSAkKCdib2R5Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF8kYm9keTtcbn1cblxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5jXG4gKiBAcmV0dXJucyB7UmVnRXhwTWF0Y2hBcnJheXwqW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJhbXNOYW1lT2ZGdW5jdGlvbihmdW5jKSB7XG4gICAgdmFyIGZuc3RyID0gZnVuYy50b1N0cmluZygpLnJlcGxhY2UoY29tbWVuZF9yZWcsICcnKTtcbiAgICB2YXIgcmVzdWx0ID0gZm5zdHIuc2xpY2UoZm5zdHIuaW5kZXhPZignKCcpICsgMSwgZm5zdHIuaW5kZXhPZignKScpKS5tYXRjaChhcmdfbmFtZXNfcmVnKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBwcm9taXNlRHVtbXlGYWN0b3J5IGdlbmVyYXRlcyBhIHNpbXBsZSBwcm9taXNlIHdoaWNoIHJldHVybnMgaW5zdGFudGx5LlxuICogQHJldHVybiB7UHJvbWlzZX0gd2luZG93LnV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9taXNlRHVtbXlGYWN0b3J5KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbENhc2VUb1RhZ05hbWUoc3RyKSB7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoL1tBLVpdL2csIGxldHRlciA9PiBgLSR7bGV0dGVyLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoL1swLTldKy9nLCBudW1iZXIgPT4gYC0ke251bWJlcn1gKTtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL15bLV0vZywgYGApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFnTmFtZVRvQ2FtZWxDYXNlKHN0cikge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC8tLi9nLCBsZXR0ZXIgPT4gYCR7bGV0dGVyWzFdLnRvVXBwZXJDYXNlKCl9YCk7XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRhZ05hbWVUb1JlYWRhYmxlTmFtZShzdHIpIHtcbiAgICBzdHIgPSBzdHIucmVwbGFjZSgvLS4vZywgbGV0dGVyID0+IGAgJHtsZXR0ZXJbMV0udG9VcHBlckNhc2UoKX1gKS5yZXBsYWNlKC9eLi9nLCBsZXR0ZXIgPT4gYCR7bGV0dGVyLnRvVXBwZXJDYXNlKCl9YCk7XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuY29uc3QgY29weVByb3BzID0gKHRhcmdldENsYXNzLCBzb3VyY2VDbGFzcykgPT4ge1xuICAgIGxldCBzb3VyY2UgPSBzb3VyY2VDbGFzcztcbiAgICBsZXQgcHJvcE5hbWVzVGFyZ2V0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0Q2xhc3MucHJvdG90eXBlKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXRDbGFzcy5wcm90b3R5cGUpKVxuICAgIHdoaWxlIChzb3VyY2UubmFtZSAhPT0gJycpIHtcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc291cmNlLnByb3RvdHlwZSlcbiAgICAgICAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UucHJvdG90eXBlKSlcbiAgICAgICAgICAgIC5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3AubWF0Y2goL14oPzpjb25zdHJ1Y3Rvcnxwcm90b3R5cGV8YXJndW1lbnRzfGNhbGxlcnxuYW1lfGJpbmR8Y2FsbHxhcHBseXx0b1N0cmluZ3xsZW5ndGgpJC8pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXByb3BOYW1lc1RhcmdldC5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZXNUYXJnZXQucHVzaChwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldENsYXNzLnByb3RvdHlwZSwgcHJvcCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UucHJvdG90eXBlLCBwcm9wKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHNvdXJjZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpO1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHt0eXBlb2YgQWJzdHJhY3RTREN9IGJhc2VDbGFzc1xuICogQHBhcmFtIHt0eXBlb2YgQWJzdHJhY3RTREN9IG1peGluc1xuICogQHJldHVybnMge3R5cGVvZiBBYnN0cmFjdFNEQ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFnaWxlQWdncmVnYXRpb24oYmFzZUNsYXNzLCAuLi5taXhpbnMpIHtcblxuICAgIGxldCBiYXNlID0ge1xuICAgICAgICBbYmFzZUNsYXNzLm5hbWVdOiBjbGFzcyB7XG4gICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5fYXJncykge1xuICAgICAgICAgICAgICAgIGxldCBfbWl4aW5zID0ge307XG4gICAgICAgICAgICAgICAgbWl4aW5zLmZvckVhY2goKG1peGluKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdNaXhpbjtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCAobmV3TWl4aW4gPSBuZXcgbWl4aW4oKSkpO1xuICAgICAgICAgICAgICAgICAgICBuZXdNaXhpbi5fdGFnTmFtZSA9IG1peGluLnByb3RvdHlwZS5fdGFnTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgbmV3TWl4aW4uX2lzTWl4aW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBfbWl4aW5zW21peGluLm5hbWVdID0gbmV3TWl4aW47XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIG5ldyBiYXNlQ2xhc3MoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWl4aW5zID0gX21peGlucztcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBzdGF0aWMgZ2V0IG5hbWUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VDbGFzcy5uYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGF0aWMgY2xhc3NOYW1lKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2V0IG1peGlucygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWl4aW5zO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVtiYXNlQ2xhc3MubmFtZV07XG5cbiAgICBjb3B5UHJvcHMoYmFzZSwgYmFzZUNsYXNzKTtcblxuICAgIG1peGlucy5mb3JFYWNoKChtaXhpbikgPT4ge1xuICAgICAgICBjb3B5UHJvcHMoYmFzZSwgbWl4aW4pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJhc2U7XG5cbn1cblxuZnVuY3Rpb24gY3NyZlNhZmVNZXRob2QobWV0aG9kKSB7XG4gICAgLy8gdGhlc2UgSFRUUCBtZXRob2RzIGRvIG5vdCByZXF1aXJlIENTUkYgcHJvdGVjdGlvblxuICAgIHJldHVybiAoL14oR0VUfEhFQUR8T1BUSU9OU3xUUkFDRSkkLy50ZXN0KG1ldGhvZCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCB1cmwsIG1ldGhvZCkge1xuICAgIHJldHVybiAkLmFqYXgoe1xuICAgICAgICB1cmw6IHVybCwgIC8vU2VydmVyIHNjcmlwdCB0byBwcm9jZXNzIGRhdGFcbiAgICAgICAgdHlwZTogbWV0aG9kIHx8ICdQT1NUJyxcbiAgICAgICAgeGhyOiBmdW5jdGlvbiAoKSB7ICAvLyBDdXN0b20gWE1MSHR0cFJlcXVlc3RcbiAgICAgICAgICAgIHZhciBteVhociA9ICQuYWpheFNldHRpbmdzLnhocigpO1xuICAgICAgICAgICAgaWYgKG15WGhyLnVwbG9hZCkgeyAvLyBDaGVjayBpZiB1cGxvYWQgcHJvcGVydHkgZXhpc3RzXG4gICAgICAgICAgICAgICAgbXlYaHIudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgcHJvZ3Jlc3NIYW5kbGluZ0Z1bmN0aW9uLCBmYWxzZSk7IC8vIEZvciBoYW5kbGluZyB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIHVwbG9hZFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG15WGhyO1xuICAgICAgICB9LFxuICAgICAgICAvL0Zvcm0gZGF0YVxuICAgICAgICBkYXRhOiBmb3JtRGF0YSxcbiAgICAgICAgLy9PcHRpb25zIHRvIHRlbGwgalF1ZXJ5IG5vdCB0byBwcm9jZXNzIGRhdGEgb3Igd29ycnkgYWJvdXQgY29udGVudC10eXBlLlxuICAgICAgICBjYWNoZTogZmFsc2UsXG4gICAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSxcbiAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLFxuICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoeGhyLCBzZXR0aW5ncykge1xuICAgICAgICAgICAgaWYgKCFjc3JmU2FmZU1ldGhvZChzZXR0aW5ncy50eXBlKSAmJiAhdGhpcy5jcm9zc0RvbWFpbikge1xuICAgICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiWC1DU1JGVG9rZW5cIiwgd2luZG93LkNTUkZfVE9LRU4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHByb2dyZXNzSGFuZGxpbmdGdW5jdGlvbihlKSB7XG4gICAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkge1xuICAgICAgICB2YXIgcGVyY2VudFZhbCA9IE1hdGgucm91bmQoKGUubG9hZGVkIC8gZS50b3RhbCkgKiAxMDApO1xuICAgICAgICB2YXIgJHByb2dyZXNzQ29udGFpbmVyID0gJCgnLnByb2dyZXNzLWNvbnRhaW5lcicpO1xuICAgICAgICBpZiAocGVyY2VudFZhbCA9PT0gMTAwKSB7XG4gICAgICAgICAgICAkcHJvZ3Jlc3NDb250YWluZXIuaGlkZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHByb2dyZXNzQ29udGFpbmVyLnNob3coKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBlcmNlbnRWYWwgKz0gJyUnO1xuXG4gICAgICAgICRwcm9ncmVzc0NvbnRhaW5lci5maW5kKCcucHJvZ3Jlc3MtYmFyJykuY3NzKHsnd2lkdGgnOiBwZXJjZW50VmFsfSkudGV4dChwZXJjZW50VmFsKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSWZQYXJhbU51bWJlckJvb2xPclN0cmluZyhwYXJhbUVsZW1lbnQsIGNvbnRyb2xsZXIgPSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbUVsZW1lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBwYXJhbUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRyb2xsZXIgJiYgdHlwZW9mIGNvbnRyb2xsZXJbcGFyYW1FbGVtZW50XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb250cm9sbGVyW3BhcmFtRWxlbWVudF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVyW3BhcmFtRWxlbWVudF0uYmluZChjb250cm9sbGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJvbGxlcltwYXJhbUVsZW1lbnRdO1xuICAgIH1cblxuICAgIGxldCBpc0Zsb2F0UmVnID0gL14tP1xcZCtcXC4/XFxkKyQvO1xuICAgIGxldCBpc0ludFJlZyA9IC9eLT9cXGQrJC87XG4gICAgbGV0IGlzQm9vbFJlZyA9IC9eKHRydWV8ZmFsc2UpJC87XG4gICAgbGV0IGlzU3RyaW5nUmVnID0gL14oWyddW14nXSpbJ10pfChbXCJdW15cIl0qW1wiXSkkLztcblxuICAgIGlmIChwYXJhbUVsZW1lbnQubWF0Y2goaXNCb29sUmVnKSkge1xuICAgICAgICByZXR1cm4gcGFyYW1FbGVtZW50ID09PSAndHJ1ZSc7XG4gICAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQudG9Mb3dlckNhc2UoKSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAocGFyYW1FbGVtZW50Lm1hdGNoKGlzSW50UmVnKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQocGFyYW1FbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtRWxlbWVudC5tYXRjaChpc0Zsb2F0UmVnKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChwYXJhbUVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1FbGVtZW50Lm1hdGNoKGlzU3RyaW5nUmVnKSkge1xuICAgICAgICByZXR1cm4gcGFyYW1FbGVtZW50LnN1YnN0cigxLCBwYXJhbUVsZW1lbnQubGVuZ3RoIC0gMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtRWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCgpIHtcbiAgICByZXR1cm4gKFsxZTddICsgLTFlMyArIC00ZTMgKyAtOGUzICsgLTFlMTEpLnJlcGxhY2UoL1swMThdL2csIGMgPT5cbiAgICAgICAgKGMgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+IGMgLyA0KS50b1N0cmluZygxNilcbiAgICApO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckVycm9yc0luRm9ybSgkZm9ybSkge1xuICAgICRmb3JtLmZpbmQoJy5oYXMtZXJyb3InKS5yZW1vdmVDbGFzcygnaGFzLWVycm9yJykuZmluZCgnLmFsZXJ0LWRhbmdlcicpLnJlbW92ZSgpO1xuICAgICRmb3JtLmZpbmQoJy5ub24tZmllbGQtZXJyb3JzJykucmVtb3ZlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRFcnJvcnNJbkZvcm0oJGZvcm0sICRyZXNGb3JtKSB7XG4gICAgJHJlc0Zvcm0gPSAkKCc8ZGl2PicpLmFwcGVuZCgkcmVzRm9ybSk7XG5cbiAgICAkZm9ybS5maW5kKCcuaGFzLWVycm9yJykucmVtb3ZlQ2xhc3MoJ2hhcy1lcnJvcicpLmZpbmQoJy5hbGVydC1kYW5nZXInKS5zYWZlUmVtb3ZlKCk7XG4gICAgJGZvcm0uZmluZCgnLm5vbi1maWVsZC1lcnJvcnMnKS5zYWZlUmVtb3ZlKCk7XG4gICAgbGV0ICRmaWxlX2NvbnRhaW5lciA9ICRyZXNGb3JtLmZpbmQoJ2lucHV0W3R5cGU9ZmlsZV0nKS5wYXJlbnQoKTtcbiAgICAkZm9ybS5maW5kKCdpbnB1dFt0eXBlPWZpbGVdJykucGFyZW50KCkuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgJCh0aGlzKS5yZXBsYWNlV2l0aCgkZmlsZV9jb250YWluZXJbaW5kZXhdKTtcbiAgICB9KTtcblxuICAgIGxldCBoYXNOb0Vycm9yID0gJHJlc0Zvcm0uZmluZCgnLm5vbi1maWVsZC1lcnJvcnMnKS5pbnNlcnRBZnRlcigkZm9ybS5maW5kKCcuaGlkZGVuLWZvcm0tZmllbGRzJykpLmxlbmd0aCA9PT0gMDtcbiAgICAkcmVzRm9ybS5maW5kKCcuaGFzLWVycm9yJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGhhc05vRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgbGV0ICRyZXNFcnJvckZpZWxkID0gJCh0aGlzKTtcbiAgICAgICAgbGV0IGNsYXNzTmFtZSA9ICRyZXNFcnJvckZpZWxkLmRhdGEoJ2F1dG8taWQnKTtcbiAgICAgICAgbGV0ICRlcnJvckZpZWxkID0gJGZvcm0uZmluZCgnLmZvcm0tZ3JvdXAuJyArIGNsYXNzTmFtZSk7XG4gICAgICAgICRlcnJvckZpZWxkLmFkZENsYXNzKCdoYXMtZXJyb3InKTtcbiAgICAgICAgJGVycm9yRmllbGQuZmluZCgnLmZvcm0taW5wdXQtY29udGFpbmVyJykuYXBwZW5kKCRyZXNFcnJvckZpZWxkLmZpbmQoJy5hbGVydC1kYW5nZXInKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGFzTm9FcnJvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpxdWVyeUluc2VydEF0KCRjb250YWluZXIsIGluZGV4LCAkbmV3RWxlbWVudCkge1xuICAgIGxldCBsYXN0SW5kZXggPSAkY29udGFpbmVyLmNoaWxkcmVuKCkuc2l6ZSgpO1xuICAgIGlmIChpbmRleCA8IGxhc3RJbmRleCkge1xuICAgICAgICAkY29udGFpbmVyLmNoaWxkcmVuKCkuZXEoaW5kZXgpLmJlZm9yZSgkbmV3RWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgJGNvbnRhaW5lci5hcHBlbmQoJG5ld0VsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbn1cbiJdLCJuYW1lcyI6WyJfJGJvZHkiLCJhcmdfbmFtZXNfcmVnIiwiY29tbWVuZF9yZWciLCJnZXRCb2R5IiwiJCIsImdldFBhcmFtc05hbWVPZkZ1bmN0aW9uIiwiZnVuYyIsImZuc3RyIiwidG9TdHJpbmciLCJyZXBsYWNlIiwicmVzdWx0Iiwic2xpY2UiLCJpbmRleE9mIiwibWF0Y2giLCJwcm9taXNlRHVtbXlGYWN0b3J5IiwiUHJvbWlzZSIsInJlc29sdmUiLCJjYW1lbENhc2VUb1RhZ05hbWUiLCJzdHIiLCJsZXR0ZXIiLCJ0b0xvd2VyQ2FzZSIsIm51bWJlciIsInRhZ05hbWVUb0NhbWVsQ2FzZSIsInRvVXBwZXJDYXNlIiwidGFnTmFtZVRvUmVhZGFibGVOYW1lIiwiY29weVByb3BzIiwidGFyZ2V0Q2xhc3MiLCJzb3VyY2VDbGFzcyIsInNvdXJjZSIsInByb3BOYW1lc1RhcmdldCIsIk9iamVjdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJwcm90b3R5cGUiLCJjb25jYXQiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJuYW1lIiwiZm9yRWFjaCIsInByb3AiLCJpbmNsdWRlcyIsInB1c2giLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImdldFByb3RvdHlwZU9mIiwiYWdpbGVBZ2dyZWdhdGlvbiIsImJhc2VDbGFzcyIsIm1peGlucyIsImJhc2UiLCJjb25zdHJ1Y3RvciIsIl9hcmdzIiwiX21peGlucyIsIm1peGluIiwibmV3TWl4aW4iLCJhc3NpZ24iLCJfdGFnTmFtZSIsIl9pc01peGluIiwiY2xhc3NOYW1lIiwiY3NyZlNhZmVNZXRob2QiLCJtZXRob2QiLCJ0ZXN0IiwidXBsb2FkRmlsZUZvcm1EYXRhIiwiZm9ybURhdGEiLCJ1cmwiLCJhamF4IiwidHlwZSIsInhociIsIm15WGhyIiwiYWpheFNldHRpbmdzIiwidXBsb2FkIiwiYWRkRXZlbnRMaXN0ZW5lciIsInByb2dyZXNzSGFuZGxpbmdGdW5jdGlvbiIsImRhdGEiLCJjYWNoZSIsImNvbnRlbnRUeXBlIiwicHJvY2Vzc0RhdGEiLCJiZWZvcmVTZW5kIiwic2V0dGluZ3MiLCJjcm9zc0RvbWFpbiIsInNldFJlcXVlc3RIZWFkZXIiLCJ3aW5kb3ciLCJDU1JGX1RPS0VOIiwiZSIsImxlbmd0aENvbXB1dGFibGUiLCJwZXJjZW50VmFsIiwiTWF0aCIsInJvdW5kIiwibG9hZGVkIiwidG90YWwiLCIkcHJvZ3Jlc3NDb250YWluZXIiLCJoaWRlIiwic2hvdyIsImZpbmQiLCJjc3MiLCJ0ZXh0IiwiY2hlY2tJZlBhcmFtTnVtYmVyQm9vbE9yU3RyaW5nIiwicGFyYW1FbGVtZW50IiwiY29udHJvbGxlciIsImJpbmQiLCJpc0Zsb2F0UmVnIiwiaXNJbnRSZWciLCJpc0Jvb2xSZWciLCJpc1N0cmluZ1JlZyIsInVuZGVmaW5lZCIsInBhcnNlSW50IiwicGFyc2VGbG9hdCIsInN1YnN0ciIsImxlbmd0aCIsInV1aWR2NCIsImMiLCJjcnlwdG8iLCJnZXRSYW5kb21WYWx1ZXMiLCJVaW50OEFycmF5IiwiY2xlYXJFcnJvcnNJbkZvcm0iLCIkZm9ybSIsInJlbW92ZUNsYXNzIiwicmVtb3ZlIiwic2V0RXJyb3JzSW5Gb3JtIiwiJHJlc0Zvcm0iLCJhcHBlbmQiLCJzYWZlUmVtb3ZlIiwiJGZpbGVfY29udGFpbmVyIiwicGFyZW50IiwiZWFjaCIsImluZGV4IiwicmVwbGFjZVdpdGgiLCJoYXNOb0Vycm9yIiwiaW5zZXJ0QWZ0ZXIiLCIkcmVzRXJyb3JGaWVsZCIsIiRlcnJvckZpZWxkIiwiYWRkQ2xhc3MiLCJqcXVlcnlJbnNlcnRBdCIsIiRjb250YWluZXIiLCIkbmV3RWxlbWVudCIsImxhc3RJbmRleCIsImNoaWxkcmVuIiwic2l6ZSIsImVxIiwiYmVmb3JlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_utils.js\n\n}");
118
118
 
119
119
  /***/ }),
120
120
 
@@ -124,7 +124,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
124
124
  \******************************************/
125
125
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
126
126
 
127
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CONTROLLER_CLASS: () => (/* binding */ CONTROLLER_CLASS),\n/* harmony export */ DATA_CONTROLLER_KEY: () => (/* binding */ DATA_CONTROLLER_KEY),\n/* harmony export */ cleanCache: () => (/* binding */ cleanCache),\n/* harmony export */ getController: () => (/* binding */ getController),\n/* harmony export */ loadFilesFromController: () => (/* binding */ loadFilesFromController),\n/* harmony export */ reconcile: () => (/* binding */ reconcile),\n/* harmony export */ refresh: () => (/* binding */ refresh),\n/* harmony export */ reloadHTMLController: () => (/* binding */ reloadHTMLController),\n/* harmony export */ reloadMethodHTML: () => (/* binding */ reloadMethodHTML),\n/* harmony export */ replaceTagElementsInContainer: () => (/* binding */ replaceTagElementsInContainer),\n/* harmony export */ runControllerFillContent: () => (/* binding */ runControllerFillContent)\n/* harmony export */ });\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\n\n/**\n * List of HTML files.\n * @type {{}}\n */\nlet htmlFiles = {};\nconst DATA_CONTROLLER_KEY = '_controller_';\nconst CONTROLLER_CLASS = '_sdc_controller_';\nfunction cleanCache() {\n htmlFiles = {};\n}\n\n/**\n * findSdcTgs Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. It collects all those\n * doms and returns a list of objects containing also the tag name the dom and the tag\n * names of the super controller\n *\n * @param {jquery} $container - jQuery container\n * @param {Array<string>} tagNameList - a string list with tag names.\n * @param {AbstractSDC} parentController - controller in surrounding\n * @return {Array} - a array of objects with all register tags found\n */\nfunction findSdcTgs($container, tagNameList, parentController) {\n if (!$container) {\n return [];\n }\n let $children = $container.children();\n let emptyList = [];\n $children.each(function (_, element) {\n let $element = $(element);\n let tagName = $element.prop('tagName').toLowerCase().split('_');\n if ($.inArray(tagName[0], tagNameList) >= 0) {\n emptyList.push({\n tag: tagName[0],\n super: tagName.splice(1) || [],\n dom: $element\n });\n } else if (tagName[0].startsWith('this.')) {\n $element.addClass(`_bind_to_update_handler sdc_uuid_${parentController._uuid}`);\n } else {\n emptyList = emptyList.concat(findSdcTgs($element, tagNameList, parentController));\n }\n });\n return emptyList;\n}\n\n/**\n * replacePlaceholderController fills the parameter of the content\n * url this function uses the tag parameter\n *\n * @param controller - controller object\n * @param url - the origin content URL\n * @param urlValues - values for the url placeholder. In same order!!\n * @returns {string} - the correct URL with prefix.\n */\nfunction replacePlaceholderController(controller, url, urlValues) {\n for (let key_idx in controller._urlParams) {\n if (controller._urlParams.hasOwnProperty(key_idx)) {\n let key = controller._urlParams[key_idx];\n let re = RegExp(\"%\\\\(\" + key + \"\\\\)\\\\w\", \"gm\");\n url = url.replace(re, \"\" + urlValues.shift());\n }\n }\n return url;\n}\n\n/**\n * loadHTMLFile loads the HTML content file from the server via ajax request.\n *\n * If the HTML file is loaded already the function takes no action.\n *\n * @param path - a content URL from the controller.\n * @param {object} args - get args.\n * @param tag - a normalized tag-name as string.\n * @param hardReload - true if the file has to be reloaded every time.\n * @returns {Promise<jQuery|Boolean>} - waits for the file to be loaded.\n */\nfunction loadHTMLFile(path, args, tag, hardReload) {\n if (!path) {\n return Promise.resolve(false);\n } else if (htmlFiles[tag]) {\n return Promise.resolve(htmlFiles[tag]);\n }\n args.VERSION = _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.VERSION;\n args._method = 'content';\n return $.get(path, args).then(function (data) {\n if (!hardReload) {\n htmlFiles[tag] = data;\n }\n return data;\n }).catch(function (err) {\n if (err.status === 301) {\n const data = err.responseJSON;\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)('_RedirectOnView', data['url-link']);\n }\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)('navLoaded', {\n 'controller_name': () => err.status\n });\n throw `<sdc-error data-code=\"${err.status}\">${err.responseText}</sdc-error>`;\n });\n}\n\n/**\n * replaceAllTagElementsInContainer replaces all registered tags by the controller.\n * In this step the life-cycle starts.\n *\n * @param {jquery} $container - given container\n * @param {AbstractSDC} parentController - parent contoller surrounded the container\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceAllTagElementsInContainer($container, parentController, process = null) {\n parentController = parentController || $container.data(DATA_CONTROLLER_KEY);\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $container, parentController, process);\n}\n\n/**\n * parseContentUrl uses the content URL prefix to marge the\n * correct URL. Also parses the url parameter\n *\n * @param {AbstractSDC} controller - controller object\n * @returns {{url: String, args: Array}} - the correct URL with prefix.\n */\nfunction parseContentUrl(controller) {\n let url = controller.contentUrl;\n if (controller && controller._urlParams.length === 0) {\n let re = /%\\(([^)]+)\\)\\w/gm;\n let matches;\n controller._urlParams = [];\n while (matches = re.exec(url)) {\n controller._urlParams.push(matches[1]);\n controller.contentReload = true;\n }\n }\n let params = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.getUrlParam)(controller, controller.$container);\n if (controller._urlParams.length) {\n url = replacePlaceholderController(controller, url, params);\n }\n controller.parsedContentUrl = url;\n return {\n url: url,\n args: params[params.length - 1]\n };\n}\n\n/**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\nfunction getController($elem) {\n if ($elem.hasClass(CONTROLLER_CLASS)) {\n return $elem.data(`${DATA_CONTROLLER_KEY}`);\n }\n return $elem.closest(`.${CONTROLLER_CLASS}`).data(`${DATA_CONTROLLER_KEY}`);\n}\n\n/**\n * loadFilesFromController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n * The content is saved as jQuery object to the controller.$content property of\n * the controller.\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction loadFilesFromController(controller) {\n let getElements = {\n args: {}\n };\n if (controller.contentUrl) {\n getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n }\n return Promise.all([loadHTMLFile(controller.contentUrl, getElements.args, controller._tagName, controller.contentReload)]).then(function (results) {\n let htmlFile = results[0];\n if (htmlFile) {\n try {\n return $(htmlFile);\n } catch {\n return $('<div></div>').append(htmlFile);\n }\n }\n return null;\n });\n}\n\n/**\n * reloadHTMLController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n *\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction reloadHTMLController(controller) {\n if (controller.contentUrl) {\n let getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n return loadHTMLFile(controller.contentUrl, getElements.args, controller._tagName, controller.contentReload);\n }\n return new Promise(resolve => {\n resolve($());\n });\n}\n\n/**\n *\n * @param {jquery} $element\n * @param {string} tagName\n * @param {Array<string>} superTagNameList\n * @param {AbstractSDC} parentController\n * @param {Object} process - Process object containing the refresh process\n * @returns {Promise}\n */\nfunction runReplaceTagElementsInContainer($element, tagName, superTagNameList, parentController, process) {\n let controller = $element.data(DATA_CONTROLLER_KEY);\n if (controller) {\n return replaceAllTagElementsInContainer($element, controller, process);\n }\n controller = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.controllerFactory)(parentController, $element, tagName, superTagNameList);\n $element.data(DATA_CONTROLLER_KEY, controller);\n $element.addClass(CONTROLLER_CLASS);\n return (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.runControlFlowFunctions)(controller, process);\n}\n\n/**\n * runControllerFillContent empties the registered tag and replaces it by the controller\n * content. It sets the CSS tags for the relation with the CSS files.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise}\n */\nfunction runControllerFillContent(controller, $html, process = null) {\n if ($html && $html.length > 0) {\n controller.$container.empty();\n controller.$container.attr(controller._tagName, '');\n for (let mixinKey in controller._mixins) {\n controller.$container.attr(controller._mixins[mixinKey]._tagName, '');\n }\n controller.$container.append($html);\n }\n return replaceAllTagElementsInContainer(controller.$container, controller, process);\n}\n\n/**\n * replaceTagElementsInContainer Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. For each registered tag it loads the content.\n * Afterwards it starts the life cycle of the controller. I the next step it starts the\n * procedure for the child elements of the controller tag.\n *\n * @param {Array<string>} tagList - list of all registered tags\n * @param {jquery} $container - jQuery container to find the tags\n * @param {AbstractSDC} parentController - controller in surrounding\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceTagElementsInContainer(tagList, $container, parentController, process) {\n return new Promise(resolve => {\n let tagDescriptionElements = findSdcTgs($container, tagList, parentController);\n let tagCount = tagDescriptionElements.length;\n if (tagCount === 0) {\n return resolve();\n }\n for (let elementIndex = 0; elementIndex < tagDescriptionElements.length; elementIndex++) {\n runReplaceTagElementsInContainer(tagDescriptionElements[elementIndex].dom, tagDescriptionElements[elementIndex].tag, tagDescriptionElements[elementIndex].super, parentController, process).then(() => {\n tagCount--;\n if (tagCount === 0) {\n return resolve();\n }\n });\n }\n });\n}\nfunction reloadMethodHTML(controller, $container, process) {\n return _reloadMethodHTML(controller, $container ?? controller.$container, process);\n}\nfunction _reloadMethodHTML(controller, $dom, process) {\n const plist = [];\n $dom.find(`._bind_to_update_handler.sdc_uuid_${controller._uuid}`).each(function () {\n const $this = $(this);\n let result = undefined;\n if ($this.hasClass(`_with_handler`)) {\n result = $this.data('handler');\n } else {\n let controller_handler = this.tagName.toLowerCase().replace(/^this./, '');\n if (controller[controller_handler]) {\n result = controller[controller_handler];\n }\n }\n if (typeof result === 'function') {\n const newData = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.prepareData)($this.data());\n result = result.bind(controller)(newData);\n }\n if (result) {\n plist.push(Promise.resolve(result).then(x => {\n let $newContent = $(`<div></div>`);\n $newContent.append(x);\n if ($this.html() === '') {\n $this.append('<div></div>');\n }\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.reconcile(controller, $newContent, $this.children(), process);\n }));\n }\n });\n return Promise.all(plist);\n}\nfunction getNodeKey(node) {\n if (node[0].nodeType === 3) {\n return `TEXT__${node[0].nodeValue}`;\n }\n const res = [node[0].tagName];\n if (node[0].nodeName === 'INPUT') {\n [['name', ''], ['type', 'text'], ['id', '']].forEach(([key, defaultValue]) => {\n const attr = node.attr(key) ?? defaultValue;\n if (attr) {\n res.push(attr);\n }\n });\n }\n return res.join('__');\n}\nfunction reconcileTree({\n $element,\n id = [],\n parent = null\n}) {\n id.push(getNodeKey($element));\n const obj = {\n $element,\n id: id.join('::'),\n depth: id.length,\n idx: 0,\n getRealParent: () => parent,\n getIdx: function () {\n this.idx = Math.max(0, (this.getRealParent()?.getIdx() ?? -1) + $element.index() + 1);\n return this.idx;\n },\n op: null,\n parent\n };\n obj.getIdx.bind(obj);\n return [obj].concat($element.contents().toArray().map(x => reconcileTree({\n $element: $(x),\n id: id.slice(),\n parent: obj\n })).flat());\n}\nfunction reconcile($virtualNode, $realNode) {\n const $old = reconcileTree({\n $element: $realNode\n });\n const $new = reconcileTree({\n $element: $virtualNode\n });\n $old.map((x, i) => x.idx = i);\n $new.map((x, i) => x.idx = i);\n const depth = Math.max(...$new.concat($old).map(x => x.depth));\n const op_steps = lcbDiff($old, $new, depth);\n let toRemove = [];\n window.MAIN = $realNode;\n window.OPS = op_steps;\n op_steps.forEach((op_step, i) => {\n const {\n op,\n $element,\n idx\n } = op_step;\n if (op.type === 'keep_counterpart') {\n let cIdx = op.counterpart.getIdx();\n if (cIdx !== idx) {\n const elemBefore = op_step.getBefore();\n if (!elemBefore) {\n op_step.getRealParent().$element.prepend(op.counterpart.$element);\n } else {\n op.counterpart.$element.insertAfter(elemBefore.$element);\n }\n }\n syncAttributes(op.counterpart.$element, $element);\n if ($element.hasClass(CONTROLLER_CLASS)) {\n $element.data(DATA_CONTROLLER_KEY).$container = op.counterpart.$element;\n $element.data(DATA_CONTROLLER_KEY, null);\n }\n toRemove.push($element);\n } else if (op.type === 'delete') {\n $element.safeRemove();\n } else if (op.type === 'insert') {\n const {\n after,\n target\n } = op_step.op;\n if (after) {\n $element.insertAfter(after.$element);\n } else if (target) {\n target.$element.prepend($element);\n }\n }\n });\n toRemove.forEach($element => $element.safeRemove());\n}\nfunction syncAttributes($real, $virtual) {\n const realAttrs = $real[0].attributes ?? [];\n const virtualAttrs = $virtual[0].attributes ?? [];\n // Remove missing attrs\n [...realAttrs].forEach(attr => {\n if (!$virtual.is(`[${attr.name}]`)) {\n $real.removeAttr(attr.name);\n }\n });\n\n // Add or update\n [...virtualAttrs].forEach(attr => {\n if (!attr.name.startsWith(`data`) && $real.attr(attr.name) !== attr.value) {\n $real.attr(attr.name, attr.value);\n }\n });\n $real.removeData();\n Object.entries($virtual.data()).forEach(([key, value]) => {\n $real.data(key, value);\n });\n}\n\n/**\n * LCB (Longest Common Branch) finds matching branches and reserves them!\n *\n * @param oldNodes\n * @param newNodes\n * @param depth\n * @returns {*|*[]}\n */\nfunction lcbDiff(oldNodes, newNodes, depth) {\n newNodes.filter(x => x.depth === depth && !x.op).forEach(newNode => {\n const oldNode = oldNodes.find(tempOldNode => {\n return !tempOldNode.op && tempOldNode.id === newNode.id;\n });\n if (oldNode) {\n const keepTreeBranch = (oldNode, newNode) => {\n oldNode.op = {\n type: 'keep',\n idx: newNode.idx\n };\n newNode.op = {\n type: 'keep_counterpart',\n counterpart: oldNode\n };\n oldNode = oldNode.parent;\n newNode = newNode.parent;\n if (!oldNode || oldNode.op || newNode?.op) {\n return;\n }\n keepTreeBranch(oldNode, newNode);\n };\n keepTreeBranch(oldNode, newNode);\n }\n });\n if (depth > 1) {\n return lcbDiff(oldNodes, newNodes, depth - 1);\n }\n oldNodes.forEach((x, i) => {\n if (!x.op) {\n const idx = (oldNodes[i - 1]?.op.idx ?? -1) + 1;\n x.op = {\n type: 'delete',\n idx\n };\n }\n });\n function getRealParent(element) {\n if (!element.parent) {\n return null;\n }\n return element.parent.op.type === 'keep_counterpart' ? element.parent.op.counterpart : element.parent;\n }\n function getBefore(element, idx) {\n const startDepth = element.depth;\n while (idx >= 1 && element.depth >= startDepth) {\n idx -= 1;\n element = newNodes[idx];\n if (element.depth === startDepth) {\n return element.op.type === 'keep_counterpart' ? element.op.counterpart : element;\n }\n }\n return null;\n }\n newNodes.forEach((x, i) => {\n x.getBefore = () => getBefore(x, i);\n x.getRealParent = () => getRealParent(x);\n if (!x.op) {\n const target = x.getRealParent();\n const type = target?.op.type === 'insert' ? 'insert_ignore' : 'insert';\n x.op = {\n type,\n target,\n after: x.getBefore()\n };\n }\n });\n const tagged = [...oldNodes, ...newNodes];\n return tagged.sort((a, b) => {\n const aVal = a.op?.idx ?? a.idx;\n const bVal = b.op?.idx ?? b.idx;\n return aVal - bVal;\n });\n}\n\n/**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise<void>}\n */\n\nfunction refresh($dom, leafController, process = null) {\n if (!leafController) {\n leafController = getController($dom);\n }\n if (!leafController) {\n return Promise.resolve();\n }\n const {\n refreshProcess,\n isRunningProcess\n } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.prepareRefreshProcess)(process, leafController);\n $dom ??= leafController.$container;\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $dom, leafController, process).then(() => {\n return reloadMethodHTML(leafController, $dom, refreshProcess).then(() => {\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n });\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUVKLENBQUMsQ0FBQztBQUNKIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY192aWV3LmpzPzI0YjUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY29udHJvbGxlckZhY3RvcnksXG4gIHByZXBhcmVSZWZyZXNoUHJvY2VzcyxcbiAgcnVuQ29udHJvbEZsb3dGdW5jdGlvbnMsXG4gIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaFxufSBmcm9tIFwiLi9zZGNfY29udHJvbGxlci5qc1wiO1xuaW1wb3J0IHtnZXRVcmxQYXJhbSwgcHJlcGFyZURhdGF9IGZyb20gXCIuL3NkY19wYXJhbXMuanNcIjtcbmltcG9ydCB7YXBwfSBmcm9tIFwiLi9zZGNfbWFpbi5qc1wiO1xuaW1wb3J0IHt0cmlnZ2VyfSBmcm9tIFwiLi9zZGNfZXZlbnRzLmpzXCI7XG5cbi8qKlxuICogTGlzdCBvZiBIVE1MIGZpbGVzLlxuICogQHR5cGUge3t9fVxuICovXG5sZXQgaHRtbEZpbGVzID0ge307XG5cbmV4cG9ydCBjb25zdCBEQVRBX0NPTlRST0xMRVJfS0VZID0gJ19jb250cm9sbGVyXyc7XG5leHBvcnQgY29uc3QgQ09OVFJPTExFUl9DTEFTUyA9ICdfc2RjX2NvbnRyb2xsZXJfJztcblxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5DYWNoZSgpIHtcbiAgaHRtbEZpbGVzID0ge307XG59XG5cbi8qKlxuICogZmluZFNkY1RncyBGaW5kcyBhbGwgcmVnaXN0ZXJlZCB0YWdzIGluIGEgY29udGFpbmVyLiBCdXQgaXQgaWdub3Jlc1xuICogcmVnaXN0ZXJlZCB0YWdzIGluIHJlZ2lzdGVyZWQgdGFncy4gSXQgY29sbGVjdHMgYWxsIHRob3NlXG4gKiBkb21zIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYWxzbyB0aGUgdGFnIG5hbWUgdGhlIGRvbSBhbmQgdGhlIHRhZ1xuICogbmFtZXMgb2YgdGhlIHN1cGVyIGNvbnRyb2xsZXJcbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGpRdWVyeSBjb250YWluZXJcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gdGFnTmFtZUxpc3QgLSBhIHN0cmluZyBsaXN0IHdpdGggdGFnIG5hbWVzLlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIGNvbnRyb2xsZXIgaW4gc3Vycm91bmRpbmdcbiAqIEByZXR1cm4ge0FycmF5fSAtIGEgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGFsbCByZWdpc3RlciB0YWdzIGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGZpbmRTZGNUZ3MoJGNvbnRhaW5lciwgdGFnTmFtZUxpc3QsIHBhcmVudENvbnRyb2xsZXIpIHtcbiAgaWYgKCEkY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGxldCAkY2hpbGRyZW4gPSAkY29udGFpbmVyLmNoaWxkcmVuKCk7XG4gIGxldCBlbXB0eUxpc3QgPSBbXTtcbiAgJGNoaWxkcmVuLmVhY2goZnVuY3Rpb24gKF8sIGVsZW1lbnQpIHtcbiAgICBsZXQgJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgIGxldCB0YWdOYW1lID0gJGVsZW1lbnQucHJvcCgndGFnTmFtZScpLnRvTG93ZXJDYXNlKCkuc3BsaXQoJ18nKTtcbiAgICBpZiAoJC5pbkFycmF5KHRhZ05hbWVbMF0sIHRhZ05hbWVMaXN0KSA+PSAwKSB7XG4gICAgICBlbXB0eUxpc3QucHVzaCh7XG4gICAgICAgIHRhZzogdGFnTmFtZVswXSxcbiAgICAgICAgc3VwZXI6IHRhZ05hbWUuc3BsaWNlKDEpIHx8IFtdLFxuICAgICAgICBkb206ICRlbGVtZW50XG4gICAgICB9KTtcblxuICAgIH0gZWxzZSBpZiAodGFnTmFtZVswXS5zdGFydHNXaXRoKCd0aGlzLicpKSB7XG4gICAgICAkZWxlbWVudC5hZGRDbGFzcyhgX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIgc2RjX3V1aWRfJHtwYXJlbnRDb250cm9sbGVyLl91dWlkfWApXG4gICAgfSBlbHNlIHtcbiAgICAgIGVtcHR5TGlzdCA9IGVtcHR5TGlzdC5jb25jYXQoZmluZFNkY1RncygkZWxlbWVudCwgdGFnTmFtZUxpc3QsIHBhcmVudENvbnRyb2xsZXIpKVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGVtcHR5TGlzdDtcbn1cblxuLyoqXG4gKiByZXBsYWNlUGxhY2Vob2xkZXJDb250cm9sbGVyIGZpbGxzIHRoZSBwYXJhbWV0ZXIgb2YgdGhlIGNvbnRlbnRcbiAqIHVybCB0aGlzIGZ1bmN0aW9uIHVzZXMgdGhlIHRhZyBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0gY29udHJvbGxlciAtIGNvbnRyb2xsZXIgb2JqZWN0XG4gKiBAcGFyYW0gdXJsIC0gdGhlIG9yaWdpbiBjb250ZW50IFVSTFxuICogQHBhcmFtIHVybFZhbHVlcyAtIHZhbHVlcyBmb3IgdGhlIHVybCBwbGFjZWhvbGRlci4gSW4gc2FtZSBvcmRlciEhXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBjb3JyZWN0IFVSTCB3aXRoIHByZWZpeC5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlcihjb250cm9sbGVyLCB1cmwsIHVybFZhbHVlcykge1xuICBmb3IgKGxldCBrZXlfaWR4IGluIGNvbnRyb2xsZXIuX3VybFBhcmFtcykge1xuICAgIGlmIChjb250cm9sbGVyLl91cmxQYXJhbXMuaGFzT3duUHJvcGVydHkoa2V5X2lkeCkpIHtcbiAgICAgIGxldCBrZXkgPSBjb250cm9sbGVyLl91cmxQYXJhbXNba2V5X2lkeF07XG4gICAgICBsZXQgcmUgPSBSZWdFeHAoXCIlXFxcXChcIiArIGtleSArIFwiXFxcXClcXFxcd1wiLCBcImdtXCIpO1xuICAgICAgdXJsID0gdXJsLnJlcGxhY2UocmUsIFwiXCIgKyB1cmxWYWx1ZXMuc2hpZnQoKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVybDtcbn1cblxuLyoqXG4gKiBsb2FkSFRNTEZpbGUgbG9hZHMgdGhlIEhUTUwgY29udGVudCBmaWxlIGZyb20gdGhlIHNlcnZlciB2aWEgYWpheCByZXF1ZXN0LlxuICpcbiAqIElmIHRoZSBIVE1MIGZpbGUgaXMgbG9hZGVkIGFscmVhZHkgdGhlIGZ1bmN0aW9uIHRha2VzIG5vIGFjdGlvbi5cbiAqXG4gKiBAcGFyYW0gcGF0aCAtIGEgY29udGVudCBVUkwgZnJvbSB0aGUgY29udHJvbGxlci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gZ2V0IGFyZ3MuXG4gKiBAcGFyYW0gdGFnIC0gYSBub3JtYWxpemVkIHRhZy1uYW1lIGFzIHN0cmluZy5cbiAqIEBwYXJhbSBoYXJkUmVsb2FkIC0gdHJ1ZSBpZiB0aGUgZmlsZSBoYXMgdG8gYmUgcmVsb2FkZWQgZXZlcnkgdGltZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGpRdWVyeXxCb29sZWFuPn0gLSB3YWl0cyBmb3IgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLlxuICovXG5mdW5jdGlvbiBsb2FkSFRNTEZpbGUocGF0aCwgYXJncywgdGFnLCBoYXJkUmVsb2FkKSB7XG4gIGlmICghcGF0aCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9IGVsc2UgaWYgKGh0bWxGaWxlc1t0YWddKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShodG1sRmlsZXNbdGFnXSlcbiAgfVxuXG4gIGFyZ3MuVkVSU0lPTiA9IGFwcC5WRVJTSU9OO1xuICBhcmdzLl9tZXRob2QgPSAnY29udGVudCc7XG5cbiAgcmV0dXJuICQuZ2V0KHBhdGgsIGFyZ3MpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZiAoIWhhcmRSZWxvYWQpIHtcbiAgICAgIGh0bWxGaWxlc1t0YWddID0gZGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIuc3RhdHVzID09PSAzMDEpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBlcnIucmVzcG9uc2VKU09OO1xuICAgICAgdHJpZ2dlcignX1JlZGlyZWN0T25WaWV3JywgZGF0YVsndXJsLWxpbmsnXSk7XG4gICAgfVxuICAgIHRyaWdnZXIoJ25hdkxvYWRlZCcsIHsnY29udHJvbGxlcl9uYW1lJzogKCkgPT4gZXJyLnN0YXR1c30pO1xuXG4gICAgdGhyb3cgYDxzZGMtZXJyb3IgZGF0YS1jb2RlPVwiJHtlcnIuc3RhdHVzfVwiPiR7ZXJyLnJlc3BvbnNlVGV4dH08L3NkYy1lcnJvcj5gO1xuICB9KTtcbn1cblxuLyoqXG4gKiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lciByZXBsYWNlcyBhbGwgcmVnaXN0ZXJlZCB0YWdzIGJ5IHRoZSBjb250cm9sbGVyLlxuICogSW4gdGhpcyBzdGVwIHRoZSBsaWZlLWN5Y2xlIHN0YXJ0cy5cbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGdpdmVuIGNvbnRhaW5lclxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIHBhcmVudCBjb250b2xsZXIgc3Vycm91bmRlZCB0aGUgY29udGFpbmVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICovXG5mdW5jdGlvbiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcigkY29udGFpbmVyLCBwYXJlbnRDb250cm9sbGVyLCBwcm9jZXNzID0gbnVsbCkge1xuICBwYXJlbnRDb250cm9sbGVyID0gcGFyZW50Q29udHJvbGxlciB8fCAkY29udGFpbmVyLmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSk7XG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihhcHAudGFnTmFtZXMsICRjb250YWluZXIsIHBhcmVudENvbnRyb2xsZXIsIHByb2Nlc3MpO1xufVxuXG4vKipcbiAqIHBhcnNlQ29udGVudFVybCB1c2VzIHRoZSBjb250ZW50IFVSTCBwcmVmaXggdG8gbWFyZ2UgdGhlXG4gKiBjb3JyZWN0IFVSTC4gQWxzbyBwYXJzZXMgdGhlIHVybCBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gY29udHJvbGxlciBvYmplY3RcbiAqIEByZXR1cm5zIHt7dXJsOiBTdHJpbmcsIGFyZ3M6IEFycmF5fX0gLSB0aGUgY29ycmVjdCBVUkwgd2l0aCBwcmVmaXguXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ29udGVudFVybChjb250cm9sbGVyKSB7XG4gIGxldCB1cmwgPSBjb250cm9sbGVyLmNvbnRlbnRVcmw7XG4gIGlmIChjb250cm9sbGVyICYmIGNvbnRyb2xsZXIuX3VybFBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICBsZXQgcmUgPSAvJVxcKChbXildKylcXClcXHcvZ207XG4gICAgbGV0IG1hdGNoZXM7XG4gICAgY29udHJvbGxlci5fdXJsUGFyYW1zID0gW107XG4gICAgd2hpbGUgKChtYXRjaGVzID0gcmUuZXhlYyh1cmwpKSkge1xuICAgICAgY29udHJvbGxlci5fdXJsUGFyYW1zLnB1c2gobWF0Y2hlc1sxXSk7XG4gICAgICBjb250cm9sbGVyLmNvbnRlbnRSZWxvYWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGxldCBwYXJhbXMgPSBnZXRVcmxQYXJhbShjb250cm9sbGVyLCBjb250cm9sbGVyLiRjb250YWluZXIpO1xuICBpZiAoY29udHJvbGxlci5fdXJsUGFyYW1zLmxlbmd0aCkge1xuICAgIHVybCA9IHJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIoY29udHJvbGxlciwgdXJsLCBwYXJhbXMpO1xuICB9XG5cbiAgY29udHJvbGxlci5wYXJzZWRDb250ZW50VXJsID0gdXJsO1xuXG4gIHJldHVybiB7dXJsOiB1cmwsIGFyZ3M6IHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV19O1xufVxuXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbVxuICogQHJldHVybiB7QWJzdHJhY3RTREN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sbGVyKCRlbGVtKSB7XG4gIGlmICgkZWxlbS5oYXNDbGFzcyhDT05UUk9MTEVSX0NMQVNTKSkge1xuICAgIHJldHVybiAkZWxlbS5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCk7XG4gIH1cbiAgcmV0dXJuICRlbGVtLmNsb3Nlc3QoYC4ke0NPTlRST0xMRVJfQ0xBU1N9YCkuZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApO1xufVxuXG4vKipcbiAqIGxvYWRGaWxlc0Zyb21Db250cm9sbGVyIGxvYWRzIHRoZSBjb250ZW50IChIVE1MKSBvZiBhXG4gKiBDb250cm9sbGVyLiBJZiB5b3UgaGF2ZSBhbiBhbHRlcm5hdGl2ZSBjb250ZW50IFVSTCBpcyByZWdpc3RlcmVkLCBmb3IgdGhpc1xuICogY29udHJvbGxlciB0aGUgb3JpZ2luIGNvbnRlbnQgVVJMIGlzIGlnbm9yZWQuXG4gKlxuICogVGhlIGNvbnRlbnQgaXMgc2F2ZWQgYXMgalF1ZXJ5IG9iamVjdCB0byB0aGUgY29udHJvbGxlci4kY29udGVudCBwcm9wZXJ0eSBvZlxuICogdGhlIGNvbnRyb2xsZXIuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGEgaW5zdGFuY2Ugb2YgYSBKYXZhU2NyaXB0IGNvbnRyb2xsZXIgb2JqZWN0LlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5Pn0gLSB0aGUgcHJvbWlzZSB3YWl0cyB0byB0aGUgZmlsZXMgYXJlIGxvYWRlZC4gaXQgcmV0dXJucyB0aGUgalF1ZXJ5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGaWxlc0Zyb21Db250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgbGV0IGdldEVsZW1lbnRzID0ge2FyZ3M6IHt9fTtcbiAgaWYgKGNvbnRyb2xsZXIuY29udGVudFVybCkge1xuICAgIGdldEVsZW1lbnRzID0gcGFyc2VDb250ZW50VXJsKGNvbnRyb2xsZXIpO1xuICAgIGNvbnRyb2xsZXIuY29udGVudFVybCA9IGdldEVsZW1lbnRzLnVybDtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgbG9hZEhUTUxGaWxlKGNvbnRyb2xsZXIuY29udGVudFVybCwgZ2V0RWxlbWVudHMuYXJncywgY29udHJvbGxlci5fdGFnTmFtZSwgY29udHJvbGxlci5jb250ZW50UmVsb2FkKVxuICBdKS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgbGV0IGh0bWxGaWxlID0gcmVzdWx0c1swXTtcbiAgICBpZiAoaHRtbEZpbGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAkKGh0bWxGaWxlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gJCgnPGRpdj48L2Rpdj4nKS5hcHBlbmQoaHRtbEZpbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9KTtcbn1cblxuLyoqXG4gKiByZWxvYWRIVE1MQ29udHJvbGxlciBsb2FkcyB0aGUgY29udGVudCAoSFRNTCkgb2YgYVxuICogQ29udHJvbGxlci4gSWYgeW91IGhhdmUgYW4gYWx0ZXJuYXRpdmUgY29udGVudCBVUkwgaXMgcmVnaXN0ZXJlZCwgZm9yIHRoaXNcbiAqIGNvbnRyb2xsZXIgdGhlIG9yaWdpbiBjb250ZW50IFVSTCBpcyBpZ25vcmVkLlxuICpcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gYSBpbnN0YW5jZSBvZiBhIEphdmFTY3JpcHQgY29udHJvbGxlciBvYmplY3QuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5Pn0gLSB0aGUgcHJvbWlzZSB3YWl0cyB0byB0aGUgZmlsZXMgYXJlIGxvYWRlZC4gaXQgcmV0dXJucyB0aGUgalF1ZXJ5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZEhUTUxDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgaWYgKGNvbnRyb2xsZXIuY29udGVudFVybCkge1xuICAgIGxldCBnZXRFbGVtZW50cyA9IHBhcnNlQ29udGVudFVybChjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLmNvbnRlbnRVcmwgPSBnZXRFbGVtZW50cy51cmw7XG4gICAgcmV0dXJuIGxvYWRIVE1MRmlsZShjb250cm9sbGVyLmNvbnRlbnRVcmwsIGdldEVsZW1lbnRzLmFyZ3MsIGNvbnRyb2xsZXIuX3RhZ05hbWUsIGNvbnRyb2xsZXIuY29udGVudFJlbG9hZCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgcmVzb2x2ZSgkKCkpO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzdXBlclRhZ05hbWVMaXN0XG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybnMge1Byb21pc2V9XG4gKi9cbmZ1bmN0aW9uIHJ1blJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKCRlbGVtZW50LCB0YWdOYW1lLCBzdXBlclRhZ05hbWVMaXN0LCBwYXJlbnRDb250cm9sbGVyLCBwcm9jZXNzKSB7XG4gIGxldCBjb250cm9sbGVyID0gJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZKTtcbiAgaWYgKGNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIoJGVsZW1lbnQsIGNvbnRyb2xsZXIsIHByb2Nlc3MpO1xuICB9XG5cbiAgY29udHJvbGxlciA9IGNvbnRyb2xsZXJGYWN0b3J5KHBhcmVudENvbnRyb2xsZXIsICRlbGVtZW50LCB0YWdOYW1lLCBzdXBlclRhZ05hbWVMaXN0KTtcbiAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZLCBjb250cm9sbGVyKTtcbiAgJGVsZW1lbnQuYWRkQ2xhc3MoQ09OVFJPTExFUl9DTEFTUyk7XG4gIHJldHVybiBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyhjb250cm9sbGVyLCBwcm9jZXNzKTtcbn1cblxuXG4vKipcbiAqIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudCBlbXB0aWVzIHRoZSByZWdpc3RlcmVkIHRhZyBhbmQgcmVwbGFjZXMgaXQgYnkgdGhlIGNvbnRyb2xsZXJcbiAqIGNvbnRlbnQuIEl0IHNldHMgdGhlIENTUyB0YWdzIGZvciB0aGUgcmVsYXRpb24gd2l0aCB0aGUgQ1NTIGZpbGVzLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGh0bWwgLSBqUXVlcnkgbG9hZGVkIGNvbnRlbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29udHJvbGxlckZpbGxDb250ZW50KGNvbnRyb2xsZXIsICRodG1sLCBwcm9jZXNzID0gbnVsbCkge1xuICBpZiAoJGh0bWwgJiYgJGh0bWwubGVuZ3RoID4gMCkge1xuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5lbXB0eSgpO1xuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5hdHRyKGNvbnRyb2xsZXIuX3RhZ05hbWUsICcnKTtcbiAgICBmb3IgKGxldCBtaXhpbktleSBpbiBjb250cm9sbGVyLl9taXhpbnMpIHtcbiAgICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5hdHRyKGNvbnRyb2xsZXIuX21peGluc1ttaXhpbktleV0uX3RhZ05hbWUsICcnKTtcbiAgICB9XG4gICAgY29udHJvbGxlci4kY29udGFpbmVyLmFwcGVuZCgkaHRtbCk7XG4gIH1cblxuICByZXR1cm4gcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIoY29udHJvbGxlci4kY29udGFpbmVyLCBjb250cm9sbGVyLCBwcm9jZXNzKTtcbn1cblxuXG4vKipcbiAqIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyIEZpbmRzIGFsbCByZWdpc3RlcmVkIHRhZ3MgaW4gYSBjb250YWluZXIuIEJ1dCBpdCBpZ25vcmVzXG4gKiByZWdpc3RlcmVkIHRhZ3MgaW4gcmVnaXN0ZXJlZCB0YWdzLiBGb3IgZWFjaCByZWdpc3RlcmVkIHRhZyBpdCBsb2FkcyB0aGUgY29udGVudC5cbiAqIEFmdGVyd2FyZHMgaXQgc3RhcnRzIHRoZSBsaWZlIGN5Y2xlIG9mIHRoZSBjb250cm9sbGVyLiBJIHRoZSBuZXh0IHN0ZXAgaXQgc3RhcnRzIHRoZVxuICogcHJvY2VkdXJlIGZvciB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIGNvbnRyb2xsZXIgdGFnLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gdGFnTGlzdCAtIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgdGFnc1xuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBqUXVlcnkgY29udGFpbmVyIHRvIGZpbmQgdGhlIHRhZ3NcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBjb250cm9sbGVyIGluIHN1cnJvdW5kaW5nXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIodGFnTGlzdCwgJGNvbnRhaW5lciwgcGFyZW50Q29udHJvbGxlciwgcHJvY2Vzcykge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblxuICAgIGxldCB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzID0gZmluZFNkY1RncygkY29udGFpbmVyLCB0YWdMaXN0LCBwYXJlbnRDb250cm9sbGVyKTtcbiAgICBsZXQgdGFnQ291bnQgPSB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzLmxlbmd0aDtcblxuICAgIGlmICh0YWdDb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBlbGVtZW50SW5kZXggPSAwOyBlbGVtZW50SW5kZXggPCB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzLmxlbmd0aDsgZWxlbWVudEluZGV4KyspIHtcbiAgICAgIHJ1blJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS5kb20sXG4gICAgICAgIHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS50YWcsXG4gICAgICAgIHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS5zdXBlcixcbiAgICAgICAgcGFyZW50Q29udHJvbGxlciwgcHJvY2VzcykudGhlbigoKSA9PiB7XG4gICAgICAgIHRhZ0NvdW50LS07XG4gICAgICAgIGlmICh0YWdDb3VudCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxvYWRNZXRob2RIVE1MKGNvbnRyb2xsZXIsICRjb250YWluZXIsIHByb2Nlc3MpIHtcbiAgcmV0dXJuIF9yZWxvYWRNZXRob2RIVE1MKGNvbnRyb2xsZXIsICRjb250YWluZXIgPz8gY29udHJvbGxlci4kY29udGFpbmVyLCBwcm9jZXNzKVxufVxuXG5mdW5jdGlvbiBfcmVsb2FkTWV0aG9kSFRNTChjb250cm9sbGVyLCAkZG9tLCBwcm9jZXNzKSB7XG4gIGNvbnN0IHBsaXN0ID0gW107XG5cbiAgJGRvbS5maW5kKGAuX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIuc2RjX3V1aWRfJHtjb250cm9sbGVyLl91dWlkfWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0ICR0aGlzID0gJCh0aGlzKTtcbiAgICBsZXQgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgIGlmICgkdGhpcy5oYXNDbGFzcyhgX3dpdGhfaGFuZGxlcmApKSB7XG4gICAgICByZXN1bHQgPSAkdGhpcy5kYXRhKCdoYW5kbGVyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBjb250cm9sbGVyX2hhbmRsZXIgPSB0aGlzLnRhZ05hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9edGhpcy4vLCAnJyk7XG4gICAgICBpZiAoY29udHJvbGxlcltjb250cm9sbGVyX2hhbmRsZXJdKSB7XG4gICAgICAgIHJlc3VsdCA9IGNvbnRyb2xsZXJbY29udHJvbGxlcl9oYW5kbGVyXTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gcHJlcGFyZURhdGEoJHRoaXMuZGF0YSgpKTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5iaW5kKGNvbnRyb2xsZXIpKG5ld0RhdGEpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBwbGlzdC5wdXNoKFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4oKHgpID0+IHtcbiAgICAgICAgbGV0ICRuZXdDb250ZW50ID0gJChgPGRpdj48L2Rpdj5gKTtcbiAgICAgICAgJG5ld0NvbnRlbnQuYXBwZW5kKHgpO1xuXG4gICAgICAgIGlmICgkdGhpcy5odG1sKCkgPT09ICcnKSB7XG4gICAgICAgICAgJHRoaXMuYXBwZW5kKCc8ZGl2PjwvZGl2PicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcC5yZWNvbmNpbGUoY29udHJvbGxlciwgJG5ld0NvbnRlbnQsICR0aGlzLmNoaWxkcmVuKCksIHByb2Nlc3MpO1xuICAgICAgfSkpO1xuICAgIH1cblxuICB9KTtcblxuICByZXR1cm4gUHJvbWlzZS5hbGwocGxpc3QpO1xufVxuXG5cbmZ1bmN0aW9uIGdldE5vZGVLZXkobm9kZSkge1xuICBpZiAobm9kZVswXS5ub2RlVHlwZSA9PT0gMykge1xuICAgIHJldHVybiBgVEVYVF9fJHtub2RlWzBdLm5vZGVWYWx1ZX1gO1xuICB9XG4gIGNvbnN0IHJlcyA9IFtub2RlWzBdLnRhZ05hbWVdO1xuICBpZiAobm9kZVswXS5ub2RlTmFtZSA9PT0gJ0lOUFVUJykge1xuICAgIFtbJ25hbWUnLCAnJ10sIFsndHlwZScsICd0ZXh0J10sIFsnaWQnLCAnJ11dLmZvckVhY2goKFtrZXksIGRlZmF1bHRWYWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IGF0dHIgPSBub2RlLmF0dHIoa2V5KSA/PyBkZWZhdWx0VmFsdWU7XG4gICAgICBpZiAoYXR0cikge1xuICAgICAgICByZXMucHVzaChhdHRyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzLmpvaW4oJ19fJyk7XG59XG5cbmZ1bmN0aW9uIHJlY29uY2lsZVRyZWUoeyRlbGVtZW50LCBpZCA9IFtdLCBwYXJlbnQgPSBudWxsfSkge1xuICBpZC5wdXNoKGdldE5vZGVLZXkoJGVsZW1lbnQpKTtcbiAgY29uc3Qgb2JqID0ge1xuICAgICRlbGVtZW50LFxuICAgIGlkOiBpZC5qb2luKCc6OicpLFxuICAgIGRlcHRoOiBpZC5sZW5ndGgsXG4gICAgaWR4OiAwLFxuICAgIGdldFJlYWxQYXJlbnQ6ICgpID0+IHBhcmVudCxcbiAgICBnZXRJZHg6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuaWR4ID0gTWF0aC5tYXgoMCwgKHRoaXMuZ2V0UmVhbFBhcmVudCgpPy5nZXRJZHgoKSA/PyAtMSkgKyAkZWxlbWVudC5pbmRleCgpICsgMSk7XG4gICAgICByZXR1cm4gdGhpcy5pZHg7XG4gICAgfSxcbiAgICBvcDogbnVsbCxcbiAgICBwYXJlbnRcbiAgfTtcbiAgb2JqLmdldElkeC5iaW5kKG9iaik7XG4gIHJldHVybiBbb2JqXS5jb25jYXQoJGVsZW1lbnQuY29udGVudHMoKS50b0FycmF5KCkubWFwKCh4KSA9PiByZWNvbmNpbGVUcmVlKHtcbiAgICAkZWxlbWVudDogJCh4KSxcbiAgICBpZDogaWQuc2xpY2UoKSxcbiAgICBwYXJlbnQ6IG9ialxuICB9KSkuZmxhdCgpKTtcblxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvbmNpbGUoJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUpIHtcblxuICBjb25zdCAkb2xkID0gcmVjb25jaWxlVHJlZSh7JGVsZW1lbnQ6ICRyZWFsTm9kZX0pO1xuICBjb25zdCAkbmV3ID0gcmVjb25jaWxlVHJlZSh7JGVsZW1lbnQ6ICR2aXJ0dWFsTm9kZX0pO1xuICAkb2xkLm1hcCgoeCwgaSkgPT4geC5pZHggPSBpKTtcbiAgJG5ldy5tYXAoKHgsIGkpID0+IHguaWR4ID0gaSk7XG4gIGNvbnN0IGRlcHRoID0gTWF0aC5tYXgoLi4uJG5ldy5jb25jYXQoJG9sZCkubWFwKHggPT4geC5kZXB0aCkpO1xuICBjb25zdCBvcF9zdGVwcyA9IGxjYkRpZmYoJG9sZCwgJG5ldywgZGVwdGgpO1xuICBsZXQgdG9SZW1vdmUgPSBbXTtcbiAgd2luZG93Lk1BSU4gPSAkcmVhbE5vZGU7XG4gIHdpbmRvdy5PUFMgPSBvcF9zdGVwcztcblxuICBvcF9zdGVwcy5mb3JFYWNoKChvcF9zdGVwLCBpKSA9PiB7XG4gICAgICBjb25zdCB7b3AsICRlbGVtZW50LCBpZHh9ID0gb3Bfc3RlcDtcblxuICAgICAgaWYgKG9wLnR5cGUgPT09ICdrZWVwX2NvdW50ZXJwYXJ0Jykge1xuICAgICAgICBsZXQgY0lkeCA9IG9wLmNvdW50ZXJwYXJ0LmdldElkeCgpO1xuICAgICAgICBpZiAoY0lkeCAhPT0gaWR4KSB7XG4gICAgICAgICAgY29uc3QgZWxlbUJlZm9yZSA9IG9wX3N0ZXAuZ2V0QmVmb3JlKCk7XG4gICAgICAgICAgaWYgKCFlbGVtQmVmb3JlKSB7XG4gICAgICAgICAgICBvcF9zdGVwLmdldFJlYWxQYXJlbnQoKS4kZWxlbWVudC5wcmVwZW5kKG9wLmNvdW50ZXJwYXJ0LiRlbGVtZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3AuY291bnRlcnBhcnQuJGVsZW1lbnQuaW5zZXJ0QWZ0ZXIoZWxlbUJlZm9yZS4kZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3luY0F0dHJpYnV0ZXMob3AuY291bnRlcnBhcnQuJGVsZW1lbnQsICRlbGVtZW50KTtcbiAgICAgICAgaWYgKCRlbGVtZW50Lmhhc0NsYXNzKENPTlRST0xMRVJfQ0xBU1MpKSB7XG4gICAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZKS4kY29udGFpbmVyID0gb3AuY291bnRlcnBhcnQuJGVsZW1lbnQ7XG4gICAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZLCBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRvUmVtb3ZlLnB1c2goJGVsZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmIChvcC50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgICAkZWxlbWVudC5zYWZlUmVtb3ZlKCk7XG4gICAgICB9IGVsc2UgaWYgKG9wLnR5cGUgPT09ICdpbnNlcnQnKSB7XG4gICAgICAgIGNvbnN0IHthZnRlciwgdGFyZ2V0fSA9IG9wX3N0ZXAub3A7XG4gICAgICAgIGlmIChhZnRlcikge1xuICAgICAgICAgICRlbGVtZW50Lmluc2VydEFmdGVyKGFmdGVyLiRlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICB0YXJnZXQuJGVsZW1lbnQucHJlcGVuZCgkZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH1cbiAgKVxuICA7XG5cbiAgdG9SZW1vdmUuZm9yRWFjaCgoJGVsZW1lbnQpID0+ICRlbGVtZW50LnNhZmVSZW1vdmUoKSk7XG59XG5cbmZ1bmN0aW9uIHN5bmNBdHRyaWJ1dGVzKCRyZWFsLCAkdmlydHVhbCkge1xuICBjb25zdCByZWFsQXR0cnMgPSAkcmVhbFswXS5hdHRyaWJ1dGVzID8/IFtdO1xuICBjb25zdCB2aXJ0dWFsQXR0cnMgPSAkdmlydHVhbFswXS5hdHRyaWJ1dGVzID8/IFtdO1xuICAvLyBSZW1vdmUgbWlzc2luZyBhdHRyc1xuICBbLi4ucmVhbEF0dHJzXS5mb3JFYWNoKGF0dHIgPT4ge1xuICAgIGlmICghJHZpcnR1YWwuaXMoYFske2F0dHIubmFtZX1dYCkpIHtcbiAgICAgICRyZWFsLnJlbW92ZUF0dHIoYXR0ci5uYW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFkZCBvciB1cGRhdGVcbiAgWy4uLnZpcnR1YWxBdHRyc10uZm9yRWFjaChhdHRyID0+IHtcbiAgICBpZiAoIWF0dHIubmFtZS5zdGFydHNXaXRoKGBkYXRhYCkgJiYgJHJlYWwuYXR0cihhdHRyLm5hbWUpICE9PSBhdHRyLnZhbHVlKSB7XG4gICAgICAkcmVhbC5hdHRyKGF0dHIubmFtZSwgYXR0ci52YWx1ZSk7XG4gICAgfVxuICB9KTtcblxuICAkcmVhbC5yZW1vdmVEYXRhKCk7XG4gIE9iamVjdC5lbnRyaWVzKCR2aXJ0dWFsLmRhdGEoKSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgJHJlYWwuZGF0YShrZXksIHZhbHVlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogTENCIChMb25nZXN0IENvbW1vbiBCcmFuY2gpIGZpbmRzIG1hdGNoaW5nIGJyYW5jaGVzIGFuZCByZXNlcnZlcyB0aGVtIVxuICpcbiAqIEBwYXJhbSBvbGROb2Rlc1xuICogQHBhcmFtIG5ld05vZGVzXG4gKiBAcGFyYW0gZGVwdGhcbiAqIEByZXR1cm5zIHsqfCpbXX1cbiAqL1xuZnVuY3Rpb24gbGNiRGlmZihvbGROb2RlcywgbmV3Tm9kZXMsIGRlcHRoKSB7XG4gIG5ld05vZGVzLmZpbHRlcih4ID0+IHguZGVwdGggPT09IGRlcHRoICYmICF4Lm9wKS5mb3JFYWNoKChuZXdOb2RlKSA9PiB7XG4gICAgY29uc3Qgb2xkTm9kZSA9IG9sZE5vZGVzLmZpbmQoKHRlbXBPbGROb2RlKSA9PiB7XG4gICAgICByZXR1cm4gIXRlbXBPbGROb2RlLm9wICYmIHRlbXBPbGROb2RlLmlkID09PSBuZXdOb2RlLmlkO1xuICAgIH0pO1xuXG4gICAgaWYgKG9sZE5vZGUpIHtcbiAgICAgIGNvbnN0IGtlZXBUcmVlQnJhbmNoID0gKG9sZE5vZGUsIG5ld05vZGUpID0+IHtcbiAgICAgICAgb2xkTm9kZS5vcCA9IHt0eXBlOiAna2VlcCcsIGlkeDogbmV3Tm9kZS5pZHh9O1xuICAgICAgICBuZXdOb2RlLm9wID0ge3R5cGU6ICdrZWVwX2NvdW50ZXJwYXJ0JywgY291bnRlcnBhcnQ6IG9sZE5vZGV9O1xuICAgICAgICBvbGROb2RlID0gb2xkTm9kZS5wYXJlbnQ7XG4gICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudDtcbiAgICAgICAgaWYgKCFvbGROb2RlIHx8IG9sZE5vZGUub3AgfHwgbmV3Tm9kZT8ub3ApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAga2VlcFRyZWVCcmFuY2gob2xkTm9kZSwgbmV3Tm9kZSk7XG5cbiAgICAgIH1cbiAgICAgIGtlZXBUcmVlQnJhbmNoKG9sZE5vZGUsIG5ld05vZGUpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChkZXB0aCA+IDEpIHtcbiAgICByZXR1cm4gbGNiRGlmZihvbGROb2RlcywgbmV3Tm9kZXMsIGRlcHRoIC0gMSk7XG4gIH1cblxuICBvbGROb2Rlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgaWYgKCF4Lm9wKSB7XG4gICAgICBjb25zdCBpZHggPSAob2xkTm9kZXNbaSAtIDFdPy5vcC5pZHggPz8gLTEpICsgMTtcbiAgICAgIHgub3AgPSB7dHlwZTogJ2RlbGV0ZScsIGlkeH1cbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFJlYWxQYXJlbnQoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudC5wYXJlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudC5wYXJlbnQub3AudHlwZSA9PT0gJ2tlZXBfY291bnRlcnBhcnQnID8gZWxlbWVudC5wYXJlbnQub3AuY291bnRlcnBhcnQgOiBlbGVtZW50LnBhcmVudDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJlZm9yZShlbGVtZW50LCBpZHgpIHtcbiAgICBjb25zdCBzdGFydERlcHRoID0gZWxlbWVudC5kZXB0aDtcbiAgICB3aGlsZSAoaWR4ID49IDEgJiYgZWxlbWVudC5kZXB0aCA+PSBzdGFydERlcHRoKSB7XG4gICAgICBpZHggLT0gMTtcbiAgICAgIGVsZW1lbnQgPSBuZXdOb2Rlc1tpZHhdO1xuICAgICAgaWYgKGVsZW1lbnQuZGVwdGggPT09IHN0YXJ0RGVwdGgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub3AudHlwZSA9PT0gJ2tlZXBfY291bnRlcnBhcnQnID8gZWxlbWVudC5vcC5jb3VudGVycGFydCA6IGVsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcblxuICB9XG5cbiAgbmV3Tm9kZXMuZm9yRWFjaCgoeCwgaSkgPT4ge1xuICAgIHguZ2V0QmVmb3JlID0gKCkgPT4gZ2V0QmVmb3JlKHgsIGkpO1xuICAgIHguZ2V0UmVhbFBhcmVudCA9ICgpID0+IGdldFJlYWxQYXJlbnQoeCk7XG5cbiAgICBpZiAoIXgub3ApIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHguZ2V0UmVhbFBhcmVudCgpO1xuICAgICAgY29uc3QgdHlwZSA9IHRhcmdldD8ub3AudHlwZSA9PT0gJ2luc2VydCcgPyAnaW5zZXJ0X2lnbm9yZScgOiAnaW5zZXJ0JztcbiAgICAgIHgub3AgPSB7dHlwZSwgdGFyZ2V0LCBhZnRlcjogeC5nZXRCZWZvcmUoKX1cbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHRhZ2dlZCA9IFtcbiAgICAuLi5vbGROb2RlcyxcbiAgICAuLi5uZXdOb2RlcyxcbiAgXTtcblxuXG4gIHJldHVybiB0YWdnZWQuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGFWYWwgPSBhLm9wPy5pZHggPz8gYS5pZHg7XG4gICAgY29uc3QgYlZhbCA9IGIub3A/LmlkeCA/PyBiLmlkeDtcblxuICAgIHJldHVybiBhVmFsIC0gYlZhbDtcbiAgfSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZG9tXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBsZWFmQ29udHJvbGxlclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZnJlc2goJGRvbSwgbGVhZkNvbnRyb2xsZXIsIHByb2Nlc3MgPSBudWxsKSB7XG4gIGlmICghbGVhZkNvbnRyb2xsZXIpIHtcbiAgICBsZWFmQ29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoJGRvbSk7XG4gIH1cblxuICBpZiAoIWxlYWZDb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgY29uc3Qge3JlZnJlc2hQcm9jZXNzLCBpc1J1bm5pbmdQcm9jZXNzfSA9IHByZXBhcmVSZWZyZXNoUHJvY2Vzcyhwcm9jZXNzLCBsZWFmQ29udHJvbGxlcik7XG5cbiAgJGRvbSA/Pz0gbGVhZkNvbnRyb2xsZXIuJGNvbnRhaW5lcjtcblxuICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoYXBwLnRhZ05hbWVzLCAkZG9tLCBsZWFmQ29udHJvbGxlciwgcHJvY2VzcykudGhlbigoKSA9PiB7XG4gICAgcmV0dXJuIHJlbG9hZE1ldGhvZEhUTUwobGVhZkNvbnRyb2xsZXIsICRkb20sIHJlZnJlc2hQcm9jZXNzKS50aGVuKCgpID0+IHtcbiAgICAgIGlmICghaXNSdW5uaW5nUHJvY2Vzcykge1xuICAgICAgICB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2gocmVmcmVzaFByb2Nlc3MpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH0pO1xufSJdLCJuYW1lcyI6WyJjb250cm9sbGVyRmFjdG9yeSIsInByZXBhcmVSZWZyZXNoUHJvY2VzcyIsInJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zIiwidXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoIiwiZ2V0VXJsUGFyYW0iLCJwcmVwYXJlRGF0YSIsImFwcCIsInRyaWdnZXIiLCJodG1sRmlsZXMiLCJEQVRBX0NPTlRST0xMRVJfS0VZIiwiQ09OVFJPTExFUl9DTEFTUyIsImNsZWFuQ2FjaGUiLCJmaW5kU2RjVGdzIiwiJGNvbnRhaW5lciIsInRhZ05hbWVMaXN0IiwicGFyZW50Q29udHJvbGxlciIsIiRjaGlsZHJlbiIsImNoaWxkcmVuIiwiZW1wdHlMaXN0IiwiZWFjaCIsIl8iLCJlbGVtZW50IiwiJGVsZW1lbnQiLCIkIiwidGFnTmFtZSIsInByb3AiLCJ0b0xvd2VyQ2FzZSIsInNwbGl0IiwiaW5BcnJheSIsInB1c2giLCJ0YWciLCJzdXBlciIsInNwbGljZSIsImRvbSIsInN0YXJ0c1dpdGgiLCJhZGRDbGFzcyIsIl91dWlkIiwiY29uY2F0IiwicmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlciIsImNvbnRyb2xsZXIiLCJ1cmwiLCJ1cmxWYWx1ZXMiLCJrZXlfaWR4IiwiX3VybFBhcmFtcyIsImhhc093blByb3BlcnR5Iiwia2V5IiwicmUiLCJSZWdFeHAiLCJyZXBsYWNlIiwic2hpZnQiLCJsb2FkSFRNTEZpbGUiLCJwYXRoIiwiYXJncyIsImhhcmRSZWxvYWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIlZFUlNJT04iLCJfbWV0aG9kIiwiZ2V0IiwidGhlbiIsImRhdGEiLCJjYXRjaCIsImVyciIsInN0YXR1cyIsInJlc3BvbnNlSlNPTiIsImNvbnRyb2xsZXJfbmFtZSIsInJlc3BvbnNlVGV4dCIsInJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyIiwicHJvY2VzcyIsInJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyIiwidGFnTmFtZXMiLCJwYXJzZUNvbnRlbnRVcmwiLCJjb250ZW50VXJsIiwibGVuZ3RoIiwibWF0Y2hlcyIsImV4ZWMiLCJjb250ZW50UmVsb2FkIiwicGFyYW1zIiwicGFyc2VkQ29udGVudFVybCIsImdldENvbnRyb2xsZXIiLCIkZWxlbSIsImhhc0NsYXNzIiwiY2xvc2VzdCIsImxvYWRGaWxlc0Zyb21Db250cm9sbGVyIiwiZ2V0RWxlbWVudHMiLCJhbGwiLCJfdGFnTmFtZSIsInJlc3VsdHMiLCJodG1sRmlsZSIsImFwcGVuZCIsInJlbG9hZEhUTUxDb250cm9sbGVyIiwicnVuUmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIiLCJzdXBlclRhZ05hbWVMaXN0IiwicnVuQ29udHJvbGxlckZpbGxDb250ZW50IiwiJGh0bWwiLCJlbXB0eSIsImF0dHIiLCJtaXhpbktleSIsIl9taXhpbnMiLCJ0YWdMaXN0IiwidGFnRGVzY3JpcHRpb25FbGVtZW50cyIsInRhZ0NvdW50IiwiZWxlbWVudEluZGV4IiwicmVsb2FkTWV0aG9kSFRNTCIsIl9yZWxvYWRNZXRob2RIVE1MIiwiJGRvbSIsInBsaXN0IiwiZmluZCIsIiR0aGlzIiwicmVzdWx0IiwidW5kZWZpbmVkIiwiY29udHJvbGxlcl9oYW5kbGVyIiwibmV3RGF0YSIsImJpbmQiLCJ4IiwiJG5ld0NvbnRlbnQiLCJodG1sIiwicmVjb25jaWxlIiwiZ2V0Tm9kZUtleSIsIm5vZGUiLCJub2RlVHlwZSIsIm5vZGVWYWx1ZSIsInJlcyIsIm5vZGVOYW1lIiwiZm9yRWFjaCIsImRlZmF1bHRWYWx1ZSIsImpvaW4iLCJyZWNvbmNpbGVUcmVlIiwiaWQiLCJwYXJlbnQiLCJvYmoiLCJkZXB0aCIsImlkeCIsImdldFJlYWxQYXJlbnQiLCJnZXRJZHgiLCJNYXRoIiwibWF4IiwiaW5kZXgiLCJvcCIsImNvbnRlbnRzIiwidG9BcnJheSIsIm1hcCIsInNsaWNlIiwiZmxhdCIsIiR2aXJ0dWFsTm9kZSIsIiRyZWFsTm9kZSIsIiRvbGQiLCIkbmV3IiwiaSIsIm9wX3N0ZXBzIiwibGNiRGlmZiIsInRvUmVtb3ZlIiwid2luZG93IiwiTUFJTiIsIk9QUyIsIm9wX3N0ZXAiLCJ0eXBlIiwiY0lkeCIsImNvdW50ZXJwYXJ0IiwiZWxlbUJlZm9yZSIsImdldEJlZm9yZSIsInByZXBlbmQiLCJpbnNlcnRBZnRlciIsInN5bmNBdHRyaWJ1dGVzIiwic2FmZVJlbW92ZSIsImFmdGVyIiwidGFyZ2V0IiwiJHJlYWwiLCIkdmlydHVhbCIsInJlYWxBdHRycyIsImF0dHJpYnV0ZXMiLCJ2aXJ0dWFsQXR0cnMiLCJpcyIsIm5hbWUiLCJyZW1vdmVBdHRyIiwidmFsdWUiLCJyZW1vdmVEYXRhIiwiT2JqZWN0IiwiZW50cmllcyIsIm9sZE5vZGVzIiwibmV3Tm9kZXMiLCJmaWx0ZXIiLCJuZXdOb2RlIiwib2xkTm9kZSIsInRlbXBPbGROb2RlIiwia2VlcFRyZWVCcmFuY2giLCJzdGFydERlcHRoIiwidGFnZ2VkIiwic29ydCIsImEiLCJiIiwiYVZhbCIsImJWYWwiLCJyZWZyZXNoIiwibGVhZkNvbnRyb2xsZXIiLCJyZWZyZXNoUHJvY2VzcyIsImlzUnVubmluZ1Byb2Nlc3MiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_view.js\n\n}");
127
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CONTROLLER_CLASS: () => (/* binding */ CONTROLLER_CLASS),\n/* harmony export */ DATA_CONTROLLER_KEY: () => (/* binding */ DATA_CONTROLLER_KEY),\n/* harmony export */ cleanCache: () => (/* binding */ cleanCache),\n/* harmony export */ getController: () => (/* binding */ getController),\n/* harmony export */ loadFilesFromController: () => (/* binding */ loadFilesFromController),\n/* harmony export */ reconcile: () => (/* binding */ reconcile),\n/* harmony export */ refresh: () => (/* binding */ refresh),\n/* harmony export */ reloadHTMLController: () => (/* binding */ reloadHTMLController),\n/* harmony export */ reloadMethodHTML: () => (/* binding */ reloadMethodHTML),\n/* harmony export */ replaceTagElementsInContainer: () => (/* binding */ replaceTagElementsInContainer),\n/* harmony export */ runControllerFillContent: () => (/* binding */ runControllerFillContent)\n/* harmony export */ });\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\n\n/**\n * List of HTML files.\n * @type {{}}\n */\nlet htmlFiles = {};\nconst DATA_CONTROLLER_KEY = '_controller_';\nconst CONTROLLER_CLASS = '_sdc_controller_';\nfunction cleanCache() {\n htmlFiles = {};\n}\n\n/**\n * findSdcTgs Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. It collects all those\n * doms and returns a list of objects containing also the tag name the dom and the tag\n * names of the super controller\n *\n * @param {jquery} $container - jQuery container\n * @param {Array<string>} tagNameList - a string list with tag names.\n * @param {AbstractSDC} parentController - controller in surrounding\n * @return {Array} - a array of objects with all register tags found\n */\nfunction findSdcTgs($container, tagNameList, parentController) {\n if (!$container) {\n return [];\n }\n let $children = $container.children();\n let emptyList = [];\n $children.each(function (_, element) {\n let $element = $(element);\n let tagName = $element.prop('tagName').toLowerCase().split('_');\n if ($.inArray(tagName[0], tagNameList) >= 0) {\n emptyList.push({\n tag: tagName[0],\n super: tagName.splice(1) || [],\n dom: $element\n });\n } else if (tagName[0].startsWith('this.')) {\n $element.addClass(`_bind_to_update_handler sdc_uuid_${parentController._uuid}`);\n } else {\n emptyList = emptyList.concat(findSdcTgs($element, tagNameList, parentController));\n }\n });\n return emptyList;\n}\n\n/**\n * replacePlaceholderController fills the parameter of the content\n * url this function uses the tag parameter\n *\n * @param controller - controller object\n * @param url - the origin content URL\n * @param urlValues - values for the url placeholder. In same order!!\n * @returns {string} - the correct URL with prefix.\n */\nfunction replacePlaceholderController(controller, url, urlValues) {\n for (let key_idx in controller._urlParams) {\n if (controller._urlParams.hasOwnProperty(key_idx)) {\n let key = controller._urlParams[key_idx];\n let re = RegExp(\"%\\\\(\" + key + \"\\\\)\\\\w\", \"gm\");\n url = url.replace(re, \"\" + urlValues.shift());\n }\n }\n return url;\n}\n\n/**\n * loadHTMLFile loads the HTML content file from the server via ajax request.\n *\n * If the HTML file is loaded already the function takes no action.\n *\n * @param {AbstractSDC} controller - a content URL from the controller.\n * @param {object} args - get args.\n * @returns {Promise<jQuery|Boolean>} - waits for the file to be loaded.\n */\nfunction loadHTMLFile(controller, args) {\n const {\n contentUrl,\n _tagName,\n contentReload\n } = controller;\n if (!contentUrl) {\n return Promise.resolve(false);\n } else if (htmlFiles[_tagName]) {\n return Promise.resolve(htmlFiles[_tagName]);\n }\n args.VERSION = _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.VERSION;\n args._method = 'content';\n return $.get(contentUrl, args).then(function (data) {\n if (!contentReload) {\n htmlFiles[_tagName] = data;\n }\n return data;\n }).catch(function (err) {\n if (err.status === 301) {\n const data = err.responseJSON;\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)('_RedirectOnView', data['url-link']);\n }\n if (typeof controller.confirmPageLoaded === 'function') {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)('navLoaded', {\n 'controller_name': () => err.status\n });\n }\n throw `<sdc-error data-code=\"${err.status}\">${err.responseText}</sdc-error>`;\n });\n}\n\n/**\n * replaceAllTagElementsInContainer replaces all registered tags by the controller.\n * In this step the life-cycle starts.\n *\n * @param {jquery} $container - given container\n * @param {AbstractSDC} parentController - parent contoller surrounded the container\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceAllTagElementsInContainer($container, parentController, process = null) {\n parentController = parentController || $container.data(DATA_CONTROLLER_KEY);\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $container, parentController, process);\n}\n\n/**\n * parseContentUrl uses the content URL prefix to marge the\n * correct URL. Also parses the url parameter\n *\n * @param {AbstractSDC} controller - controller object\n * @returns {{url: String, args: Array}} - the correct URL with prefix.\n */\nfunction parseContentUrl(controller) {\n let url = controller.contentUrl;\n if (controller && controller._urlParams.length === 0) {\n let re = /%\\(([^)]+)\\)\\w/gm;\n let matches;\n controller._urlParams = [];\n while (matches = re.exec(url)) {\n controller._urlParams.push(matches[1]);\n controller.contentReload = true;\n }\n }\n let params = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.getUrlParam)(controller, controller.$container);\n if (controller._urlParams.length) {\n url = replacePlaceholderController(controller, url, params);\n }\n controller.parsedContentUrl = url;\n return {\n url: url,\n args: params[params.length - 1]\n };\n}\n\n/**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\nfunction getController($elem) {\n if ($elem.hasClass(CONTROLLER_CLASS)) {\n return $elem.data(`${DATA_CONTROLLER_KEY}`);\n }\n return $elem.closest(`.${CONTROLLER_CLASS}`).data(`${DATA_CONTROLLER_KEY}`);\n}\n\n/**\n * loadFilesFromController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n * The content is saved as jQuery object to the controller.$content property of\n * the controller.\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction loadFilesFromController(controller) {\n let getElements = {\n args: {}\n };\n if (controller.contentUrl) {\n getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n }\n return Promise.all([loadHTMLFile(controller, getElements.args)]).then(function (results) {\n let htmlFile = results[0];\n if (htmlFile) {\n try {\n return $(htmlFile);\n } catch {\n return $('<div></div>').append(htmlFile);\n }\n }\n return null;\n });\n}\n\n/**\n * reloadHTMLController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n *\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction reloadHTMLController(controller) {\n if (controller.contentUrl) {\n let getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n return loadHTMLFile(controller, getElements.args);\n }\n return new Promise(resolve => {\n resolve($());\n });\n}\n\n/**\n *\n * @param {jquery} $element\n * @param {string} tagName\n * @param {Array<string>} superTagNameList\n * @param {AbstractSDC} parentController\n * @param {Object} process - Process object containing the refresh process\n * @returns {Promise}\n */\nfunction runReplaceTagElementsInContainer($element, tagName, superTagNameList, parentController, process) {\n let controller = $element.data(DATA_CONTROLLER_KEY);\n if (controller) {\n return replaceAllTagElementsInContainer($element, controller, process);\n }\n controller = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.controllerFactory)(parentController, $element, tagName, superTagNameList);\n $element.data(DATA_CONTROLLER_KEY, controller);\n $element.addClass(CONTROLLER_CLASS);\n return (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.runControlFlowFunctions)(controller, process);\n}\n\n/**\n * runControllerFillContent empties the registered tag and replaces it by the controller\n * content. It sets the CSS tags for the relation with the CSS files.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise}\n */\nfunction runControllerFillContent(controller, $html, process = null) {\n if ($html && $html.length > 0) {\n controller.$container.empty();\n controller.$container.attr(controller._tagName, '');\n for (let mixinKey in controller._mixins) {\n controller.$container.attr(controller._mixins[mixinKey]._tagName, '');\n }\n controller.$container.append($html);\n }\n return replaceAllTagElementsInContainer(controller.$container, controller, process);\n}\n\n/**\n * replaceTagElementsInContainer Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. For each registered tag it loads the content.\n * Afterwards it starts the life cycle of the controller. I the next step it starts the\n * procedure for the child elements of the controller tag.\n *\n * @param {Array<string>} tagList - list of all registered tags\n * @param {jquery} $container - jQuery container to find the tags\n * @param {AbstractSDC} parentController - controller in surrounding\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceTagElementsInContainer(tagList, $container, parentController, process) {\n return new Promise(resolve => {\n let tagDescriptionElements = findSdcTgs($container, tagList, parentController);\n let tagCount = tagDescriptionElements.length;\n if (tagCount === 0) {\n return resolve();\n }\n for (let elementIndex = 0; elementIndex < tagDescriptionElements.length; elementIndex++) {\n runReplaceTagElementsInContainer(tagDescriptionElements[elementIndex].dom, tagDescriptionElements[elementIndex].tag, tagDescriptionElements[elementIndex].super, parentController, process).then(() => {\n tagCount--;\n if (tagCount === 0) {\n return resolve();\n }\n });\n }\n });\n}\nfunction reloadMethodHTML(controller, $container, process) {\n return _reloadMethodHTML(controller, $container ?? controller.$container, process);\n}\nfunction _reloadMethodHTML(controller, $dom, process) {\n const plist = [];\n $dom.find(`._bind_to_update_handler.sdc_uuid_${controller._uuid}`).each(function () {\n const $this = $(this);\n let result = undefined;\n if ($this.hasClass(`_with_handler`)) {\n result = $this.data('handler');\n } else {\n let controller_handler = this.tagName.toLowerCase().replace(/^this./, '');\n if (controller[controller_handler]) {\n result = controller[controller_handler];\n }\n }\n if (typeof result === 'function') {\n const newData = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.prepareData)($this.data());\n result = result.bind(controller)(newData);\n }\n if (result) {\n plist.push(Promise.resolve(result).then(x => {\n let $newContent = $(`<div></div>`);\n $newContent.append(x);\n if ($this.html() === '') {\n $this.append('<div></div>');\n }\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.reconcile(controller, $newContent, $this.children(), process);\n }));\n }\n });\n return Promise.all(plist);\n}\nfunction getNodeKey(node) {\n if (node[0].nodeType === 3) {\n return `TEXT__${node[0].nodeValue}`;\n }\n const res = [node[0].tagName];\n if (node[0].nodeName === 'INPUT') {\n [['name', ''], ['type', 'text'], ['id', '']].forEach(([key, defaultValue]) => {\n const attr = node.attr(key) ?? defaultValue;\n if (attr) {\n res.push(attr);\n }\n });\n }\n return res.join('__');\n}\nfunction reconcileTree({\n $element,\n id = [],\n parent = null\n}) {\n id.push(getNodeKey($element));\n const obj = {\n $element,\n id: id.join('::'),\n depth: id.length,\n idx: 0,\n getRealParent: () => parent,\n getIdx: function () {\n this.idx = Math.max(0, (this.getRealParent()?.getIdx() ?? -1) + $element.index() + 1);\n return this.idx;\n },\n op: null,\n parent\n };\n obj.getIdx.bind(obj);\n return [obj].concat($element.contents().toArray().map(x => reconcileTree({\n $element: $(x),\n id: id.slice(),\n parent: obj\n })).flat());\n}\nfunction reconcile($virtualNode, $realNode) {\n const $old = reconcileTree({\n $element: $realNode\n });\n const $new = reconcileTree({\n $element: $virtualNode\n });\n $old.map((x, i) => x.idx = i);\n $new.map((x, i) => x.idx = i);\n const depth = Math.max(...$new.concat($old).map(x => x.depth));\n const op_steps = lcbDiff($old, $new, depth);\n let toRemove = [];\n window.MAIN = $realNode;\n window.OPS = op_steps;\n op_steps.forEach((op_step, i) => {\n const {\n op,\n $element,\n idx\n } = op_step;\n if (op.type === 'keep_counterpart') {\n let cIdx = op.counterpart.getIdx();\n if (cIdx !== idx) {\n const elemBefore = op_step.getBefore();\n if (!elemBefore) {\n op_step.getRealParent().$element.prepend(op.counterpart.$element);\n } else {\n op.counterpart.$element.insertAfter(elemBefore.$element);\n }\n }\n syncAttributes(op.counterpart.$element, $element);\n if ($element.hasClass(CONTROLLER_CLASS)) {\n $element.data(DATA_CONTROLLER_KEY).$container = op.counterpart.$element;\n $element.data(DATA_CONTROLLER_KEY, null);\n }\n toRemove.push($element);\n } else if (op.type === 'delete') {\n $element.safeRemove();\n } else if (op.type === 'insert') {\n const {\n after,\n target\n } = op_step.op;\n if (after) {\n $element.insertAfter(after.$element);\n } else if (target) {\n target.$element.prepend($element);\n }\n }\n });\n toRemove.forEach($element => $element.safeRemove());\n}\nfunction syncAttributes($real, $virtual) {\n const realAttrs = $real[0].attributes ?? [];\n const virtualAttrs = $virtual[0].attributes ?? [];\n // Remove missing attrs\n [...realAttrs].forEach(attr => {\n if (!$virtual.is(`[${attr.name}]`)) {\n $real.removeAttr(attr.name);\n }\n });\n\n // Add or update\n [...virtualAttrs].forEach(attr => {\n if (!attr.name.startsWith(`data`) && $real.attr(attr.name) !== attr.value) {\n $real.attr(attr.name, attr.value);\n }\n });\n $real.removeData();\n Object.entries($virtual.data()).forEach(([key, value]) => {\n $real.data(key, value);\n });\n}\n\n/**\n * LCB (Longest Common Branch) finds matching branches and reserves them!\n *\n * @param oldNodes\n * @param newNodes\n * @param depth\n * @returns {*|*[]}\n */\nfunction lcbDiff(oldNodes, newNodes, depth) {\n newNodes.filter(x => x.depth === depth && !x.op).forEach(newNode => {\n const oldNode = oldNodes.find(tempOldNode => {\n return !tempOldNode.op && tempOldNode.id === newNode.id;\n });\n if (oldNode) {\n const keepTreeBranch = (oldNode, newNode) => {\n oldNode.op = {\n type: 'keep',\n idx: newNode.idx\n };\n newNode.op = {\n type: 'keep_counterpart',\n counterpart: oldNode\n };\n oldNode = oldNode.parent;\n newNode = newNode.parent;\n if (!oldNode || oldNode.op || newNode?.op) {\n return;\n }\n keepTreeBranch(oldNode, newNode);\n };\n keepTreeBranch(oldNode, newNode);\n }\n });\n if (depth > 1) {\n return lcbDiff(oldNodes, newNodes, depth - 1);\n }\n oldNodes.forEach((x, i) => {\n if (!x.op) {\n const idx = (oldNodes[i - 1]?.op.idx ?? -1) + 1;\n x.op = {\n type: 'delete',\n idx\n };\n }\n });\n function getRealParent(element) {\n if (!element.parent) {\n return null;\n }\n return element.parent.op.type === 'keep_counterpart' ? element.parent.op.counterpart : element.parent;\n }\n function getBefore(element, idx) {\n const startDepth = element.depth;\n while (idx >= 1 && element.depth >= startDepth) {\n idx -= 1;\n element = newNodes[idx];\n if (element.depth === startDepth) {\n return element.op.type === 'keep_counterpart' ? element.op.counterpart : element;\n }\n }\n return null;\n }\n newNodes.forEach((x, i) => {\n x.getBefore = () => getBefore(x, i);\n x.getRealParent = () => getRealParent(x);\n if (!x.op) {\n const target = x.getRealParent();\n const type = target?.op.type === 'insert' ? 'insert_ignore' : 'insert';\n x.op = {\n type,\n target,\n after: x.getBefore()\n };\n }\n });\n const tagged = [...oldNodes, ...newNodes];\n return tagged.sort((a, b) => {\n const aVal = a.op?.idx ?? a.idx;\n const bVal = b.op?.idx ?? b.idx;\n return aVal - bVal;\n });\n}\n\n/**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise<void>}\n */\n\nfunction refresh($dom, leafController, process = null) {\n if (!leafController) {\n leafController = getController($dom);\n }\n if (!leafController) {\n return Promise.resolve();\n }\n const {\n refreshProcess,\n isRunningProcess\n } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.prepareRefreshProcess)(process, leafController);\n $dom ??= leafController.$container;\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $dom, leafController, process).then(() => {\n return reloadMethodHTML(leafController, $dom, refreshProcess).then(() => {\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n });\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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azovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdmlldy5qcz8yNGI1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNvbnRyb2xsZXJGYWN0b3J5LFxuICBwcmVwYXJlUmVmcmVzaFByb2Nlc3MsXG4gIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zLFxuICB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2hcbn0gZnJvbSBcIi4vc2RjX2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB7Z2V0VXJsUGFyYW0sIHByZXBhcmVEYXRhfSBmcm9tIFwiLi9zZGNfcGFyYW1zLmpzXCI7XG5pbXBvcnQge2FwcH0gZnJvbSBcIi4vc2RjX21haW4uanNcIjtcbmltcG9ydCB7dHJpZ2dlcn0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuXG4vKipcbiAqIExpc3Qgb2YgSFRNTCBmaWxlcy5cbiAqIEB0eXBlIHt7fX1cbiAqL1xubGV0IGh0bWxGaWxlcyA9IHt9O1xuXG5leHBvcnQgY29uc3QgREFUQV9DT05UUk9MTEVSX0tFWSA9ICdfY29udHJvbGxlcl8nO1xuZXhwb3J0IGNvbnN0IENPTlRST0xMRVJfQ0xBU1MgPSAnX3NkY19jb250cm9sbGVyXyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuQ2FjaGUoKSB7XG4gIGh0bWxGaWxlcyA9IHt9O1xufVxuXG4vKipcbiAqIGZpbmRTZGNUZ3MgRmluZHMgYWxsIHJlZ2lzdGVyZWQgdGFncyBpbiBhIGNvbnRhaW5lci4gQnV0IGl0IGlnbm9yZXNcbiAqIHJlZ2lzdGVyZWQgdGFncyBpbiByZWdpc3RlcmVkIHRhZ3MuIEl0IGNvbGxlY3RzIGFsbCB0aG9zZVxuICogZG9tcyBhbmQgcmV0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cyBjb250YWluaW5nIGFsc28gdGhlIHRhZyBuYW1lIHRoZSBkb20gYW5kIHRoZSB0YWdcbiAqIG5hbWVzIG9mIHRoZSBzdXBlciBjb250cm9sbGVyXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBqUXVlcnkgY29udGFpbmVyXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHRhZ05hbWVMaXN0IC0gYSBzdHJpbmcgbGlzdCB3aXRoIHRhZyBuYW1lcy5cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBjb250cm9sbGVyIGluIHN1cnJvdW5kaW5nXG4gKiBAcmV0dXJuIHtBcnJheX0gLSBhIGFycmF5IG9mIG9iamVjdHMgd2l0aCBhbGwgcmVnaXN0ZXIgdGFncyBmb3VuZFxuICovXG5mdW5jdGlvbiBmaW5kU2RjVGdzKCRjb250YWluZXIsIHRhZ05hbWVMaXN0LCBwYXJlbnRDb250cm9sbGVyKSB7XG4gIGlmICghJGNvbnRhaW5lcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBsZXQgJGNoaWxkcmVuID0gJGNvbnRhaW5lci5jaGlsZHJlbigpO1xuICBsZXQgZW1wdHlMaXN0ID0gW107XG4gICRjaGlsZHJlbi5lYWNoKGZ1bmN0aW9uIChfLCBlbGVtZW50KSB7XG4gICAgbGV0ICRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICBsZXQgdGFnTmFtZSA9ICRlbGVtZW50LnByb3AoJ3RhZ05hbWUnKS50b0xvd2VyQ2FzZSgpLnNwbGl0KCdfJyk7XG4gICAgaWYgKCQuaW5BcnJheSh0YWdOYW1lWzBdLCB0YWdOYW1lTGlzdCkgPj0gMCkge1xuICAgICAgZW1wdHlMaXN0LnB1c2goe1xuICAgICAgICB0YWc6IHRhZ05hbWVbMF0sXG4gICAgICAgIHN1cGVyOiB0YWdOYW1lLnNwbGljZSgxKSB8fCBbXSxcbiAgICAgICAgZG9tOiAkZWxlbWVudFxuICAgICAgfSk7XG5cbiAgICB9IGVsc2UgaWYgKHRhZ05hbWVbMF0uc3RhcnRzV2l0aCgndGhpcy4nKSkge1xuICAgICAgJGVsZW1lbnQuYWRkQ2xhc3MoYF9iaW5kX3RvX3VwZGF0ZV9oYW5kbGVyIHNkY191dWlkXyR7cGFyZW50Q29udHJvbGxlci5fdXVpZH1gKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbXB0eUxpc3QgPSBlbXB0eUxpc3QuY29uY2F0KGZpbmRTZGNUZ3MoJGVsZW1lbnQsIHRhZ05hbWVMaXN0LCBwYXJlbnRDb250cm9sbGVyKSlcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBlbXB0eUxpc3Q7XG59XG5cbi8qKlxuICogcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlciBmaWxscyB0aGUgcGFyYW1ldGVyIG9mIHRoZSBjb250ZW50XG4gKiB1cmwgdGhpcyBmdW5jdGlvbiB1c2VzIHRoZSB0YWcgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIGNvbnRyb2xsZXIgLSBjb250cm9sbGVyIG9iamVjdFxuICogQHBhcmFtIHVybCAtIHRoZSBvcmlnaW4gY29udGVudCBVUkxcbiAqIEBwYXJhbSB1cmxWYWx1ZXMgLSB2YWx1ZXMgZm9yIHRoZSB1cmwgcGxhY2Vob2xkZXIuIEluIHNhbWUgb3JkZXIhIVxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgY29ycmVjdCBVUkwgd2l0aCBwcmVmaXguXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIoY29udHJvbGxlciwgdXJsLCB1cmxWYWx1ZXMpIHtcbiAgZm9yIChsZXQga2V5X2lkeCBpbiBjb250cm9sbGVyLl91cmxQYXJhbXMpIHtcbiAgICBpZiAoY29udHJvbGxlci5fdXJsUGFyYW1zLmhhc093blByb3BlcnR5KGtleV9pZHgpKSB7XG4gICAgICBsZXQga2V5ID0gY29udHJvbGxlci5fdXJsUGFyYW1zW2tleV9pZHhdO1xuICAgICAgbGV0IHJlID0gUmVnRXhwKFwiJVxcXFwoXCIgKyBrZXkgKyBcIlxcXFwpXFxcXHdcIiwgXCJnbVwiKTtcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKHJlLCBcIlwiICsgdXJsVmFsdWVzLnNoaWZ0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cmw7XG59XG5cbi8qKlxuICogbG9hZEhUTUxGaWxlIGxvYWRzIHRoZSBIVE1MIGNvbnRlbnQgZmlsZSBmcm9tIHRoZSBzZXJ2ZXIgdmlhIGFqYXggcmVxdWVzdC5cbiAqXG4gKiBJZiB0aGUgSFRNTCBmaWxlIGlzIGxvYWRlZCBhbHJlYWR5IHRoZSBmdW5jdGlvbiB0YWtlcyBubyBhY3Rpb24uXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGEgY29udGVudCBVUkwgZnJvbSB0aGUgY29udHJvbGxlci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gZ2V0IGFyZ3MuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxqUXVlcnl8Qm9vbGVhbj59IC0gd2FpdHMgZm9yIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC5cbiAqL1xuZnVuY3Rpb24gbG9hZEhUTUxGaWxlKGNvbnRyb2xsZXIsIGFyZ3MpIHtcbiAgY29uc3Qge2NvbnRlbnRVcmwsIF90YWdOYW1lLCBjb250ZW50UmVsb2FkfSA9IGNvbnRyb2xsZXJcbiAgaWYgKCFjb250ZW50VXJsKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gIH0gZWxzZSBpZiAoaHRtbEZpbGVzW190YWdOYW1lXSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaHRtbEZpbGVzW190YWdOYW1lXSlcbiAgfVxuXG4gIGFyZ3MuVkVSU0lPTiA9IGFwcC5WRVJTSU9OO1xuICBhcmdzLl9tZXRob2QgPSAnY29udGVudCc7XG5cbiAgcmV0dXJuICQuZ2V0KGNvbnRlbnRVcmwsIGFyZ3MpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZiAoIWNvbnRlbnRSZWxvYWQpIHtcbiAgICAgIGh0bWxGaWxlc1tfdGFnTmFtZV0gPSBkYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVyci5zdGF0dXMgPT09IDMwMSkge1xuICAgICAgY29uc3QgZGF0YSA9IGVyci5yZXNwb25zZUpTT047XG4gICAgICB0cmlnZ2VyKCdfUmVkaXJlY3RPblZpZXcnLCBkYXRhWyd1cmwtbGluayddKTtcbiAgICB9XG4gICAgaWYodHlwZW9mIGNvbnRyb2xsZXIuY29uZmlybVBhZ2VMb2FkZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyaWdnZXIoJ25hdkxvYWRlZCcsIHsnY29udHJvbGxlcl9uYW1lJzogKCkgPT4gZXJyLnN0YXR1c30pO1xuICAgIH1cblxuICAgIHRocm93IGA8c2RjLWVycm9yIGRhdGEtY29kZT1cIiR7ZXJyLnN0YXR1c31cIj4ke2Vyci5yZXNwb25zZVRleHR9PC9zZGMtZXJyb3I+YDtcbiAgfSk7XG59XG5cbi8qKlxuICogcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIgcmVwbGFjZXMgYWxsIHJlZ2lzdGVyZWQgdGFncyBieSB0aGUgY29udHJvbGxlci5cbiAqIEluIHRoaXMgc3RlcCB0aGUgbGlmZS1jeWNsZSBzdGFydHMuXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBnaXZlbiBjb250YWluZXJcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBwYXJlbnQgY29udG9sbGVyIHN1cnJvdW5kZWQgdGhlIGNvbnRhaW5lclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIoJGNvbnRhaW5lciwgcGFyZW50Q29udHJvbGxlciwgcHJvY2VzcyA9IG51bGwpIHtcbiAgcGFyZW50Q29udHJvbGxlciA9IHBhcmVudENvbnRyb2xsZXIgfHwgJGNvbnRhaW5lci5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpO1xuICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoYXBwLnRhZ05hbWVzLCAkY29udGFpbmVyLCBwYXJlbnRDb250cm9sbGVyLCBwcm9jZXNzKTtcbn1cblxuLyoqXG4gKiBwYXJzZUNvbnRlbnRVcmwgdXNlcyB0aGUgY29udGVudCBVUkwgcHJlZml4IHRvIG1hcmdlIHRoZVxuICogY29ycmVjdCBVUkwuIEFsc28gcGFyc2VzIHRoZSB1cmwgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGNvbnRyb2xsZXIgb2JqZWN0XG4gKiBAcmV0dXJucyB7e3VybDogU3RyaW5nLCBhcmdzOiBBcnJheX19IC0gdGhlIGNvcnJlY3QgVVJMIHdpdGggcHJlZml4LlxuICovXG5mdW5jdGlvbiBwYXJzZUNvbnRlbnRVcmwoY29udHJvbGxlcikge1xuICBsZXQgdXJsID0gY29udHJvbGxlci5jb250ZW50VXJsO1xuICBpZiAoY29udHJvbGxlciAmJiBjb250cm9sbGVyLl91cmxQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgbGV0IHJlID0gLyVcXCgoW14pXSspXFwpXFx3L2dtO1xuICAgIGxldCBtYXRjaGVzO1xuICAgIGNvbnRyb2xsZXIuX3VybFBhcmFtcyA9IFtdO1xuICAgIHdoaWxlICgobWF0Y2hlcyA9IHJlLmV4ZWModXJsKSkpIHtcbiAgICAgIGNvbnRyb2xsZXIuX3VybFBhcmFtcy5wdXNoKG1hdGNoZXNbMV0pO1xuICAgICAgY29udHJvbGxlci5jb250ZW50UmVsb2FkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBsZXQgcGFyYW1zID0gZ2V0VXJsUGFyYW0oY29udHJvbGxlciwgY29udHJvbGxlci4kY29udGFpbmVyKTtcbiAgaWYgKGNvbnRyb2xsZXIuX3VybFBhcmFtcy5sZW5ndGgpIHtcbiAgICB1cmwgPSByZXBsYWNlUGxhY2Vob2xkZXJDb250cm9sbGVyKGNvbnRyb2xsZXIsIHVybCwgcGFyYW1zKTtcbiAgfVxuXG4gIGNvbnRyb2xsZXIucGFyc2VkQ29udGVudFVybCA9IHVybDtcblxuICByZXR1cm4ge3VybDogdXJsLCBhcmdzOiBwYXJhbXNbcGFyYW1zLmxlbmd0aCAtIDFdfTtcbn1cblxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGVsZW1cbiAqIEByZXR1cm4ge0Fic3RyYWN0U0RDfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udHJvbGxlcigkZWxlbSkge1xuICBpZiAoJGVsZW0uaGFzQ2xhc3MoQ09OVFJPTExFUl9DTEFTUykpIHtcbiAgICByZXR1cm4gJGVsZW0uZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApO1xuICB9XG4gIHJldHVybiAkZWxlbS5jbG9zZXN0KGAuJHtDT05UUk9MTEVSX0NMQVNTfWApLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKTtcbn1cblxuLyoqXG4gKiBsb2FkRmlsZXNGcm9tQ29udHJvbGxlciBsb2FkcyB0aGUgY29udGVudCAoSFRNTCkgb2YgYVxuICogQ29udHJvbGxlci4gSWYgeW91IGhhdmUgYW4gYWx0ZXJuYXRpdmUgY29udGVudCBVUkwgaXMgcmVnaXN0ZXJlZCwgZm9yIHRoaXNcbiAqIGNvbnRyb2xsZXIgdGhlIG9yaWdpbiBjb250ZW50IFVSTCBpcyBpZ25vcmVkLlxuICpcbiAqIFRoZSBjb250ZW50IGlzIHNhdmVkIGFzIGpRdWVyeSBvYmplY3QgdG8gdGhlIGNvbnRyb2xsZXIuJGNvbnRlbnQgcHJvcGVydHkgb2ZcbiAqIHRoZSBjb250cm9sbGVyLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBhIGluc3RhbmNlIG9mIGEgSmF2YVNjcmlwdCBjb250cm9sbGVyIG9iamVjdC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGpRdWVyeT59IC0gdGhlIHByb21pc2Ugd2FpdHMgdG8gdGhlIGZpbGVzIGFyZSBsb2FkZWQuIGl0IHJldHVybnMgdGhlIGpRdWVyeSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmlsZXNGcm9tQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gIGxldCBnZXRFbGVtZW50cyA9IHthcmdzOiB7fX07XG4gIGlmIChjb250cm9sbGVyLmNvbnRlbnRVcmwpIHtcbiAgICBnZXRFbGVtZW50cyA9IHBhcnNlQ29udGVudFVybChjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLmNvbnRlbnRVcmwgPSBnZXRFbGVtZW50cy51cmw7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgIGxvYWRIVE1MRmlsZShjb250cm9sbGVyLCBnZXRFbGVtZW50cy5hcmdzKVxuICBdKS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgbGV0IGh0bWxGaWxlID0gcmVzdWx0c1swXTtcbiAgICBpZiAoaHRtbEZpbGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAkKGh0bWxGaWxlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gJCgnPGRpdj48L2Rpdj4nKS5hcHBlbmQoaHRtbEZpbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9KTtcbn1cblxuLyoqXG4gKiByZWxvYWRIVE1MQ29udHJvbGxlciBsb2FkcyB0aGUgY29udGVudCAoSFRNTCkgb2YgYVxuICogQ29udHJvbGxlci4gSWYgeW91IGhhdmUgYW4gYWx0ZXJuYXRpdmUgY29udGVudCBVUkwgaXMgcmVnaXN0ZXJlZCwgZm9yIHRoaXNcbiAqIGNvbnRyb2xsZXIgdGhlIG9yaWdpbiBjb250ZW50IFVSTCBpcyBpZ25vcmVkLlxuICpcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gYSBpbnN0YW5jZSBvZiBhIEphdmFTY3JpcHQgY29udHJvbGxlciBvYmplY3QuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5Pn0gLSB0aGUgcHJvbWlzZSB3YWl0cyB0byB0aGUgZmlsZXMgYXJlIGxvYWRlZC4gaXQgcmV0dXJucyB0aGUgalF1ZXJ5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZEhUTUxDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgaWYgKGNvbnRyb2xsZXIuY29udGVudFVybCkge1xuICAgIGxldCBnZXRFbGVtZW50cyA9IHBhcnNlQ29udGVudFVybChjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLmNvbnRlbnRVcmwgPSBnZXRFbGVtZW50cy51cmw7XG4gICAgcmV0dXJuIGxvYWRIVE1MRmlsZShjb250cm9sbGVyLCBnZXRFbGVtZW50cy5hcmdzKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICByZXNvbHZlKCQoKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHN1cGVyVGFnTmFtZUxpc3RcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqL1xuZnVuY3Rpb24gcnVuUmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoJGVsZW1lbnQsIHRhZ05hbWUsIHN1cGVyVGFnTmFtZUxpc3QsIHBhcmVudENvbnRyb2xsZXIsIHByb2Nlc3MpIHtcbiAgbGV0IGNvbnRyb2xsZXIgPSAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpO1xuICBpZiAoY29udHJvbGxlcikge1xuICAgIHJldHVybiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcigkZWxlbWVudCwgY29udHJvbGxlciwgcHJvY2Vzcyk7XG4gIH1cblxuICBjb250cm9sbGVyID0gY29udHJvbGxlckZhY3RvcnkocGFyZW50Q29udHJvbGxlciwgJGVsZW1lbnQsIHRhZ05hbWUsIHN1cGVyVGFnTmFtZUxpc3QpO1xuICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVksIGNvbnRyb2xsZXIpO1xuICAkZWxlbWVudC5hZGRDbGFzcyhDT05UUk9MTEVSX0NMQVNTKTtcbiAgcmV0dXJuIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zKGNvbnRyb2xsZXIsIHByb2Nlc3MpO1xufVxuXG5cbi8qKlxuICogcnVuQ29udHJvbGxlckZpbGxDb250ZW50IGVtcHRpZXMgdGhlIHJlZ2lzdGVyZWQgdGFnIGFuZCByZXBsYWNlcyBpdCBieSB0aGUgY29udHJvbGxlclxuICogY29udGVudC4gSXQgc2V0cyB0aGUgQ1NTIHRhZ3MgZm9yIHRoZSByZWxhdGlvbiB3aXRoIHRoZSBDU1MgZmlsZXMuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkaHRtbCAtIGpRdWVyeSBsb2FkZWQgY29udGVudFxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Db250cm9sbGVyRmlsbENvbnRlbnQoY29udHJvbGxlciwgJGh0bWwsIHByb2Nlc3MgPSBudWxsKSB7XG4gIGlmICgkaHRtbCAmJiAkaHRtbC5sZW5ndGggPiAwKSB7XG4gICAgY29udHJvbGxlci4kY29udGFpbmVyLmVtcHR5KCk7XG4gICAgY29udHJvbGxlci4kY29udGFpbmVyLmF0dHIoY29udHJvbGxlci5fdGFnTmFtZSwgJycpO1xuICAgIGZvciAobGV0IG1peGluS2V5IGluIGNvbnRyb2xsZXIuX21peGlucykge1xuICAgICAgY29udHJvbGxlci4kY29udGFpbmVyLmF0dHIoY29udHJvbGxlci5fbWl4aW5zW21peGluS2V5XS5fdGFnTmFtZSwgJycpO1xuICAgIH1cbiAgICBjb250cm9sbGVyLiRjb250YWluZXIuYXBwZW5kKCRodG1sKTtcbiAgfVxuXG4gIHJldHVybiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcihjb250cm9sbGVyLiRjb250YWluZXIsIGNvbnRyb2xsZXIsIHByb2Nlc3MpO1xufVxuXG5cbi8qKlxuICogcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIgRmluZHMgYWxsIHJlZ2lzdGVyZWQgdGFncyBpbiBhIGNvbnRhaW5lci4gQnV0IGl0IGlnbm9yZXNcbiAqIHJlZ2lzdGVyZWQgdGFncyBpbiByZWdpc3RlcmVkIHRhZ3MuIEZvciBlYWNoIHJlZ2lzdGVyZWQgdGFnIGl0IGxvYWRzIHRoZSBjb250ZW50LlxuICogQWZ0ZXJ3YXJkcyBpdCBzdGFydHMgdGhlIGxpZmUgY3ljbGUgb2YgdGhlIGNvbnRyb2xsZXIuIEkgdGhlIG5leHQgc3RlcCBpdCBzdGFydHMgdGhlXG4gKiBwcm9jZWR1cmUgZm9yIHRoZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgY29udHJvbGxlciB0YWcuXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSB0YWdMaXN0IC0gbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCB0YWdzXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGpRdWVyeSBjb250YWluZXIgdG8gZmluZCB0aGUgdGFnc1xuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIGNvbnRyb2xsZXIgaW4gc3Vycm91bmRpbmdcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcih0YWdMaXN0LCAkY29udGFpbmVyLCBwYXJlbnRDb250cm9sbGVyLCBwcm9jZXNzKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG4gICAgbGV0IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMgPSBmaW5kU2RjVGdzKCRjb250YWluZXIsIHRhZ0xpc3QsIHBhcmVudENvbnRyb2xsZXIpO1xuICAgIGxldCB0YWdDb3VudCA9IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMubGVuZ3RoO1xuXG4gICAgaWYgKHRhZ0NvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGVsZW1lbnRJbmRleCA9IDA7IGVsZW1lbnRJbmRleCA8IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMubGVuZ3RoOyBlbGVtZW50SW5kZXgrKykge1xuICAgICAgcnVuUmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIodGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLmRvbSxcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnRhZyxcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnN1cGVyLFxuICAgICAgICBwYXJlbnRDb250cm9sbGVyLCBwcm9jZXNzKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGFnQ291bnQtLTtcbiAgICAgICAgaWYgKHRhZ0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlciwgJGNvbnRhaW5lciwgcHJvY2Vzcykge1xuICByZXR1cm4gX3JlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlciwgJGNvbnRhaW5lciA/PyBjb250cm9sbGVyLiRjb250YWluZXIsIHByb2Nlc3MpXG59XG5cbmZ1bmN0aW9uIF9yZWxvYWRNZXRob2RIVE1MKGNvbnRyb2xsZXIsICRkb20sIHByb2Nlc3MpIHtcbiAgY29uc3QgcGxpc3QgPSBbXTtcblxuICAkZG9tLmZpbmQoYC5fYmluZF90b191cGRhdGVfaGFuZGxlci5zZGNfdXVpZF8ke2NvbnRyb2xsZXIuX3V1aWR9YCkuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgJHRoaXMgPSAkKHRoaXMpO1xuICAgIGxldCByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCR0aGlzLmhhc0NsYXNzKGBfd2l0aF9oYW5kbGVyYCkpIHtcbiAgICAgIHJlc3VsdCA9ICR0aGlzLmRhdGEoJ2hhbmRsZXInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGNvbnRyb2xsZXJfaGFuZGxlciA9IHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL150aGlzLi8sICcnKTtcbiAgICAgIGlmIChjb250cm9sbGVyW2NvbnRyb2xsZXJfaGFuZGxlcl0pIHtcbiAgICAgICAgcmVzdWx0ID0gY29udHJvbGxlcltjb250cm9sbGVyX2hhbmRsZXJdO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IG5ld0RhdGEgPSBwcmVwYXJlRGF0YSgkdGhpcy5kYXRhKCkpO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmJpbmQoY29udHJvbGxlcikobmV3RGF0YSk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHBsaXN0LnB1c2goUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbigoeCkgPT4ge1xuICAgICAgICBsZXQgJG5ld0NvbnRlbnQgPSAkKGA8ZGl2PjwvZGl2PmApO1xuICAgICAgICAkbmV3Q29udGVudC5hcHBlbmQoeCk7XG5cbiAgICAgICAgaWYgKCR0aGlzLmh0bWwoKSA9PT0gJycpIHtcbiAgICAgICAgICAkdGhpcy5hcHBlbmQoJzxkaXY+PC9kaXY+Jyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXBwLnJlY29uY2lsZShjb250cm9sbGVyLCAkbmV3Q29udGVudCwgJHRoaXMuY2hpbGRyZW4oKSwgcHJvY2Vzcyk7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gIH0pO1xuXG4gIHJldHVybiBQcm9taXNlLmFsbChwbGlzdCk7XG59XG5cblxuZnVuY3Rpb24gZ2V0Tm9kZUtleShub2RlKSB7XG4gIGlmIChub2RlWzBdLm5vZGVUeXBlID09PSAzKSB7XG4gICAgcmV0dXJuIGBURVhUX18ke25vZGVbMF0ubm9kZVZhbHVlfWA7XG4gIH1cbiAgY29uc3QgcmVzID0gW25vZGVbMF0udGFnTmFtZV07XG4gIGlmIChub2RlWzBdLm5vZGVOYW1lID09PSAnSU5QVVQnKSB7XG4gICAgW1snbmFtZScsICcnXSwgWyd0eXBlJywgJ3RleHQnXSwgWydpZCcsICcnXV0uZm9yRWFjaCgoW2tleSwgZGVmYXVsdFZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgYXR0ciA9IG5vZGUuYXR0cihrZXkpID8/IGRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChhdHRyKSB7XG4gICAgICAgIHJlcy5wdXNoKGF0dHIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXMuam9pbignX18nKTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlVHJlZSh7JGVsZW1lbnQsIGlkID0gW10sIHBhcmVudCA9IG51bGx9KSB7XG4gIGlkLnB1c2goZ2V0Tm9kZUtleSgkZWxlbWVudCkpO1xuICBjb25zdCBvYmogPSB7XG4gICAgJGVsZW1lbnQsXG4gICAgaWQ6IGlkLmpvaW4oJzo6JyksXG4gICAgZGVwdGg6IGlkLmxlbmd0aCxcbiAgICBpZHg6IDAsXG4gICAgZ2V0UmVhbFBhcmVudDogKCkgPT4gcGFyZW50LFxuICAgIGdldElkeDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5pZHggPSBNYXRoLm1heCgwLCAodGhpcy5nZXRSZWFsUGFyZW50KCk/LmdldElkeCgpID8/IC0xKSArICRlbGVtZW50LmluZGV4KCkgKyAxKTtcbiAgICAgIHJldHVybiB0aGlzLmlkeDtcbiAgICB9LFxuICAgIG9wOiBudWxsLFxuICAgIHBhcmVudFxuICB9O1xuICBvYmouZ2V0SWR4LmJpbmQob2JqKTtcbiAgcmV0dXJuIFtvYmpdLmNvbmNhdCgkZWxlbWVudC5jb250ZW50cygpLnRvQXJyYXkoKS5tYXAoKHgpID0+IHJlY29uY2lsZVRyZWUoe1xuICAgICRlbGVtZW50OiAkKHgpLFxuICAgIGlkOiBpZC5zbGljZSgpLFxuICAgIHBhcmVudDogb2JqXG4gIH0pKS5mbGF0KCkpO1xuXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY29uY2lsZSgkdmlydHVhbE5vZGUsICRyZWFsTm9kZSkge1xuXG4gIGNvbnN0ICRvbGQgPSByZWNvbmNpbGVUcmVlKHskZWxlbWVudDogJHJlYWxOb2RlfSk7XG4gIGNvbnN0ICRuZXcgPSByZWNvbmNpbGVUcmVlKHskZWxlbWVudDogJHZpcnR1YWxOb2RlfSk7XG4gICRvbGQubWFwKCh4LCBpKSA9PiB4LmlkeCA9IGkpO1xuICAkbmV3Lm1hcCgoeCwgaSkgPT4geC5pZHggPSBpKTtcbiAgY29uc3QgZGVwdGggPSBNYXRoLm1heCguLi4kbmV3LmNvbmNhdCgkb2xkKS5tYXAoeCA9PiB4LmRlcHRoKSk7XG4gIGNvbnN0IG9wX3N0ZXBzID0gbGNiRGlmZigkb2xkLCAkbmV3LCBkZXB0aCk7XG4gIGxldCB0b1JlbW92ZSA9IFtdO1xuICB3aW5kb3cuTUFJTiA9ICRyZWFsTm9kZTtcbiAgd2luZG93Lk9QUyA9IG9wX3N0ZXBzO1xuXG4gIG9wX3N0ZXBzLmZvckVhY2goKG9wX3N0ZXAsIGkpID0+IHtcbiAgICAgIGNvbnN0IHtvcCwgJGVsZW1lbnQsIGlkeH0gPSBvcF9zdGVwO1xuXG4gICAgICBpZiAob3AudHlwZSA9PT0gJ2tlZXBfY291bnRlcnBhcnQnKSB7XG4gICAgICAgIGxldCBjSWR4ID0gb3AuY291bnRlcnBhcnQuZ2V0SWR4KCk7XG4gICAgICAgIGlmIChjSWR4ICE9PSBpZHgpIHtcbiAgICAgICAgICBjb25zdCBlbGVtQmVmb3JlID0gb3Bfc3RlcC5nZXRCZWZvcmUoKTtcbiAgICAgICAgICBpZiAoIWVsZW1CZWZvcmUpIHtcbiAgICAgICAgICAgIG9wX3N0ZXAuZ2V0UmVhbFBhcmVudCgpLiRlbGVtZW50LnByZXBlbmQob3AuY291bnRlcnBhcnQuJGVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcC5jb3VudGVycGFydC4kZWxlbWVudC5pbnNlcnRBZnRlcihlbGVtQmVmb3JlLiRlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzeW5jQXR0cmlidXRlcyhvcC5jb3VudGVycGFydC4kZWxlbWVudCwgJGVsZW1lbnQpO1xuICAgICAgICBpZiAoJGVsZW1lbnQuaGFzQ2xhc3MoQ09OVFJPTExFUl9DTEFTUykpIHtcbiAgICAgICAgICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpLiRjb250YWluZXIgPSBvcC5jb3VudGVycGFydC4kZWxlbWVudDtcbiAgICAgICAgICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVksIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9SZW1vdmUucHVzaCgkZWxlbWVudCk7XG4gICAgICB9IGVsc2UgaWYgKG9wLnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAgICRlbGVtZW50LnNhZmVSZW1vdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ2luc2VydCcpIHtcbiAgICAgICAgY29uc3Qge2FmdGVyLCB0YXJnZXR9ID0gb3Bfc3RlcC5vcDtcbiAgICAgICAgaWYgKGFmdGVyKSB7XG4gICAgICAgICAgJGVsZW1lbnQuaW5zZXJ0QWZ0ZXIoYWZ0ZXIuJGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCkge1xuICAgICAgICAgIHRhcmdldC4kZWxlbWVudC5wcmVwZW5kKCRlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfVxuICApXG4gIDtcblxuICB0b1JlbW92ZS5mb3JFYWNoKCgkZWxlbWVudCkgPT4gJGVsZW1lbnQuc2FmZVJlbW92ZSgpKTtcbn1cblxuZnVuY3Rpb24gc3luY0F0dHJpYnV0ZXMoJHJlYWwsICR2aXJ0dWFsKSB7XG4gIGNvbnN0IHJlYWxBdHRycyA9ICRyZWFsWzBdLmF0dHJpYnV0ZXMgPz8gW107XG4gIGNvbnN0IHZpcnR1YWxBdHRycyA9ICR2aXJ0dWFsWzBdLmF0dHJpYnV0ZXMgPz8gW107XG4gIC8vIFJlbW92ZSBtaXNzaW5nIGF0dHJzXG4gIFsuLi5yZWFsQXR0cnNdLmZvckVhY2goYXR0ciA9PiB7XG4gICAgaWYgKCEkdmlydHVhbC5pcyhgWyR7YXR0ci5uYW1lfV1gKSkge1xuICAgICAgJHJlYWwucmVtb3ZlQXR0cihhdHRyLm5hbWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWRkIG9yIHVwZGF0ZVxuICBbLi4udmlydHVhbEF0dHJzXS5mb3JFYWNoKGF0dHIgPT4ge1xuICAgIGlmICghYXR0ci5uYW1lLnN0YXJ0c1dpdGgoYGRhdGFgKSAmJiAkcmVhbC5hdHRyKGF0dHIubmFtZSkgIT09IGF0dHIudmFsdWUpIHtcbiAgICAgICRyZWFsLmF0dHIoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gICRyZWFsLnJlbW92ZURhdGEoKTtcbiAgT2JqZWN0LmVudHJpZXMoJHZpcnR1YWwuZGF0YSgpKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAkcmVhbC5kYXRhKGtleSwgdmFsdWUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBMQ0IgKExvbmdlc3QgQ29tbW9uIEJyYW5jaCkgZmluZHMgbWF0Y2hpbmcgYnJhbmNoZXMgYW5kIHJlc2VydmVzIHRoZW0hXG4gKlxuICogQHBhcmFtIG9sZE5vZGVzXG4gKiBAcGFyYW0gbmV3Tm9kZXNcbiAqIEBwYXJhbSBkZXB0aFxuICogQHJldHVybnMgeyp8KltdfVxuICovXG5mdW5jdGlvbiBsY2JEaWZmKG9sZE5vZGVzLCBuZXdOb2RlcywgZGVwdGgpIHtcbiAgbmV3Tm9kZXMuZmlsdGVyKHggPT4geC5kZXB0aCA9PT0gZGVwdGggJiYgIXgub3ApLmZvckVhY2goKG5ld05vZGUpID0+IHtcbiAgICBjb25zdCBvbGROb2RlID0gb2xkTm9kZXMuZmluZCgodGVtcE9sZE5vZGUpID0+IHtcbiAgICAgIHJldHVybiAhdGVtcE9sZE5vZGUub3AgJiYgdGVtcE9sZE5vZGUuaWQgPT09IG5ld05vZGUuaWQ7XG4gICAgfSk7XG5cbiAgICBpZiAob2xkTm9kZSkge1xuICAgICAgY29uc3Qga2VlcFRyZWVCcmFuY2ggPSAob2xkTm9kZSwgbmV3Tm9kZSkgPT4ge1xuICAgICAgICBvbGROb2RlLm9wID0ge3R5cGU6ICdrZWVwJywgaWR4OiBuZXdOb2RlLmlkeH07XG4gICAgICAgIG5ld05vZGUub3AgPSB7dHlwZTogJ2tlZXBfY291bnRlcnBhcnQnLCBjb3VudGVycGFydDogb2xkTm9kZX07XG4gICAgICAgIG9sZE5vZGUgPSBvbGROb2RlLnBhcmVudDtcbiAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50O1xuICAgICAgICBpZiAoIW9sZE5vZGUgfHwgb2xkTm9kZS5vcCB8fCBuZXdOb2RlPy5vcCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBrZWVwVHJlZUJyYW5jaChvbGROb2RlLCBuZXdOb2RlKTtcblxuICAgICAgfVxuICAgICAga2VlcFRyZWVCcmFuY2gob2xkTm9kZSwgbmV3Tm9kZSk7XG4gICAgfVxuICB9KTtcbiAgaWYgKGRlcHRoID4gMSkge1xuICAgIHJldHVybiBsY2JEaWZmKG9sZE5vZGVzLCBuZXdOb2RlcywgZGVwdGggLSAxKTtcbiAgfVxuXG4gIG9sZE5vZGVzLmZvckVhY2goKHgsIGkpID0+IHtcbiAgICBpZiAoIXgub3ApIHtcbiAgICAgIGNvbnN0IGlkeCA9IChvbGROb2Rlc1tpIC0gMV0/Lm9wLmlkeCA/PyAtMSkgKyAxO1xuICAgICAgeC5vcCA9IHt0eXBlOiAnZGVsZXRlJywgaWR4fVxuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0UmVhbFBhcmVudChlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50LnBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50LnBhcmVudC5vcC50eXBlID09PSAna2VlcF9jb3VudGVycGFydCcgPyBlbGVtZW50LnBhcmVudC5vcC5jb3VudGVycGFydCA6IGVsZW1lbnQucGFyZW50O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmVmb3JlKGVsZW1lbnQsIGlkeCkge1xuICAgIGNvbnN0IHN0YXJ0RGVwdGggPSBlbGVtZW50LmRlcHRoO1xuICAgIHdoaWxlIChpZHggPj0gMSAmJiBlbGVtZW50LmRlcHRoID49IHN0YXJ0RGVwdGgpIHtcbiAgICAgIGlkeCAtPSAxO1xuICAgICAgZWxlbWVudCA9IG5ld05vZGVzW2lkeF07XG4gICAgICBpZiAoZWxlbWVudC5kZXB0aCA9PT0gc3RhcnREZXB0aCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5vcC50eXBlID09PSAna2VlcF9jb3VudGVycGFydCcgPyBlbGVtZW50Lm9wLmNvdW50ZXJwYXJ0IDogZWxlbWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuXG4gIH1cblxuICBuZXdOb2Rlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgeC5nZXRCZWZvcmUgPSAoKSA9PiBnZXRCZWZvcmUoeCwgaSk7XG4gICAgeC5nZXRSZWFsUGFyZW50ID0gKCkgPT4gZ2V0UmVhbFBhcmVudCh4KTtcblxuICAgIGlmICgheC5vcCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0geC5nZXRSZWFsUGFyZW50KCk7XG4gICAgICBjb25zdCB0eXBlID0gdGFyZ2V0Py5vcC50eXBlID09PSAnaW5zZXJ0JyA/ICdpbnNlcnRfaWdub3JlJyA6ICdpbnNlcnQnO1xuICAgICAgeC5vcCA9IHt0eXBlLCB0YXJnZXQsIGFmdGVyOiB4LmdldEJlZm9yZSgpfVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgdGFnZ2VkID0gW1xuICAgIC4uLm9sZE5vZGVzLFxuICAgIC4uLm5ld05vZGVzLFxuICBdO1xuXG5cbiAgcmV0dXJuIHRhZ2dlZC5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgYVZhbCA9IGEub3A/LmlkeCA/PyBhLmlkeDtcbiAgICBjb25zdCBiVmFsID0gYi5vcD8uaWR4ID8/IGIuaWR4O1xuXG4gICAgcmV0dXJuIGFWYWwgLSBiVmFsO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRkb21cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGxlYWZDb250cm9sbGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmVmcmVzaCgkZG9tLCBsZWFmQ29udHJvbGxlciwgcHJvY2VzcyA9IG51bGwpIHtcbiAgaWYgKCFsZWFmQ29udHJvbGxlcikge1xuICAgIGxlYWZDb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigkZG9tKTtcbiAgfVxuXG4gIGlmICghbGVhZkNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBjb25zdCB7cmVmcmVzaFByb2Nlc3MsIGlzUnVubmluZ1Byb2Nlc3N9ID0gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKHByb2Nlc3MsIGxlYWZDb250cm9sbGVyKTtcblxuICAkZG9tID8/PSBsZWFmQ29udHJvbGxlci4kY29udGFpbmVyO1xuXG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihhcHAudGFnTmFtZXMsICRkb20sIGxlYWZDb250cm9sbGVyLCBwcm9jZXNzKS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gcmVsb2FkTWV0aG9kSFRNTChsZWFmQ29udHJvbGxlciwgJGRvbSwgcmVmcmVzaFByb2Nlc3MpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKCFpc1J1bm5pbmdQcm9jZXNzKSB7XG4gICAgICAgIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaChyZWZyZXNoUHJvY2Vzcyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfSk7XG59Il0sIm5hbWVzIjpbImNvbnRyb2xsZXJGYWN0b3J5IiwicHJlcGFyZVJlZnJlc2hQcm9jZXNzIiwicnVuQ29udHJvbEZsb3dGdW5jdGlvbnMiLCJ1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2giLCJnZXRVcmxQYXJhbSIsInByZXBhcmVEYXRhIiwiYXBwIiwidHJpZ2dlciIsImh0bWxGaWxlcyIsIkRBVEFfQ09OVFJPTExFUl9LRVkiLCJDT05UUk9MTEVSX0NMQVNTIiwiY2xlYW5DYWNoZSIsImZpbmRTZGNUZ3MiLCIkY29udGFpbmVyIiwidGFnTmFtZUxpc3QiLCJwYXJlbnRDb250cm9sbGVyIiwiJGNoaWxkcmVuIiwiY2hpbGRyZW4iLCJlbXB0eUxpc3QiLCJlYWNoIiwiXyIsImVsZW1lbnQiLCIkZWxlbWVudCIsIiQiLCJ0YWdOYW1lIiwicHJvcCIsInRvTG93ZXJDYXNlIiwic3BsaXQiLCJpbkFycmF5IiwicHVzaCIsInRhZyIsInN1cGVyIiwic3BsaWNlIiwiZG9tIiwic3RhcnRzV2l0aCIsImFkZENsYXNzIiwiX3V1aWQiLCJjb25jYXQiLCJyZXBsYWNlUGxhY2Vob2xkZXJDb250cm9sbGVyIiwiY29udHJvbGxlciIsInVybCIsInVybFZhbHVlcyIsImtleV9pZHgiLCJfdXJsUGFyYW1zIiwiaGFzT3duUHJvcGVydHkiLCJrZXkiLCJyZSIsIlJlZ0V4cCIsInJlcGxhY2UiLCJzaGlmdCIsImxvYWRIVE1MRmlsZSIsImFyZ3MiLCJjb250ZW50VXJsIiwiX3RhZ05hbWUiLCJjb250ZW50UmVsb2FkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJWRVJTSU9OIiwiX21ldGhvZCIsImdldCIsInRoZW4iLCJkYXRhIiwiY2F0Y2giLCJlcnIiLCJzdGF0dXMiLCJyZXNwb25zZUpTT04iLCJjb25maXJtUGFnZUxvYWRlZCIsImNvbnRyb2xsZXJfbmFtZSIsInJlc3BvbnNlVGV4dCIsInJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyIiwicHJvY2VzcyIsInJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyIiwidGFnTmFtZXMiLCJwYXJzZUNvbnRlbnRVcmwiLCJsZW5ndGgiLCJtYXRjaGVzIiwiZXhlYyIsInBhcmFtcyIsInBhcnNlZENvbnRlbnRVcmwiLCJnZXRDb250cm9sbGVyIiwiJGVsZW0iLCJoYXNDbGFzcyIsImNsb3Nlc3QiLCJsb2FkRmlsZXNGcm9tQ29udHJvbGxlciIsImdldEVsZW1lbnRzIiwiYWxsIiwicmVzdWx0cyIsImh0bWxGaWxlIiwiYXBwZW5kIiwicmVsb2FkSFRNTENvbnRyb2xsZXIiLCJydW5SZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lciIsInN1cGVyVGFnTmFtZUxpc3QiLCJydW5Db250cm9sbGVyRmlsbENvbnRlbnQiLCIkaHRtbCIsImVtcHR5IiwiYXR0ciIsIm1peGluS2V5IiwiX21peGlucyIsInRhZ0xpc3QiLCJ0YWdEZXNjcmlwdGlvbkVsZW1lbnRzIiwidGFnQ291bnQiLCJlbGVtZW50SW5kZXgiLCJyZWxvYWRNZXRob2RIVE1MIiwiX3JlbG9hZE1ldGhvZEhUTUwiLCIkZG9tIiwicGxpc3QiLCJmaW5kIiwiJHRoaXMiLCJyZXN1bHQiLCJ1bmRlZmluZWQiLCJjb250cm9sbGVyX2hhbmRsZXIiLCJuZXdEYXRhIiwiYmluZCIsIngiLCIkbmV3Q29udGVudCIsImh0bWwiLCJyZWNvbmNpbGUiLCJnZXROb2RlS2V5Iiwibm9kZSIsIm5vZGVUeXBlIiwibm9kZVZhbHVlIiwicmVzIiwibm9kZU5hbWUiLCJmb3JFYWNoIiwiZGVmYXVsdFZhbHVlIiwiam9pbiIsInJlY29uY2lsZVRyZWUiLCJpZCIsInBhcmVudCIsIm9iaiIsImRlcHRoIiwiaWR4IiwiZ2V0UmVhbFBhcmVudCIsImdldElkeCIsIk1hdGgiLCJtYXgiLCJpbmRleCIsIm9wIiwiY29udGVudHMiLCJ0b0FycmF5IiwibWFwIiwic2xpY2UiLCJmbGF0IiwiJHZpcnR1YWxOb2RlIiwiJHJlYWxOb2RlIiwiJG9sZCIsIiRuZXciLCJpIiwib3Bfc3RlcHMiLCJsY2JEaWZmIiwidG9SZW1vdmUiLCJ3aW5kb3ciLCJNQUlOIiwiT1BTIiwib3Bfc3RlcCIsInR5cGUiLCJjSWR4IiwiY291bnRlcnBhcnQiLCJlbGVtQmVmb3JlIiwiZ2V0QmVmb3JlIiwicHJlcGVuZCIsImluc2VydEFmdGVyIiwic3luY0F0dHJpYnV0ZXMiLCJzYWZlUmVtb3ZlIiwiYWZ0ZXIiLCJ0YXJnZXQiLCIkcmVhbCIsIiR2aXJ0dWFsIiwicmVhbEF0dHJzIiwiYXR0cmlidXRlcyIsInZpcnR1YWxBdHRycyIsImlzIiwibmFtZSIsInJlbW92ZUF0dHIiLCJ2YWx1ZSIsInJlbW92ZURhdGEiLCJPYmplY3QiLCJlbnRyaWVzIiwib2xkTm9kZXMiLCJuZXdOb2RlcyIsImZpbHRlciIsIm5ld05vZGUiLCJvbGROb2RlIiwidGVtcE9sZE5vZGUiLCJrZWVwVHJlZUJyYW5jaCIsInN0YXJ0RGVwdGgiLCJ0YWdnZWQiLCJzb3J0IiwiYSIsImIiLCJhVmFsIiwiYlZhbCIsInJlZnJlc2giLCJsZWFmQ29udHJvbGxlciIsInJlZnJlc2hQcm9jZXNzIiwiaXNSdW5uaW5nUHJvY2VzcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_view.js\n\n}");
128
128
 
129
129
  /***/ })
130
130