jt
2024-07-20 a93f9ab65690f6f0a681d65375be1c1aeafa8c1e
unpackage/dist/dev/app-plus/app-service.js
@@ -18835,6 +18835,7 @@
                  ? _c(
                      "uni-forms-item",
                      {
                        staticClass: _vm._$s("3-" + $30, "sc", "head-form"),
                        attrs: {
                          label: item.label + ":",
                          "label-width": item.labelWidth + "px",
@@ -19346,6 +19347,11 @@
                                ? _c(
                                    "uni-forms-item",
                                    {
                                      staticClass: _vm._$s(
                                        "22-" + $30 + "-" + $31,
                                        "sc",
                                        "head-form"
                                      ),
                                      attrs: {
                                        label: cols.label + ":",
                                        "label-width": cols.labelWidth + "px",
@@ -29945,7 +29951,7 @@
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("/* WEBPACK VAR INJECTION */(function(__f__) {\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 1);\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ 57));\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ 59));\nvar _base = _interopRequireDefault(__webpack_require__(/*! ../../components/js-base64/base64.js */ 67));\nvar _utils = _interopRequireDefault(__webpack_require__(/*! @/js/utils.js */ 61));\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n  modules: {\n    Base64: _base.default\n  },\n  data: function data() {\n    return {\n      title: this.translateSys('add2'),\n      param: {},\n      edit_inital_event: \"\",\n      //弹窗初始化事件ID\n      edit_ok_event: \"\",\n      //弹窗点击OK 触发事件ID\n      edit_select_compose_event: \"\",\n      //选择组成对象时调用\n      edit_compose_cls_id: \"\",\n      global_attr: [],\n      refdatastore: [],\n      //引用数据存储区// {attr:'G_PRJ_' + bindattr + '_ID', value:info.id}\n      scanCodeVal: \"\",\n      subClassAttrList: [],\n      subPanelList: [],\n      subClassGridStyle: [],\n      popupType: \"center\",\n      check_list: {},\n      focusFieldId: \"\",\n      focusOldFieldId: \"\",\n      head_styledef: {\n        form: {\n          items: []\n        }\n      },\n      after_ok: {},\n      activity: null,\n      receiver: null,\n      intentFilter: null,\n      content: ''\n    };\n  },\n  onNavigationBarButtonTap: function onNavigationBarButtonTap(e) {\n    if (e.index == 0) {\n      var _$this = this;\n      uni.scanCode({\n        scanType: [\"qrCode\"],\n        success: function success(res) {\n          if (_$this.focusFieldId) {\n            var items = _$this.head_styledef.form.items || [];\n            for (var i in items) {\n              var ele = items[i];\n              if (ele.name == 'Input' || ele.name == 'InputNumber' || ele.name == 'Textarea') {\n                if (_$this.focusFieldId == ele.fieldId) {\n                  _$this.onScanValue(ele, res.result);\n                  break;\n                }\n              } else if (ele.name == \"Layot\") {\n                var curIndex = (ele.setting.colList || []).findIndex(function (col, index2, arr) {\n                  return (col.name == 'Input' || col.name == 'InputNumber' || col.name == 'Textarea') && _$this.focusFieldId == col.fieldId;\n                });\n                if (curIndex > -1) {\n                  var col = ele.setting.colList[curIndex];\n                  _$this.onScanValue(col, res.result);\n                  break;\n                }\n              }\n            }\n          }\n        }\n      });\n    } else if (e.index == 1) {\n      //刷新\n      uni.redirectTo({\n        url: '../modal/3018_2?param=' + JSON.stringify(this.$data.param) + \"&titlename=\" + this.$data.title\n      });\n    }\n  },\n  onLoad: function onLoad(options) {\n    // console.log(options);\n    uni.setNavigationBarTitle({\n      title: options.titlename\n    }); //设置顶部标题 \n    this.$data.param = JSON.parse(options.param);\n    this.$data.title = this.$data.param.Add_BtnName ? this.$data.param.Add_BtnName : options.titlename; //设置按钮文字\n    this.loadData(options.paramValue);\n  },\n  methods: {\n    setData: function setData(obj) {\n      var that = this;\n      var keys = [];\n      var val, data;\n      Object.keys(obj).forEach(function (key) {\n        keys = key.split(\".\");\n        val = obj[key];\n        data = that.$data;\n        keys.forEach(function (key2, index) {\n          if (index + 1 == keys.length) {\n            that.$set(data, key2, val);\n          } else {\n            if (!data[key2]) {\n              that.$set(data, key2, {});\n            }\n          }\n          data = data[key2];\n        });\n      });\n    },\n    loadData: function loadData(paramValue) {\n      var _this = this;\n      return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {\n        var _this$param$DataCls, _this$param$UI_Style;\n        var _this$$data$head_styl, _this$$data$head_styl2, attrs;\n        return _regenerator.default.wrap(function _callee5$(_context5) {\n          while (1) {\n            switch (_context5.prev = _context5.next) {\n              case 0:\n                _context5.next = 2;\n                return _this.Head_UIStyleGetInfo((_this$param$DataCls = _this.param.DataCls) === null || _this$param$DataCls === void 0 ? void 0 : _this$param$DataCls.id, (_this$param$UI_Style = _this.param.UI_Style) === null || _this$param$UI_Style === void 0 ? void 0 : _this$param$UI_Style.ID);\n              case 2:\n                //传入参数值\n                if (paramValue) {\n                  attrs = paramValue.attrs || [];\n                  (((_this$$data$head_styl = _this.$data.head_styledef) === null || _this$$data$head_styl === void 0 ? void 0 : (_this$$data$head_styl2 = _this$$data$head_styl.form) === null || _this$$data$head_styl2 === void 0 ? void 0 : _this$$data$head_styl2.items) || []).forEach( /*#__PURE__*/function () {\n                    var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(ele, index) {\n                      return _regenerator.default.wrap(function _callee4$(_context4) {\n                        while (1) {\n                          switch (_context4.prev = _context4.next) {\n                            case 0:\n                              if (ele.name != \"Layout\") {\n                                attrs.forEach( /*#__PURE__*/function () {\n                                  var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(ele2, index2) {\n                                    return _regenerator.default.wrap(function _callee$(_context) {\n                                      while (1) {\n                                        switch (_context.prev = _context.next) {\n                                          case 0:\n                                            if (ele.fieldId == ele2.name) {\n                                              ele.value = ele2.value;\n                                            }\n                                          case 1:\n                                          case \"end\":\n                                            return _context.stop();\n                                        }\n                                      }\n                                    }, _callee);\n                                  }));\n                                  return function (_x3, _x4) {\n                                    return _ref2.apply(this, arguments);\n                                  };\n                                }());\n                              } else {\n                                ele.setting.colList.forEach( /*#__PURE__*/function () {\n                                  var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(col) {\n                                    return _regenerator.default.wrap(function _callee3$(_context3) {\n                                      while (1) {\n                                        switch (_context3.prev = _context3.next) {\n                                          case 0:\n                                            if (col) {\n                                              attrs.forEach( /*#__PURE__*/function () {\n                                                var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(ele2, index2) {\n                                                  return _regenerator.default.wrap(function _callee2$(_context2) {\n                                                    while (1) {\n                                                      switch (_context2.prev = _context2.next) {\n                                                        case 0:\n                                                          if (col.fieldId == ele2.name) {\n                                                            col.value = ele2.value;\n                                                          }\n                                                        case 1:\n                                                        case \"end\":\n                                                          return _context2.stop();\n                                                      }\n                                                    }\n                                                  }, _callee2);\n                                                }));\n                                                return function (_x6, _x7) {\n                                                  return _ref4.apply(this, arguments);\n                                                };\n                                              }());\n                                            }\n                                          case 1:\n                                          case \"end\":\n                                            return _context3.stop();\n                                        }\n                                      }\n                                    }, _callee3);\n                                  }));\n                                  return function (_x5) {\n                                    return _ref3.apply(this, arguments);\n                                  };\n                                }());\n                              }\n                            case 1:\n                            case \"end\":\n                              return _context4.stop();\n                          }\n                        }\n                      }, _callee4);\n                    }));\n                    return function (_x, _x2) {\n                      return _ref.apply(this, arguments);\n                    };\n                  }());\n                }\n                __f__(\"log\", _this.$data.param, \" at pages/modal/3018_2.vue:295\");\n              case 4:\n              case \"end\":\n                return _context5.stop();\n            }\n          }\n        }, _callee5);\n      }))();\n    },\n    Head_UIStyleGetInfo: function Head_UIStyleGetInfo(class_id, style_id) {\n      var _this2 = this;\n      return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8() {\n        var $this, dataInfo;\n        return _regenerator.default.wrap(function _callee8$(_context8) {\n          while (1) {\n            switch (_context8.prev = _context8.next) {\n              case 0:\n                //获取自定义表单样式\n                $this = _this2;\n                dataInfo = {\n                  class_id: class_id,\n                  ui_style_id: style_id\n                };\n                _this2.$store.dispatch('UIStyleGetInfo', dataInfo).then(function (ret) {\n                  // console.log(ret);\n                  if (ret.err_code == 0) {\n                    var _$this$head_styledef$;\n                    var styledef = \"\";\n                    if (ret.result.style_def) {\n                      //mobox2的style_def是json字符串\n                      styledef = ret.result.style_def.replace(/\\\\/g, \"\");\n                      //mobox3的style_def是base64字符串\n                      if (!ret.result.style_def.includes('\"')) styledef = _base.default.decode(ret.result.style_def);\n                    }\n                    $this.$data.head_styledef = ret.result.style_def ? JSON.parse(styledef) : {};\n                    // console.log($this.$data.head_styledef);\n                    $this.head_styledef.form.items.forEach( /*#__PURE__*/function () {\n                      var _ref5 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(ele, index) {\n                        return _regenerator.default.wrap(function _callee6$(_context6) {\n                          while (1) {\n                            switch (_context6.prev = _context6.next) {\n                              case 0:\n                                ele.show = true;\n                                if (!(ele.useDict == true)) {\n                                  _context6.next = 4;\n                                  break;\n                                }\n                                _context6.next = 4;\n                                return _this2.DictGetInfo(ele.bind.dict, index, 'mast');\n                              case 4:\n                                if ($this.focusFieldId == \"\") {\n                                  if (ele.name == 'Input' || ele.name == 'InputNumber' || ele.name == 'Textarea') {\n                                    $this.setData({\n                                      focusFieldId: ele.fieldId\n                                    });\n                                  }\n                                }\n                              case 5:\n                              case \"end\":\n                                return _context6.stop();\n                            }\n                          }\n                        }, _callee6);\n                      }));\n                      return function (_x8, _x9) {\n                        return _ref5.apply(this, arguments);\n                      };\n                    }());\n                    if (((_$this$head_styledef$ = $this.head_styledef.event) === null || _$this$head_styledef$ === void 0 ? void 0 : _$this$head_styledef$.length) > 0) {\n                      $this.head_styledef.event.forEach( /*#__PURE__*/function () {\n                        var _ref6 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(a) {\n                          return _regenerator.default.wrap(function _callee7$(_context7) {\n                            while (1) {\n                              switch (_context7.prev = _context7.next) {\n                                case 0:\n                                  if (!(a.event_id == \"initial\")) {\n                                    _context7.next = 5;\n                                    break;\n                                  }\n                                  _context7.next = 3;\n                                  return $this.loadInitEvent(a.scrip_id);\n                                case 3:\n                                  _context7.next = 6;\n                                  break;\n                                case 5:\n                                  if (a.event_id == 'after_ok') {\n                                    $this.after_ok = {\n                                      id: a.scrip_id,\n                                      name: a.scrip_name\n                                    };\n                                  }\n                                case 6:\n                                case \"end\":\n                                  return _context7.stop();\n                              }\n                            }\n                          }, _callee7);\n                        }));\n                        return function (_x10) {\n                          return _ref6.apply(this, arguments);\n                        };\n                      }());\n                    }\n                  } else {\n                    uni.showModal({\n                      title: _this2.translateSys(\"error\") + \"1\",\n                      content: ret.err_msg,\n                      showCancel: false,\n                      confirmText: _this2.translateSys(\"cancel\")\n                    });\n                  }\n                }).catch(function (ex) {\n                  // console.log(ex);\n                  uni.showModal({\n                    title: _this2.translateSys(\"error\") + \"1.1\",\n                    content: ex.errMsg,\n                    showCancel: false,\n                    confirmText: _this2.translateSys(\"cancel\")\n                  });\n                });\n              case 3:\n              case \"end\":\n                return _context8.stop();\n            }\n          }\n        }, _callee8);\n      }))();\n    },\n    DictGetInfo: function DictGetInfo(dict, index, type) {\n      var _this3 = this;\n      return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10() {\n        var $this, dataInfo;\n        return _regenerator.default.wrap(function _callee10$(_context10) {\n          while (1) {\n            switch (_context10.prev = _context10.next) {\n              case 0:\n                //Mobox3得到得到字典信息字典项列表\n                _this3.data = [];\n                $this = _this3;\n                dataInfo = {\n                  dict_id: dict.id,\n                  dict_name: dict.name\n                }; // console.log(dataInfo);\n                _this3.$store.dispatch('DictGetInfo', dataInfo).then( /*#__PURE__*/function () {\n                  var _ref7 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(success) {\n                    var list, itemName, attr;\n                    return _regenerator.default.wrap(function _callee9$(_context9) {\n                      while (1) {\n                        switch (_context9.prev = _context9.next) {\n                          case 0:\n                            __f__(\"log\", success, \" at pages/modal/3018_2.vue:374\");\n                            if (success.err_code == 0) {\n                              if (type == 'mast') {\n                                list = [];\n                                itemName = '';\n                                success.result.dict_item_list.forEach(function (item) {\n                                  if (item.is_default == '1') itemName = item.name;\n                                  list.push({\n                                    text: item.value,\n                                    value: item.name\n                                  });\n                                });\n                                //有默认值,显示默认值\n                                if (itemName) {\n                                  $this.head_styledef.form.items[index].value = itemName;\n                                  attr = $this.head_styledef.form.items[index].fieldId;\n                                  $this.head_styledef.form.model[attr] = itemName;\n                                }\n                                $this.head_styledef.form.items[index].dict = list;\n                                // $this.head_styledef.form.items[index].dictitem=success.result;\n                                // this.$store.commit(\"classAttrList\", $this.$data.classAttrList);\n                              } else {\n                                // $this.$data.subClassAttrList[index].attr_list[key].dictitem=success.result;\n                                // this.$store.commit(\"subClassAttrList\", $this.$data.subClassAttrList);\n                              }\n                            } else {\n                              uni.showModal({\n                                title: _this3.translateSys(\"error\") + \"1.2\",\n                                content: success.err_msg,\n                                showCancel: false,\n                                confirmText: _this3.translateSys(\"cancel\")\n                              });\n                            }\n                          case 2:\n                          case \"end\":\n                            return _context9.stop();\n                        }\n                      }\n                    }, _callee9);\n                  }));\n                  return function (_x11) {\n                    return _ref7.apply(this, arguments);\n                  };\n                }()).catch(function (ex) {\n                  // console.log(ex);\n                  uni.showModal({\n                    title: _this3.translateSys(\"error\") + \"1.3\",\n                    content: ex.errMsg,\n                    showCancel: false,\n                    confirmText: _this3.translateSys(\"cancel\")\n                  });\n                });\n              case 4:\n              case \"end\":\n                return _context10.stop();\n            }\n          }\n        }, _callee10);\n      }))();\n    },\n    loadInitEvent: function loadInitEvent(eventid) {\n      var _this4 = this;\n      return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee13() {\n        var $this, dataInfo;\n        return _regenerator.default.wrap(function _callee13$(_context13) {\n          while (1) {\n            switch (_context13.prev = _context13.next) {\n              case 0:\n                $this = _this4;\n                if (!eventid.includes('{')) eventid = '{' + eventid + '}';\n                dataInfo = {\n                  ed_type: 0,\n                  start_transaction: true,\n                  class_id: _this4.param.DataCls.id,\n                  event_id: eventid\n                };\n                __f__(\"log\", dataInfo, \" at pages/modal/3018_2.vue:428\");\n                // return;\n                _this4.$store.dispatch('runCustomEvent', dataInfo).then(function (success) {\n                  __f__(\"log\", success, \" at pages/modal/3018_2.vue:431\");\n                  if (success.err_code == 0) {\n                    var data = success.result;\n                    if (data.ret != 0) {\n                      var tip = data.err_info ? typeof data.err_info == 'string' ? data.err_info : data.err_info.join('<br/>') : '';\n                      if (data.ret == 801) {\n                        if (_this4.param.Only_Script_Error) {\n                          var pos = tip.indexOf(\":\");\n                          if (pos > -1) tip = tip.substring(pos + 1);\n                        }\n                        uni.showModal({\n                          title: _this4.translateSys(\"tip\"),\n                          content: tip,\n                          showCancel: false,\n                          confirmText: _this4.translateSys(\"cancel\")\n                        });\n                      } else uni.showModal({\n                        title: _this4.translateSys(\"tip\"),\n                        content: tip + ',' + _this4.translateSys('tip') + ':' + data.ret,\n                        showCancel: false,\n                        confirmText: _this4.translateSys(\"cancel\")\n                      });\n                      return false;\n                    } else {\n                      var tip = data.info ? typeof data.info == 'string' ? data.info : data.info.join('<br/>') : '';\n                      if (tip) uni.showModal({\n                        title: _this4.translateSys(\"tip\"),\n                        content: tip,\n                        showCancel: false,\n                        confirmText: _this4.translateSys(\"cancel\")\n                      });\n                      var actionlist = data.action;\n                      if (actionlist) {\n                        __f__(\"log\", actionlist, \" at pages/modal/3018_2.vue:469\");\n                        for (var i = 0; i < actionlist.length; i++) {\n                          var action = actionlist[i];\n                          if (action.action_type == 'set_dlg_attr') {\n                            var result = action.value;\n                            for (var i = 0; i < result.length; i++) {\n                              if (result[i].choice_list) {\n                                for (var c = 0; c < $this.head_styledef.form.items.length; c++) {\n                                  var attr = $this.head_styledef.form.items[c];\n                                  if (attr.name != 'Layout') {\n                                    if (attr.fieldId == result[i].attr) {\n                                      var dictItemList = [];\n                                      for (var d in result[i].choice_list) {\n                                        var val = result[i].choice_list[d];\n                                        dictItemList.push({\n                                          \"CN_S_NAME\": val,\n                                          \"CN_S_VALUE\": val,\n                                          \"text\": val,\n                                          \"value\": val\n                                        });\n                                      }\n                                      attr.dict = dictItemList;\n                                    }\n                                  } else if (attr.name == 'Layout') {\n                                    attr.setting.colList.forEach(function (col) {\n                                      if (col) {\n                                        if (col.fieldId == result[i].attr) {\n                                          var dictItemList = [];\n                                          for (var d in result[i].choice_list) {\n                                            var val = result[i].choice_list[d];\n                                            dictItemList.push({\n                                              \"CN_S_NAME\": val,\n                                              \"CN_S_VALUE\": val,\n                                              \"text\": val,\n                                              \"value\": val\n                                            });\n                                          }\n                                          col.dict = dictItemList;\n                                        }\n                                      }\n                                    });\n                                  }\n                                }\n                              }\n                              for (var c = 0; c < $this.$data.head_styledef.form.items.length; c++) {\n                                var attr = $this.$data.head_styledef.form.items[c];\n                                // console.log(attr[j].Name+'=='+result[i].attr);\n                                //判断表单里是否有返回字段,没有就装载到model里,点击确定提交的时候带上这些数据\n                                if ($this.head_styledef.form.model[result[i].attr] == undefined) {\n                                  $this.head_styledef.form.model[result[i].attr] = result[i].value;\n                                }\n                                //判断是否是栅格表单\n                                if (attr.name != 'Layout') {\n                                  if (attr.fieldId == result[i].attr) {\n                                    attr.value = '';\n                                    attr.oldvalue = '';\n                                    attr.value = result[i].value;\n                                    attr.oldvalue = result[i].value;\n                                    $this.head_styledef.form.model[attr.fieldId] = result[i].value;\n                                  }\n                                } else if (attr.name == 'Layout') {\n                                  attr.setting.colList.forEach(function (col) {\n                                    if (col) {\n                                      if (col.fieldId == result[i].attr) {\n                                        col.value = '';\n                                        col.oldvalue = '';\n                                        col.value = result[i].value;\n                                        col.oldvalue = result[i].value;\n                                        $this.head_styledef.form.model[col.fieldId] = result[i].value;\n                                      }\n                                    }\n                                  });\n                                }\n                              }\n                              var length = 0;\n                              if (!$this.$data.refdatastore.filter(function (s) {\n                                return result[i].attr == s.attr;\n                              }).length) {\n                                length = 1;\n                                $this.$data.refdatastore.push(result[i]);\n                              }\n                              if (length == 0) {\n                                for (var j = 0; j < $this.$data.refdatastore.length; j++) {\n                                  if ($this.$data.refdatastore[j].attr == result[i].attr) {\n                                    $this.$data.refdatastore[j].value = result[i].value;\n                                  }\n                                }\n                              }\n                            }\n                          } else if (data.action[i].action_type == 'set_dlg_attr_show') {\n                            var result = action.value;\n                            result.forEach( /*#__PURE__*/function () {\n                              var _ref8 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee12(attr, key) {\n                                return _regenerator.default.wrap(function _callee12$(_context12) {\n                                  while (1) {\n                                    switch (_context12.prev = _context12.next) {\n                                      case 0:\n                                        $this.$data.head_styledef.form.items.forEach( /*#__PURE__*/function () {\n                                          var _ref9 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee11(ele, index) {\n                                            return _regenerator.default.wrap(function _callee11$(_context11) {\n                                              while (1) {\n                                                switch (_context11.prev = _context11.next) {\n                                                  case 0:\n                                                    //判断是否是栅格表单\n                                                    if (ele.name != 'Layout') {\n                                                      if (ele.fieldId == attr.attr) {\n                                                        ele.show = attr.show;\n                                                      }\n                                                    } else if (ele.name == 'Layout') {\n                                                      ele.setting.colList.forEach(function (col) {\n                                                        if (col) {\n                                                          if (col.fieldId == attr.attr) {\n                                                            col.show = attr.show;\n                                                          }\n                                                        }\n                                                      });\n                                                    }\n                                                  case 1:\n                                                  case \"end\":\n                                                    return _context11.stop();\n                                                }\n                                              }\n                                            }, _callee11);\n                                          }));\n                                          return function (_x14, _x15) {\n                                            return _ref9.apply(this, arguments);\n                                          };\n                                        }());\n                                      case 1:\n                                      case \"end\":\n                                        return _context12.stop();\n                                    }\n                                  }\n                                }, _callee12);\n                              }));\n                              return function (_x12, _x13) {\n                                return _ref8.apply(this, arguments);\n                              };\n                            }());\n                            var head_styledef = JSON.parse(JSON.stringify($this.$data.head_styledef));\n                            $this.$data.head_styledef = [];\n                            $this.$data.head_styledef = head_styledef;\n                            // console.log($this.$data.head_styledef);\n                          } else {\n                            uni.showModal({\n                              title: _this4.translateSys(\"tip\"),\n                              content: _this4.translate('execute_init_event_failed') + _this4.translateSys(\"full_stop\") + _this4.translate('reason') + _this4.translateSys(\"colon\") + _this4.translateSys(\"quotation_mark_left\") + action.action_type + _this4.translateSys(\"quotation_mark_right\") + _this4.translate('tip_action_unprocessed'),\n                              showCancel: false,\n                              confirmText: _this4.translateSys(\"cancel\")\n                            });\n                          }\n                        }\n                      }\n                    }\n                  } else {\n                    uni.showModal({\n                      title: _this4.translateSys(\"error\") + \"3\",\n                      content: _this4.translate('execute_init_event_failed') + _this4.translateSys(\"full_stop\") + _this4.translate('reason') + _this4.translateSys(\"colon\") + success.err_msg,\n                      showCancel: false,\n                      confirmText: _this4.translateSys(\"cancel\")\n                    });\n                  }\n                }).catch(function (ex) {\n                  // console.log(ex);\n                  uni.showModal({\n                    title: _this4.translateSys(\"error\") + \"3.1\",\n                    content: _this4.translate('execute_init_event_failed') + _this4.translateSys(\"full_stop\") + _this4.translate('reason') + _this4.translateSys(\"colon\") + ex.errMsg,\n                    showCancel: false,\n                    confirmText: _this4.translateSys(\"cancel\")\n                  });\n                });\n              case 5:\n              case \"end\":\n                return _context13.stop();\n            }\n          }\n        }, _callee13);\n      }))();\n    },\n    ontap: function ontap(item) {\n      var _this5 = this;\n      //扫码功能\n      // 打开蓝牙适配器\n      // uni.openBluetoothAdapter({\n      //   success: function() {\n      // \t// 开始搜索蓝牙设备\n      // \tuni.startBluetoothDevicesDiscovery({\n      // \t  success: function() {\n      // \t\t// 监听找到新设备的事件\n      // \t\tuni.onBluetoothDeviceFound(function(devices) {\n      // \t\t  // 这里可以过滤出RFID芯片,连接并读取数据\n      // \t\t  console.log(devices[0].deviceId);\n      // \t\t})\n      // \t  }\n      // \t})\n      //   }\n      // });\n      // 监听NFC功能是否可用\n      // uni.getNFCAdapterState({\n      //   success: function(res) {\n      // \tconsole.log(res);\n      //     if (res.errCode === 0) {\n      //       // NFC功能可用,开始监听\n      //       uni.onNFCStart((res) => {\n      //         if (res.errCode === 0) {\n      //           // 开始NFC标签检测\n      //           uni.makeNFCReaderStart({\n      //             success: function() {\n      //               // 监听NFC标签\n      //               uni.onNFCTagDiscovered(function(res) {\n      // \t\t\t\t\t\t\t\t\t\t  console.log(res);\n      //                 // 这里可以处理NFC标签数据\n      //               })\n      //             }\n      //           })\n      //         }\n      //       })\n      //     }\n      //   }\n      // })\n      this.focusOldFieldId = item.fieldId;\n      getApp().onScan(function (result) {\n        __f__(\"log\", result, \" at pages/modal/3018_2.vue:699\");\n        // uni.hideKeyboard();\n        _this5.onScanValue(item, result.decodedata);\n      });\n    },\n    onScanValue: function onScanValue(item, value) {\n      var $this = this;\n      __f__(\"log\", \"onScanValue\", item, \" at pages/modal/3018_2.vue:706\");\n      if (item.oldvalue != value) {\n        item.oldvalue = value;\n        item.value = value;\n        var attr = value;\n        $this.head_styledef.form.model[attr] = value;\n        if (item.value) {\n          //第一个输入框不为空\n          //初始化,下个输入框focus属性\n          var findd = false;\n          var items = $this.head_styledef.form.items || [];\n          for (var i in items) {\n            var ele = items[i];\n            if (ele.name != \"Layout\") {\n              if (ele.name == 'Input' || ele.name == 'InputNumber' || ele.name == 'Textarea') {\n                if (attr == ele.fieldId) {\n                  findd = true;\n                } else {\n                  if (findd) {\n                    $this.setData({\n                      focusFieldId: ele.fieldId\n                    });\n                    break;\n                  }\n                }\n              }\n            } else {\n              if (findd) {\n                var curIndex = ele.setting.colList.findIndex(function (col, index2, arr) {\n                  return col.name == 'Input' || col.name == 'InputNumber' || col.name == 'Textarea';\n                });\n                if (curIndex > -1) {\n                  $this.setData({\n                    focusFieldId: ele.setting.colList[curIndex].fieldId\n                  });\n                  break;\n                }\n              } else {\n                var _ret = function () {\n                  var curIndex = ele.setting.colList.findIndex(function (col, index2, arr) {\n                    return attr == col.fieldId;\n                  });\n                  if (curIndex > -1) {\n                    findd = true;\n                    var curIndex2 = ele.setting.colList.findIndex(function (col, index2, arr) {\n                      return (col.name == 'Input' || col.name == 'InputNumber' || col.name == 'Textarea') && index2 > curIndex;\n                    });\n                    if (curIndex2 > -1) {\n                      $this.setData({\n                        focusFieldId: ele.setting.colList[curIndex].fieldId\n                      });\n                      return \"break\";\n                    }\n                  }\n                }();\n                if (_ret === \"break\") break;\n              }\n            }\n          }\n        }\n        var eventid = item.bind.onChangeEvent.id; //内容变化后事件\n        if (eventid) {\n          var obj_attr = this.head_styledef.form.model;\n          // console.log(obj_attr);\n          var req = Object.keys(obj_attr).map(function (a) {\n            return {\n              attr: a,\n              val: obj_attr[a] || \"\"\n            };\n          });\n          var info = {\n            eventid: eventid,\n            edtype: \"0\",\n            projectid: '',\n            rclsid: '',\n            robjid: '',\n            userlogin: '',\n            clsid: this.$data.param.DataCls.id,\n            objid: \"\",\n            attr: req,\n            dataJson: []\n          };\n          this.DataObjRunCustomEvent(info, '');\n        }\n      }\n    },\n    onClick: function onClick(item) {\n      this.focusFieldId = item.fieldId;\n    },\n    onevent: function onevent(item) {\n      // console.log(e.target);\n      __f__(\"log\", item, \" at pages/modal/3018_2.vue:804\");\n      if (item.oldvalue != item.value) {\n        item.oldvalue = item.value;\n        var attr = item.fieldId;\n        this.head_styledef.form.model[attr] = item.value;\n        //子数据类扫码区事件脚本\n        var eventid = item.bind.onChangeEvent.id; //内容变化后事件\n        if (eventid) {\n          var obj_attr = this.head_styledef.form.model;\n          // console.log(obj_attr);\n          var req = Object.keys(obj_attr).map(function (a) {\n            return {\n              attr: a,\n              val: obj_attr[a] || \"\"\n            };\n          });\n          var info = {\n            eventid: eventid,\n            edtype: \"0\",\n            projectid: '',\n            rclsid: '',\n            robjid: '',\n            userlogin: '',\n            clsid: this.$data.param.DataCls.id,\n            objid: \"\",\n            attr: req,\n            dataJson: []\n          };\n          this.DataObjRunCustomEvent(info, \"\");\n        }\n      }\n    },\n    onchange: function onchange(item) {\n      __f__(\"log\", item, \" at pages/modal/3018_2.vue:836\");\n      if (item.oldvalue != item.value) {\n        item.oldvalue = item.value;\n        var attr = item.fieldId;\n        this.head_styledef.form.model[attr] = item.value;\n        var eventid = item.bind.onChangeEvent.id; //内容变化后事件\n        if (eventid) {\n          // self.event_no_sub = 1;\n          var obj_attr = this.head_styledef.form.model;\n          // console.log(obj_attr);\n          var req = Object.keys(obj_attr).map(function (a) {\n            return {\n              attr: a,\n              val: obj_attr[a] || \"\"\n            };\n          });\n          var info = {\n            eventid: eventid,\n            edtype: \"0\",\n            projectid: '',\n            rclsid: '',\n            robjid: '',\n            userlogin: '',\n            clsid: this.$data.param.DataCls.id,\n            objid: \"\",\n            attr: req,\n            dataJson: []\n          };\n          this.DataObjRunCustomEvent(info);\n        }\n      }\n    },\n    onModelValue: function onModelValue(item) {\n      //绑定Model值\n      var attr = item.fieldId;\n      this.head_styledef.form.model[attr] = item.value;\n    },\n    classAttr_extButton: function classAttr_extButton(item) {\n      var onSuffixClickCallbackEvent = item.bind.onSuffixClickCallbackEvent; //后图标点击事件\n      var onSuffixClickEvent = item.bind.onSuffixClickEvent; //后图标点击回调\n\n      if (!onSuffixClickCallbackEvent.id) {\n        uni.showModal({\n          title: this.translateSys(\"tip\"),\n          content: this.translate('icon_click_event_empty'),\n          showCancel: false,\n          confirmText: this.translateSys(\"cancel\")\n        });\n        return;\n      }\n      if (!onSuffixClickEvent.id) {\n        uni.showModal({\n          title: this.translateSys(\"tip\"),\n          content: this.translate('icon_click_event_empty'),\n          showCancel: false,\n          confirmText: this.translateSys(\"cancel\")\n        });\n        return;\n      }\n      this.$data.popupType = 'right';\n      // open 方法传入参数 等同在 uni-popup 组件上绑定 type属性\n      this.$refs.popup.open($this.popupType);\n      this.DataObjRunCustomEvent_Return(onSuffixClickCallbackEvent.id, '', onSuffixClickEvent.id, item);\n    },\n    popupChange: function popupChange(e) {\n      __f__(\"log\", '当前模式:' + e.type + ',状态:' + e.show, \" at pages/modal/3018_2.vue:900\");\n    },\n    checkChange: function checkChange(e) {\n      //弹框check选择\n      // console.log(e.target.dataset);\n      var index = e.target.dataset.index;\n      var ischeck = e.target.dataset.ischeck;\n      var data = this.$data.check_list.items;\n      // this.$data.check_list.items=[];\n      if (this.$data.check_list.multiple_choice == \"0\") {\n        //判断时单选还是多选\n        for (var i in data) {\n          data[i].check = false;\n        }\n      }\n      data[index].check = ischeck ? false : true;\n      this.$data.check_list.items = data;\n    },\n    popup_cancel: function popup_cancel(e) {\n      //弹框取消\n      this.$refs.popup.close();\n    },\n    popup_sava: function popup_sava(e) {\n      //弹框确定\n      var $this = this;\n      var items = $this.$data.check_list.items;\n      var data = [];\n      var name = \"\";\n      for (var i = 0; i < items.length; i++) {\n        if (items[i].check == true) {\n          if (name) name += ';';\n          name += items[i].name;\n          data.push({\n            id: items[i].id,\n            name: items[i].name\n          });\n        }\n      }\n      // if (!$this.$data.popupParam) {\n      // \tuni.showModal({\n      // \t\ttitle: this.translateSys(\"tip\"),\n      // \t\tcontent: \"popupParam为空!\",\n      // \t\tshowCancel: false,\n      // \t\tconfirmText: this.translateSys(\"cancel\")\n      // \t});\n      // \treturn;\n      // }\n\n      var fieldId = $this.$data.popupParam.item.fieldId;\n      $this.head_styledef.form.model[attr] = name;\n      for (var c = 0; c < $this.$data.head_styledef.form.items.length; c++) {\n        var attr = $this.$data.head_styledef.form.items[c];\n        if (attr.fieldId == fieldId) {\n          attr.value = name;\n        }\n      }\n      __f__(\"log\", data, \" at pages/modal/3018_2.vue:954\");\n      var callback_eventid = $this.$data.popupParam.button_callback.trim();\n      var info = {\n        eventid: callback_eventid,\n        edtype: \"0\",\n        projectid: '',\n        rclsid: '',\n        robjid: '',\n        userlogin: '',\n        clsid: $this.$data.param.DataCls.id,\n        objid: \"\",\n        attr: $this.$data.popupParam.req,\n        dataJson: data\n      };\n      $this.DataObjRunCustomEvent(info, $this.$data.popupParam.data_attr);\n      this.$refs.popup.close();\n    },\n    DataObjRunCustomEvent: function DataObjRunCustomEvent(info, data_attr) {\n      var _this6 = this;\n      var $this = this;\n      var enviroment = {\n        'function': '3000',\n        // 功能点编号\n        cls_id: this.$data.param.DataCls.id,\n        // 功能点主数据类标识\n        'button': 'top',\n        // top/bottom\n        button_name: this.translateSys('add2'),\n        master: {\n          cls_id: this.$data.param.DataCls.id // button=bottom时 master的cls_id\n          //obj_id: ''  // button=bottom时 master的obj_id\n        }\n      };\n\n      if (data_attr) {\n        enviroment.edit_dlg = {\n          type: 'small',\n          //小窗口\n          class_id: this.$data.param.DataCls.id //当前数据类id\n        };\n\n        if (data_attr) {\n          enviroment.edit_dlg.form_control = {\n            //所属的表单控件\n            name: data_attr.Name,\n            //字段属性\n            text: data_attr.DispName,\n            //显示文本\n            group_name: data_attr.GroupName,\n            //属性组\n            type: data_attr.Type,\n            //字段类型\n            readonly: data_attr.ReadOnly,\n            //是否只读\n            button_img: data_attr.button_img,\n            //引用按钮的图标\n            button_tooltip: data_attr.button_tooltip //引用按钮的tooltip\n          };\n        }\n      }\n\n      // var dataInfo = {\n      //     edtype: info.edtype, eventid: info.eventid, projectid: info.projectid.replace('{','').replace('}',''),\n      //     rclsid: info.rclsid, robjid: info.robjid, userlogin: info.userlogin, clsid: info.clsid, objid: info.objid,\n      //     attr: JSON.stringify(info.attr), extinfo: JSON.stringify(enviroment), inputparameter: \"\",\n      // \tglobal_attr: JSON.stringify(this.$data.global_attr), dataJson:JSON.stringify(info.dataJson)\n      // }\n      enviroment = _base.default.encode(JSON.stringify(enviroment)); //将字符串转换为base64编码\n      var input_param = _base.default.encode(JSON.stringify(info.attr)); //将字符串转换为base64编码\n      var global_attr = _base.default.encode(JSON.stringify(this.$data.global_attr)); //将字符串转换为base64编码\n      if (info.dataJson) info.dataJson = _base.default.encode(JSON.stringify(info.dataJson)); //将字符串转换为base64编码\n      var obj_attr = {};\n      info.attr.forEach(function (item) {\n        obj_attr[item.attr] = item.val;\n      });\n      if (!info.eventid.includes('{')) info.eventid = '{' + info.eventid + '}';\n      var dataInfo = {\n        ed_type: info.edtype,\n        start_transaction: true,\n        class_id: info.clsid,\n        class_name: '',\n        event_id: info.eventid,\n        event_name: '',\n        data_obj_id: info.objid,\n        obj_attr: obj_attr,\n        prj_id: info.projectid,\n        ref_cls_id: info.rclsid,\n        rel_obj_id: info.robjid,\n        user_login: info.userlogin,\n        data_json: info.dataJson,\n        compose_info: '',\n        ext_info: enviroment,\n        global_attr: global_attr,\n        input_param: input_param\n      };\n      __f__(\"log\", dataInfo, \" at pages/modal/3018_2.vue:1037\");\n      // return;\n      this.$store.dispatch('runCustomEvent', dataInfo).then(function (success) {\n        __f__(\"log\", success, \" at pages/modal/3018_2.vue:1040\");\n        if (success.err_code == 0) {\n          var data = success.result;\n          if (data.ret != 0) {\n            var tip = data.err_info ? typeof data.err_info == 'string' ? data.err_info : data.err_info.join('<br/>') : '';\n            if (data.ret == 801) {\n              if (_this6.param.Only_Script_Error) {\n                var pos = tip.indexOf(\":\");\n                if (pos > -1) tip = tip.substring(pos + 1);\n              }\n              uni.showModal({\n                title: _this6.translateSys(\"tip\"),\n                content: tip,\n                showCancel: false,\n                confirmText: _this6.translateSys(\"cancel\")\n              });\n            } else uni.showModal({\n              title: _this6.translateSys(\"tip\"),\n              content: tip + ',' + _this6.translateSys('tip') + ':' + data.ret,\n              showCancel: false,\n              confirmText: _this6.translateSys(\"cancel\")\n            });\n            return false;\n          } else {\n            var tip = data.info ? typeof data.info == 'string' ? data.info : data.info.join('<br/>') : '';\n            if (tip) uni.showModal({\n              title: _this6.translateSys(\"tip\"),\n              content: tip,\n              showCancel: false,\n              confirmText: _this6.translateSys(\"cancel\")\n            });\n            var actionlist = data.action;\n            if (actionlist) {\n              __f__(\"log\", actionlist, \" at pages/modal/3018_2.vue:1078\");\n              for (var i = 0; i < actionlist.length; i++) {\n                var action = actionlist[i];\n                if (action.action_type == 'set_dlg_attr') {\n                  var result = action.value;\n                  for (var i = 0; i < result.length; i++) {\n                    if (result[i].choice_list) {\n                      for (var c = 0; c < $this.head_styledef.form.items.length; c++) {\n                        var attr = $this.head_styledef.form.items[c];\n                        if (attr.name != 'Layout') {\n                          if (attr.fieldId == result[i].attr) {\n                            var dictItemList = [];\n                            for (var d in result[i].choice_list) {\n                              var val = result[i].choice_list[d];\n                              dictItemList.push({\n                                \"CN_S_NAME\": val,\n                                \"CN_S_VALUE\": val,\n                                \"text\": val,\n                                \"value\": val\n                              });\n                            }\n                            attr.dict = dictItemList;\n                          }\n                        } else if (attr.name == 'Layout') {\n                          attr.setting.colList.forEach(function (col) {\n                            if (col) {\n                              if (col.fieldId == result[i].attr) {\n                                var dictItemList = [];\n                                for (var d in result[i].choice_list) {\n                                  var val = result[i].choice_list[d];\n                                  dictItemList.push({\n                                    \"CN_S_NAME\": val,\n                                    \"CN_S_VALUE\": val,\n                                    \"text\": val,\n                                    \"value\": val\n                                  });\n                                }\n                                col.dict = dictItemList;\n                              }\n                            }\n                          });\n                        }\n                      }\n                    }\n                    for (var c = 0; c < $this.$data.head_styledef.form.items.length; c++) {\n                      var attr = $this.$data.head_styledef.form.items[c];\n                      // console.log(attr[j].Name+'=='+result[i].attr);\n                      //判断表单里是否有返回字段,没有就装载到model里,点击确定提交的时候带上这些数据\n                      if ($this.head_styledef.form.model[result[i].attr] == undefined) {\n                        $this.head_styledef.form.model[result[i].attr] = result[i].value;\n                      }\n                      //判断是否是栅格表单\n                      if (attr.name != 'Layout') {\n                        if (attr.fieldId == result[i].attr) {\n                          attr.value = '';\n                          attr.oldvalue = '';\n                          attr.value = result[i].value;\n                          attr.oldvalue = result[i].value;\n                          $this.head_styledef.form.model[attr.fieldId] = result[i].value;\n                        }\n                      } else if (attr.name == 'Layout') {\n                        attr.setting.colList.forEach(function (col) {\n                          if (col) {\n                            if (col.fieldId == result[i].attr) {\n                              col.value = '';\n                              col.oldvalue = '';\n                              col.value = result[i].value;\n                              col.oldvalue = result[i].value;\n                              $this.head_styledef.form.model[col.fieldId] = result[i].value;\n                            }\n                          }\n                        });\n                      }\n                    }\n                    var length = 0;\n                    if (!$this.$data.refdatastore.filter(function (s) {\n                      return result[i].attr == s.attr;\n                    }).length) {\n                      length = 1;\n                      $this.$data.refdatastore.push(result[i]);\n                    }\n                    if (length == 0) {\n                      for (var j = 0; j < $this.$data.refdatastore.length; j++) {\n                        if ($this.$data.refdatastore[j].attr == result[i].attr) {\n                          $this.$data.refdatastore[j].value = result[i].value;\n                        }\n                      }\n                    }\n                  }\n                } else if (action.action_type == 'set_dlg_attr_show') {\n                  var result = action.value;\n                  result.forEach( /*#__PURE__*/function () {\n                    var _ref10 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee15(attr, key) {\n                      return _regenerator.default.wrap(function _callee15$(_context15) {\n                        while (1) {\n                          switch (_context15.prev = _context15.next) {\n                            case 0:\n                              $this.$data.head_styledef.form.items.forEach( /*#__PURE__*/function () {\n                                var _ref11 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14(ele, index) {\n                                  return _regenerator.default.wrap(function _callee14$(_context14) {\n                                    while (1) {\n                                      switch (_context14.prev = _context14.next) {\n                                        case 0:\n                                          //判断是否是栅格表单\n                                          if (ele.name != 'Layout') {\n                                            if (ele.fieldId == attr.attr) {\n                                              ele.show = attr.show;\n                                            }\n                                          } else if (ele.name == 'Layout') {\n                                            ele.setting.colList.forEach(function (col) {\n                                              if (col) {\n                                                if (col.fieldId == attr.attr) {\n                                                  col.show = attr.show;\n                                                }\n                                              }\n                                            });\n                                          }\n                                        case 1:\n                                        case \"end\":\n                                          return _context14.stop();\n                                      }\n                                    }\n                                  }, _callee14);\n                                }));\n                                return function (_x18, _x19) {\n                                  return _ref11.apply(this, arguments);\n                                };\n                              }());\n                            case 1:\n                            case \"end\":\n                              return _context15.stop();\n                          }\n                        }\n                      }, _callee15);\n                    }));\n                    return function (_x16, _x17) {\n                      return _ref10.apply(this, arguments);\n                    };\n                  }());\n                  var head_styledef = JSON.parse(JSON.stringify($this.$data.head_styledef));\n                  $this.$data.head_styledef = [];\n                  $this.$data.head_styledef = head_styledef;\n                  // console.log($this.$data.head_styledef);\n                } else if (action.action_type == 'set_global_attr') {\n                  $this.$data.global_attr = action.value || [];\n                } else {\n                  uni.showModal({\n                    title: _this6.translateSys(\"tip\"),\n                    content: _this6.translateSys(\"quotation_mark_left\") + action.action_type + _this6.translateSys(\"quotation_mark_right\") + _this6.translate(\"tip_action_unprocessed\"),\n                    showCancel: false,\n                    confirmText: _this6.translateSys(\"cancel\")\n                  });\n                }\n              }\n            }\n            // var head_styledef = JSON.parse(JSON.stringify($this.head_styledef));\n            // $this.head_styledef=[];\n            // $this.head_styledef = head_styledef;\n            __f__(\"log\", $this.head_styledef, \" at pages/modal/3018_2.vue:1233\");\n            if (data.result) {\n              var result = data.result;\n              for (var i = 0; i < result.length; i++) {\n                for (var c = 0; c < $this.$data.head_styledef.form.items.length; c++) {\n                  var attr = $this.$data.head_styledef.form.items[c];\n                  //判断表单里是否有返回字段,没有就装载到model里,点击确定提交的时候带上这些数据\n                  if ($this.head_styledef.form.model[result[i].attr] == undefined) {\n                    $this.head_styledef.form.model[result[i].attr] = result[i].value;\n                  }\n                  //判断是否是栅格表单\n                  if (attr.name != 'Layout') {\n                    if (attr.fieldId == result[i].attr) {\n                      attr.value = '';\n                      attr.oldvalue = '';\n                      attr.value = result[i].value;\n                      attr.oldvalue = result[i].value;\n                      $this.head_styledef.form.model[attr.fieldId] = result[i].value;\n                    }\n                  } else if (attr.name == 'Layout') {\n                    attr.setting.colList.forEach(function (col) {\n                      if (col) {\n                        if (col.fieldId == result[i].attr) {\n                          col.value = '';\n                          col.oldvalue = '';\n                          col.value = result[i].value;\n                          col.oldvalue = result[i].value;\n                          $this.head_styledef.form.model[col.fieldId] = result[i].value;\n                        }\n                      }\n                    });\n                  }\n                }\n                var length = 0;\n                if (!$this.$data.refdatastore.filter(function (s) {\n                  return result[i].attr == s.attr;\n                }).length) {\n                  length = 1;\n                  $this.$data.refdatastore.push(result[i]);\n                }\n                if (length == 0) {\n                  for (var j = 0; j < $this.$data.refdatastore.length; j++) {\n                    if ($this.$data.refdatastore[j].attr == result[i].attr) {\n                      $this.$data.refdatastore[j].value = result[i].value;\n                    }\n                  }\n                }\n              }\n            }\n          }\n        } else {\n          uni.showModal({\n            title: _this6.translateSys(\"error\") + \"3\",\n            content: success.err_msg,\n            showCancel: false,\n            confirmText: _this6.translateSys(\"cancel\")\n          });\n        }\n      }).catch(function (ex) {\n        // console.log(ex);\n        uni.showModal({\n          title: _this6.translateSys(\"error\") + \"3.1\",\n          content: ex.errMsg,\n          showCancel: false,\n          confirmText: _this6.translateSys(\"cancel\")\n        });\n      });\n    },\n    DataObjRunCustomEvent_Return: function DataObjRunCustomEvent_Return(eventid, data_attr, button_callback, item) {\n      var _this7 = this;\n      var enviroment = {\n        'function': '3000',\n        // 功能点编号\n        cls_id: this.$data.param.DataCls.id,\n        // 功能点主数据类标识\n        'button': 'top',\n        // top/bottom\n        button_name: this.translateSys('add2'),\n        master: {\n          cls_id: this.$data.param.DataCls.id // button=bottom时 master的cls_id\n          //obj_id: ''  // button=bottom时 master的obj_id\n        }\n      };\n\n      var obj_attr = this.head_styledef.form.model;\n      // console.log(obj_attr);\n      var req = Object.keys(obj_attr).map(function (a) {\n        return {\n          attr: a,\n          val: obj_attr[a] || \"\"\n        };\n      });\n      if (this.$data.refdatastore.length > 0) {\n        for (var i = 0; i < this.$data.refdatastore.length; i++) {\n          if (!req.filter(function (s) {\n            return this.$data.refdatastore[i].attr == s.name;\n          }).length) {\n            length = 1;\n            req.push({\n              'attr': this.$data.refdatastore[i].attr,\n              'val': this.$data.refdatastore[i].value\n            });\n          }\n        }\n      }\n      var extinfo = enviroment;\n      extinfo.edit_dlg = {\n        type: 'small',\n        //小窗口\n        class_id: this.$data.param.DataCls.id //当前数据类id\n      };\n      // var dataInfo = {\n      // \tedtype:  \"0\", eventid: eventid, projectid: '',rclsid: '', robjid: '', userlogin: '', \n      // \tclsid: this.$data.param.DataCls.id, objid: '',attr: JSON.stringify(req), \n      // \textinfo: JSON.stringify(extinfo), global_attr: JSON.stringify(this.$data.global_attr)\n      // }\n      extinfo = _base.default.encode(JSON.stringify(extinfo)); //将字符串转换为base64编码\n      var global_attr = _base.default.encode(JSON.stringify(this.$data.global_attr)); //将字符串转换为base64编码\n      var obj_attr = {};\n      req.forEach(function (item) {\n        obj_attr[item.attr] = item.val;\n      });\n      if (!eventid.includes('{')) eventid = '{' + eventid + '}';\n      var dataInfo = {\n        ed_type: \"0\",\n        start_transaction: true,\n        class_id: this.$data.param.DataCls.id,\n        class_name: '',\n        event_id: eventid,\n        event_name: '',\n        data_obj_id: '',\n        obj_attr: obj_attr,\n        prj_id: '',\n        ref_cls_id: '',\n        rel_obj_id: '',\n        user_login: '',\n        data_json: '',\n        compose_info: '',\n        ext_info: extinfo,\n        global_attr: global_attr,\n        input_param: ''\n      };\n      __f__(\"log\", dataInfo, \" at pages/modal/3018_2.vue:1373\");\n      // return;\n      this.$store.dispatch('runCustomEvent', dataInfo).then(function (success) {\n        __f__(\"log\", success, \" at pages/modal/3018_2.vue:1376\");\n        if (success.err_code == 0) {\n          var data = success.result;\n          if (data.ret != 0) {\n            var tip = data.err_info ? typeof data.err_info == 'string' ? data.err_info : data.err_info.join('<br/>') : '';\n            if (data.ret == 801) {\n              if (_this7.param.Only_Script_Error) {\n                var pos = tip.indexOf(\":\");\n                if (pos > -1) tip = tip.substring(pos + 1);\n              }\n              uni.showModal({\n                title: _this7.translateSys(\"tip\"),\n                content: tip,\n                showCancel: false,\n                confirmText: _this7.translateSys(\"cancel\")\n              });\n            } else uni.showModal({\n              title: _this7.translateSys(\"tip\"),\n              content: tip + ',' + _this7.translateSys('tip') + ':' + data.ret,\n              showCancel: false,\n              confirmText: _this7.translateSys(\"cancel\")\n            });\n            return false;\n          } else {\n            var tip = data.info ? typeof data.info == 'string' ? data.info : data.info.join('<br/>') : '';\n            if (tip) uni.showModal({\n              title: _this7.translateSys(\"tip\"),\n              content: tip,\n              showCancel: false,\n              confirmText: _this7.translateSys(\"cancel\")\n            });\n            if (data != \"\") {\n              var actions = data.action;\n              __f__(\"log\", actions, \" at pages/modal/3018_2.vue:1414\");\n              if (actions) {\n                for (var i = 0; i < actions.length; i++) {\n                  var action = actions[i];\n                  var val = action.value;\n                  var enviroment = JSON.stringify(enviroment);\n                  if (action.action_type == 'open_panel') {\n                    var d = dialog({\n                      title: '<i class=\"ace-icon fa fa-info-circle\"></i> ' + _this7.translateSys(\"tip\"),\n                      content: _this7.translateSys(\"quotation_mark_left\") + action.action_type + _this7.translateSys(\"quotation_mark_right\") + _this7.translate(\"tip_action_unprocessed\")\n                    });\n                    d.show();\n                  } else if (action.action_type == 'open_select_userdlg') {\n                    var style = val.style;\n                    // style == 'user' ? '选择人员' : style == 'department' ? '选择部门' : style == 'role' ? '选择角色' : ''\n                    var $this = _this7;\n                    var param = {\n                      item: item,\n                      button_callback: button_callback,\n                      req: req,\n                      data_attr: data_attr\n                    };\n                    uni.navigateTo({\n                      url: '../selpsn/index?mulit=false&param=' + JSON.stringify(param),\n                      events: {\n                        AddPer: function AddPer(data, param) {\n                          // console.log(param);\n                          __f__(\"log\", data, \" at pages/modal/3018_2.vue:1449\");\n                          var callback_eventid = param.button_callback.trim();\n                          var info = {\n                            eventid: callback_eventid,\n                            edtype: \"0\",\n                            projectid: '',\n                            rclsid: '',\n                            robjid: '',\n                            userlogin: '',\n                            clsid: $this.$data.param.DataCls.id,\n                            objid: \"\",\n                            attr: param.req,\n                            inputparameter: data,\n                            dataJson: []\n                          };\n                          $this.DataObjRunCustomEvent(info, param.data_attr);\n                        }\n                      }\n                    });\n                  } else if (action.action_type == 'open_data_query_dlg') {\n                    var d = dialog({\n                      title: '<i class=\"ace-icon fa fa-info-circle\"></i> ' + _this7.translateSys(\"tip\"),\n                      content: _this7.translateSys(\"quotation_mark_left\") + action.action_type + _this7.translateSys(\"quotation_mark_right\") + _this7.translate(\"tip_action_unprocessed\")\n                    });\n                    d.show();\n                  } else if (action.action_type == 'open_common_dlg') {\n                    var $this = _this7;\n                    if (val.common_dlg_id == 'check_list') {\n                      $this.$data.check_list = val.config;\n                      if (val.config.appear_style == 'sideslip')\n                        //判断是否是侧滑\n                        $this.$data.popupType = 'right';else $this.$data.popupType = 'center';\n                      // open 方法传入参数 等同在 uni-popup 组件上绑定 type属性\n                      $this.$refs.popup.open($this.$data.popupType);\n                      var popupParam = {\n                        item: item,\n                        button_callback: button_callback,\n                        req: req,\n                        data_attr: data_attr\n                      };\n                      $this.$data.popupParam = popupParam;\n                    }\n                  } else if (action.action_type == 'open_project_query_dlg') {\n                    //console.log(action.value.select_range);\n                    //console.log(action.value.mulit_select);\n                    var priRel = '-1';\n                    if (action.value.select_range == '全部相关') priRel = '0';else if (action.value.select_range == '我负责的项目') priRel = '1';else if (action.value.select_range == '我创建的') priRel = '2';else if (action.value.select_range == '我参与的' || action.value.select_range == '我参加的') priRel = '3';else if (action.value.select_range == '我关注的') priRel = '4';else if (action.value.select_range == '我下属的项目') priRel = '5';\n                    var $this = _this7;\n                    var param_ = {\n                      item: item,\n                      button_callback: button_callback,\n                      req: req\n                    };\n                    uni.navigateTo({\n                      url: '../selPrj/index?relation=' + priRel + '&param=' + JSON.stringify(param_),\n                      events: {\n                        AddPer: function AddPer(data, param) {\n                          var attr = param.item.fieldId;\n                          $this.head_styledef.form.model[attr] = data[0].ID + ';' + data[0].Name;\n\n                          // $this.$data.classAttrList[param.index].Attr[param.iindex].Value=data[0].Name;\n                          // $this.$data.classAttrList[param.index].Attr[param.iindex].ValID=data[0].ID+';'+data[0].Name;\n                          var callback_eventid = param.button_callback.trim();\n                          if (callback_eventid) {\n                            var info = {\n                              eventid: callback_eventid,\n                              edtype: \"2\",\n                              projectid: data[0].ID,\n                              rclsid: \"\",\n                              robjid: \"\",\n                              userlogin: \"\",\n                              clsid: $this.$data.param.DataCls.id,\n                              objid: \"\",\n                              attr: param.req,\n                              dataJson: []\n                            };\n                            $this.DataObjRunCustomEvent(info);\n                          }\n                        }\n                      }\n                    });\n                  } else {\n                    uni.showModal({\n                      title: _this7.translateSys(\"tip\"),\n                      content: _this7.translateSys(\"quotation_mark_left\") + action.action_type + _this7.translateSys(\"quotation_mark_right\") + _this7.translate(\"tip_action_unprocessed\"),\n                      showCancel: false,\n                      confirmText: _this7.translateSys(\"cancel\")\n                    });\n                  }\n                }\n              }\n            } else {\n              uni.showModal({\n                title: _this7.translateSys('tip') + \"5.2\",\n                content: _this7.translateSys(\"quotation_mark_left\") + \"before_click_button\" + _this7.translateSys(\"quotation_mark_right\") + _this7.translateSys(\"comma\") + 'event_id' + eventid,\n                showCancel: false,\n                confirmText: _this7.translateSys(\"cancel\")\n              });\n            }\n          }\n        } else {\n          uni.showModal({\n            title: _this7.translateSys(\"error\") + \"5\",\n            content: success.err_msg,\n            showCancel: false,\n            confirmText: _this7.translateSys(\"cancel\")\n          });\n        }\n      }).catch(function (ex) {\n        // console.log(ex);\n        uni.showModal({\n          title: _this7.translateSys('tip') + \"5.1\",\n          content: ex.errMsg,\n          showCancel: false,\n          confirmText: _this7.translateSys(\"cancel\")\n        });\n      });\n    },\n    //确定\n    sava: function sava() {\n      var _this$after_ok;\n      if ((_this$after_ok = this.after_ok) !== null && _this$after_ok !== void 0 && _this$after_ok.id) {\n        // 点击确定按钮后\n        this.afterOK();\n      } else {\n        this.add();\n      }\n    },\n    add: function add() {\n      var _this8 = this;\n      uni.showLoading({\n        title: this.translateSys(\"loading\"),\n        mask: true\n      });\n      var obj_attr = this.head_styledef.form.model;\n      __f__(\"log\", obj_attr, \" at pages/modal/3018_2.vue:1620\");\n      // var req = Object.keys(obj_attr).map((a) => ({\n      // \tname: a,\n      // \tvalue: obj_attr[a] || \"\",\n      // }));\n\n      var enviroment = {\n        'function': '3000',\n        // 功能点编号\n        cls_id: this.$data.param.DataCls.id,\n        // 功能点主数据类标识\n        'button': 'top',\n        // top/bottom\n        button_name: this.translateSys('add2'),\n        master: {\n          cls_id: this.$data.param.DataCls.id\n        }\n      };\n      enviroment = _base.default.encode(JSON.stringify(enviroment)); //将字符串转换为base64编码\n\n      // console.log(obj_attr);\n      // var dataInfo={\n      //     class_id: this.$data.param.DataCls.id, data_obj_id: '', masterclsid: '',\n      //     req: JSON.stringify(req), upfile: JSON.stringify([]), post_data: JSON.stringify({}),\n      //     compose: JSON.stringify([]), refdatastore: JSON.stringify([]), extinfo: JSON.stringify(enviroment), \n      // \tnot_trigger_sys_event: ''\n      // };\n      var dataInfo = {\n        class_id: this.$data.param.DataCls.id,\n        class_name: '',\n        master_cls_id: '',\n        master_obj_id: '',\n        creator: '',\n        creator_name: '',\n        not_trigger_event: '',\n        update_exist: '',\n        post_process: '',\n        ext_info: enviroment,\n        obj_attr: obj_attr\n      };\n      __f__(\"log\", dataInfo, \" at pages/modal/3018_2.vue:1657\");\n      // return\n      this.$store.dispatch('createDataObj', dataInfo).then(function (success) {\n        __f__(\"log\", success, \" at pages/modal/3018_2.vue:1660\");\n        uni.hideLoading();\n        if (success.err_code == 0) {\n          var result = success.result;\n          // if(result.result_type == 0){}\n          if (success.result.action) {\n            var action = JSON.parse(success.result.action);\n            __f__(\"log\", action, \" at pages/modal/3018_2.vue:1667\");\n            if (action.ret == '0') {\n              if (action.ret != 0) {\n                uni.showModal({\n                  title: _this8.translateSys(\"tip\"),\n                  content: _this8.translate('execute_script_failed') + _this8.translateSys('comma') + _this8.translate('result') + _this8.translateSys('colon') + action.result,\n                  showCancel: false,\n                  confirmText: _this8.translateSys(\"cancel\")\n                });\n                return;\n              }\n              if (action.info) {\n                uni.showModal({\n                  title: _this8.translateSys(\"tip\"),\n                  content: _this8.translate('execute_script_failed') + _this8.translateSys('comma') + _this8.translateSys('colon') + action.info,\n                  showCancel: false,\n                  confirmText: _this8.translateSys(\"cancel\")\n                });\n                return;\n              }\n              if (action.result_type == '0') {\n                uni.showToast({\n                  title: action.result,\n                  icon: \"success\",\n                  duration: 3000\n                });\n              }\n\n              // \"{\"ret\":0, \"result_type\":0, \"result\":\"创建成功123123123\",\"info\":\"\"}\"\n            }\n          } else uni.showToast({\n            title: _this8.translate('create_success'),\n            icon: \"success\",\n            duration: 3000\n          });\n          if (!_this8.$data.param.After_Btn_Not_Refresh) {\n            //刷新\n            uni.redirectTo({\n              url: '../modal/3018_2?param=' + JSON.stringify(_this8.$data.param) + \"&titlename=\" + _this8.$data.title\n            });\n          }\n\n          // this.class_attr_init();\n        } else {\n          uni.showModal({\n            title: _this8.translateSys(\"error\"),\n            content: success.err_msg,\n            showCancel: false,\n            confirmText: _this8.translateSys(\"cancel\")\n          });\n        }\n      }).catch(function (ex) {\n        __f__(\"log\", ex, \" at pages/modal/3018_2.vue:1726\");\n        uni.hideLoading();\n        uni.showModal({\n          title: _this8.translateSys(\"tip\"),\n          content: ex.errMsg,\n          showCancel: false,\n          confirmText: _this8.translateSys(\"cancel\")\n        });\n      });\n    },\n    afterOK: function afterOK() {\n      var _this9 = this;\n      var obj_attr = this.head_styledef.form.model;\n      // console.log(obj_attr);\n      var input_param = {\n        id: \"\",\n        attrs: Object.keys(obj_attr).map(function (a) {\n          return {\n            attr: a,\n            value: obj_attr[a]\n          };\n        })\n      };\n      if (!this.after_ok.id.includes('{')) this.after_ok.id = '{' + this.after_ok.id + '}';\n      var dataInfo = {\n        ed_type: \"0\",\n        start_transaction: true,\n        class_id: this.$data.param.DataCls.id,\n        class_name: '',\n        event_id: this.after_ok.id,\n        event_name: '',\n        data_obj_id: '',\n        obj_attr: obj_attr,\n        prj_id: '',\n        ref_cls_id: '',\n        rel_obj_id: '',\n        user_login: '',\n        data_json: '',\n        compose_info: '',\n        input_param: ''\n      };\n      __f__(\"log\", dataInfo, \" at pages/modal/3018_2.vue:1764\");\n      // return;\n      this.$store.dispatch('runCustomEvent', dataInfo).then(function (success) {\n        __f__(\"log\", success, \" at pages/modal/3018_2.vue:1767\");\n        if (success.err_code == 0) {\n          var data = success.result;\n          if (data.ret != 0) {\n            var tip = data.err_info ? typeof data.err_info == 'string' ? data.err_info : data.err_info.join('<br/>') : '';\n            if (data.ret == 801) {\n              if (_this9.param.Only_Script_Error) {\n                var pos = tip.indexOf(\":\");\n                if (pos > -1) tip = tip.substring(pos + 1);\n              }\n              uni.showModal({\n                title: _this9.translateSys(\"tip\"),\n                content: tip,\n                showCancel: false,\n                confirmText: _this9.translateSys(\"cancel\")\n              });\n            } else uni.showModal({\n              title: _this9.translateSys(\"tip\"),\n              content: tip + ',' + _this9.translateSys('tip') + ':' + data.ret,\n              showCancel: false,\n              confirmText: _this9.translateSys(\"cancel\")\n            });\n            return false;\n          } else {\n            var tip = data.info ? typeof data.info == 'string' ? data.info : data.info.join('<br/>') : '';\n            if (tip) uni.showModal({\n              title: _this9.translateSys(\"tip\"),\n              content: tip,\n              showCancel: false,\n              confirmText: _this9.translateSys(\"cancel\")\n            });\n            var result = data.result;\n          }\n        } else {\n          uni.showModal({\n            title: _this9.translateSys(\"error\") + \"7\",\n            content: success.err_msg,\n            showCancel: false,\n            confirmText: _this9.translateSys(\"cancel\")\n          });\n        }\n      }).catch(function (ex) {\n        // console.log(ex);\n        uni.showModal({\n          title: _this9.translateSys('tip') + \"7.1\",\n          content: ex.errMsg,\n          showCancel: false,\n          confirmText: _this9.translateSys(\"cancel\")\n        });\n      });\n    },\n    cancel: function cancel(e) {\n      //取消\n      uni.navigateBack({\n        delta: 1 //返回层数,2则上上页\n      });\n    },\n    translate: function translate(t) {\n      if (typeof this.$t == \"function\") return this.$t(\"page.\".concat(t));else return t;\n    },\n    translateSys: function translateSys(t) {\n      if (typeof this.$t == \"function\") return this.$t(\"sys.\".concat(t));else return t;\n    }\n  }\n};\nexports.default = _default;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/vue-cli-plugin-uni/lib/format-log.js */ 18)[\"default\"]))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVuaS1hcHA6Ly8vcGFnZXMvbW9kYWwvMzAxOF8yLnZ1ZSJdLCJuYW1lcyI6WyJtb2R1bGVzIiwiQmFzZTY0IiwiZGF0YSIsInRpdGxlIiwicGFyYW0iLCJlZGl0X2luaXRhbF9ldmVudCIsImVkaXRfb2tfZXZlbnQiLCJlZGl0X3NlbGVjdF9jb21wb3NlX2V2ZW50IiwiZWRpdF9jb21wb3NlX2Nsc19pZCIsImdsb2JhbF9hdHRyIiwicmVmZGF0YXN0b3JlIiwic2NhbkNvZGVWYWwiLCJzdWJDbGFzc0F0dHJMaXN0Iiwic3ViUGFuZWxMaXN0Iiwic3ViQ2xhc3NHcmlkU3R5bGUiLCJwb3B1cFR5cGUiLCJjaGVja19saXN0IiwiZm9jdXNGaWVsZElkIiwiZm9jdXNPbGRGaWVsZElkIiwiaGVhZF9zdHlsZWRlZiIsImZvcm0iLCJpdGVtcyIsImFmdGVyX29rIiwiYWN0aXZpdHkiLCJyZWNlaXZlciIsImludGVudEZpbHRlciIsImNvbnRlbnQiLCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiLCJ1bmkiLCJzY2FuVHlwZSIsInN1Y2Nlc3MiLCIkdGhpcyIsImFyciIsIm5hbWUiLCJ1cmwiLCJvbkxvYWQiLCJ0aXRsZW5hbWUiLCJtZXRob2RzIiwic2V0RGF0YSIsIk9iamVjdCIsImtleXMiLCJ2YWwiLCJ0aGF0IiwibG9hZERhdGEiLCJhdHRycyIsImVsZSIsImluZGV4MiIsImNvbCIsIkhlYWRfVUlTdHlsZUdldEluZm8iLCJkYXRhSW5mbyIsImNsYXNzX2lkIiwidWlfc3R5bGVfaWQiLCJzdHlsZWRlZiIsInJlc3VsdCIsInN0eWxlX2RlZiIsImEiLCJpZCIsInNob3dDYW5jZWwiLCJjb25maXJtVGV4dCIsIkRpY3RHZXRJbmZvIiwiZGljdF9pZCIsImRpY3RfbmFtZSIsImxpc3QiLCJpdGVtTmFtZSIsInRleHQiLCJ2YWx1ZSIsImF0dHIiLCJsb2FkSW5pdEV2ZW50IiwiZWRfdHlwZSIsInN0YXJ0X3RyYW5zYWN0aW9uIiwiZXZlbnRfaWQiLCJlcnJfaW5mbyIsImpvaW4iLCJsZW5ndGgiLCJkaWN0SXRlbUxpc3QiLCJjaG9pY2VfbGlzdCIsInVuZGVmaW5lZCIsImkiLCJmaWVsZElkIiwiZm9yRWFjaCIsInNob3ciLCJhY3Rpb24iLCJhY3Rpb25fdHlwZSIsInRyYW5zbGF0ZSIsImVycl9tc2ciLCJvbnRhcCIsImdldEFwcCIsIm9uU2NhblZhbHVlIiwiaXRlbSIsImZpbmRkIiwiY3VySW5kZXgiLCJldmVudGlkIiwiZWR0eXBlIiwicHJvamVjdGlkIiwicmNsc2lkIiwicm9iamlkIiwidXNlcmxvZ2luIiwiY2xzaWQiLCJvYmppZCIsImRhdGFKc29uIiwib25DbGljayIsIm9uZXZlbnQiLCJvbmNoYW5nZSIsIm9uTW9kZWxWYWx1ZSIsImNsYXNzQXR0cl9leHRCdXR0b24iLCJwb3B1cENoYW5nZSIsImNoZWNrQ2hhbmdlIiwicG9wdXBfY2FuY2VsIiwicG9wdXBfc2F2YSIsIkRhdGFPYmpSdW5DdXN0b21FdmVudCIsImNsc19pZCIsImJ1dHRvbl9uYW1lIiwibWFzdGVyIiwiZW52aXJvbWVudCIsInR5cGUiLCJncm91cF9uYW1lIiwicmVhZG9ubHkiLCJidXR0b25faW1nIiwiYnV0dG9uX3Rvb2x0aXAiLCJpbmZvIiwib2JqX2F0dHIiLCJjbGFzc19uYW1lIiwiZXZlbnRfbmFtZSIsImRhdGFfb2JqX2lkIiwicHJqX2lkIiwicmVmX2Nsc19pZCIsInJlbF9vYmpfaWQiLCJ1c2VyX2xvZ2luIiwiZGF0YV9qc29uIiwiY29tcG9zZV9pbmZvIiwiZXh0X2luZm8iLCJpbnB1dF9wYXJhbSIsImluZGV4IiwiRGF0YU9ialJ1bkN1c3RvbUV2ZW50X1JldHVybiIsInJlcSIsImV4dGluZm8iLCJkIiwiYnV0dG9uX2NhbGxiYWNrIiwiZGF0YV9hdHRyIiwic3RyaW5naWZ5IiwiZXZlbnRzIiwiQWRkUGVyIiwidHJpbSIsImlucHV0cGFyYW1ldGVyIiwicHJpUmVsIiwic2VsZWN0X3JhbmdlIiwiSlNPTiIsIkRhdGFDbHMiLCJzYXZhIiwiYWRkIiwibWFzayIsIm1hc3Rlcl9jbHNfaWQiLCJtYXN0ZXJfb2JqX2lkIiwiY3JlYXRvciIsImNyZWF0b3JfbmFtZSIsIm5vdF90cmlnZ2VyX2V2ZW50IiwidXBkYXRlX2V4aXN0IiwicG9zdF9wcm9jZXNzIiwidHJhbnNsYXRlU3lzIiwiaWNvbiIsImR1cmF0aW9uIiwiYWZ0ZXJPSyIsImNhbmNlbCIsImRlbHRhIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUF3SkE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7ZUFDQTtFQUNBQTtJQUNBQztFQUNBO0VBQ0FDO0lBQ0E7TUFDQUM7TUFDQUM7TUFDQUM7TUFBQTtNQUNBQztNQUFBO01BQ0FDO01BQUE7TUFDQUM7TUFDQUM7TUFDQUM7TUFBQTtNQUNBQztNQUNBQztNQUNBQztNQUNBQztNQUNBQztNQUNBQztNQUVBQztNQUNBQztNQUNBQztRQUNBQztVQUNBQztRQUNBO01BQ0E7TUFDQUM7TUFDQUM7TUFDQUM7TUFDQUM7TUFDQUM7SUFDQTtFQUNBO0VBQ0FDO0lBQ0E7TUFDQTtNQUNBQztRQUNBQztRQUNBQztVQUVBO1lBQ0E7WUFDQTtjQUNBO2NBQ0Esb0VBQ0E7Z0JBQ0E7a0JBQ0FDO2tCQUNBO2dCQUNBO2NBQ0E7Z0JBQ0EsNEVBQ0FDO2tCQUNBLGdFQUNBQyw4QkFDQWhCO2dCQUNBO2dCQUNBO2tCQUNBO2tCQUNBYztrQkFDQTtnQkFDQTtjQUNBO1lBQ0E7VUFDQTtRQUVBO01BQ0E7SUFDQTtNQUNBO01BQ0FIO1FBQ0FNLG1FQUNBO01BQ0E7SUFDQTtFQUNBO0VBQ0FDO0lBQ0E7SUFDQVA7TUFDQXpCO0lBQ0E7SUFDQTtJQUNBLHlGQUNBaUM7SUFDQTtFQUNBO0VBRUFDO0lBQ0FDO01BQ0E7TUFDQTtNQUNBO01BRUFDO1FBQ0FDO1FBQ0FD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UUFFQTtRQUNBO1VBQ0E7VUFDQTtVQUNBO1lBQUE7Y0FDQVo7Y0FDQXpCO1lBQ0E7VUFBQTtVQUVBO1lBQ0FrRDtZQUNBQztZQUNBQztZQUNBQztZQUNBQztZQUNBQztZQUNBQztZQUNBQztZQUNBaEM7WUFDQWlDO1VBQ0E7VUFDQTtRQUNBO01BQ0E7SUFDQTtJQUNBQztNQUNBO0lBQ0E7SUFDQUM7TUFDQTtNQUNBO01BQ0E7UUFDQWI7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1VBQ0E7VUFDQTtVQUNBO1lBQUE7Y0FDQXRCO2NBQ0F6QjtZQUNBO1VBQUE7VUFDQTtZQUNBa0Q7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQWhDO1lBQ0FpQztVQUNBO1VBQ0E7UUFDQTtNQUNBO0lBRUE7SUFDQUc7TUFDQTtNQUNBO1FBQ0FkO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtZQUFBO2NBQ0F0QjtjQUNBekI7WUFDQTtVQUFBO1VBQ0E7WUFDQWtEO1lBQ0FDO1lBQ0FDO1lBQ0FDO1lBQ0FDO1lBQ0FDO1lBQ0FDO1lBQ0FDO1lBQ0FoQztZQUNBaUM7VUFDQTtVQUNBO1FBQ0E7TUFDQTtJQUVBO0lBQ0FJO01BQUE7TUFDQTtNQUNBO0lBQ0E7SUFDQUM7TUFDQTtNQUNBOztNQUVBO1FBQ0E1RTtVQUNBekI7VUFDQXVCO1VBQ0ErQjtVQUNBQztRQUNBO1FBQ0E7TUFDQTtNQUNBO1FBQ0E5QjtVQUNBekI7VUFDQXVCO1VBQ0ErQjtVQUNBQztRQUNBO1FBQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUVBO0lBQ0E7SUFDQStDO01BQ0E7SUFDQTtJQUNBQztNQUFBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO1FBQUE7UUFDQTtVQUNBeEc7UUFDQTtNQUNBO01BQ0FBO01BQ0E7SUFFQTtJQUNBeUc7TUFBQTtNQUNBO0lBQ0E7SUFDQUM7TUFBQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7UUFDQTtVQUNBLFVBQ0EzRTtVQUNBQTtVQUNBL0I7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O1lBQ0EsNkVBQ0FqSSxLQUNBcUU7WUFDQTtjQUNBO2dCQUNBO2dCQUNBO2NBQ0E7Y0FDQTNDO2dCQUNBekI7Z0JBQ0F1QjtnQkFDQStCO2dCQUNBQztjQUNBO1lBQ0E7Y0FDQXZEO2NBQ0F1QjtjQUNBK0I7Y0FDQUM7WUFDQTtZQUNBO1VBQ0E7WUFDQSwyRUFDQWMsS0FDQTtZQUNBO2NBQ0FyRTtjQUNBdUI7Y0FDQStCO2NBQ0FDO1lBQ0E7WUFFQTtVQUVBO1FBQ0E7VUFDQTlCO1lBQ0F6QjtZQUNBdUI7WUFDQStCO1lBQ0FDO1VBQ0E7UUFDQTtNQUNBO1FBQ0E7UUFDQTlCO1VBQ0F6QjtVQUNBdUI7VUFDQStCO1VBQ0FDO1FBQ0E7TUFDQTtJQUNBO0lBRUF3RztNQUFBO01BQ0F0STtRQUNBdUk7TUFDQTtJQUNBO0lBQ0FoRjtNQUNBLHlFQUNBO0lBQ0E7SUFDQTJFO01BQ0Esd0VBQ0E7SUFDQTtFQUNBO0FBQ0E7QUFBQSwyQiIsImZpbGUiOiIxNTkuanMiLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcblx0PHZpZXcgY2xhc3M9XCJ1bmktcGFnZS1tb2RhbC0zMDE4LTJcIj5cclxuXHRcdDwhLS0g6KGo5aS05qC35byPIC0tPlxyXG5cdFx0PHVuaS1mb3JtcyByZWY9XCJiYXNlRm9ybVwiIGxhYmVsLWFsaWduPVwicmlnaHRcIj5cclxuXHRcdFx0PHZpZXcgY2xhc3M9XCJ2LWhlYWRTdHlsZVwiIHYtZm9yPVwiKGl0ZW0saW5kZXgpIGluIGhlYWRfc3R5bGVkZWYuZm9ybS5pdGVtc1wiPlxyXG5cdFx0XHRcdDwhLS0g5pmu6YCa5biD5bGAIC0tPlxyXG5cdFx0XHRcdDx1bmktZm9ybXMtaXRlbSB2LWlmPVwiaXRlbS5uYW1lICE9ICdMYXlvdXQnJiYgaXRlbS5zaG93PT10cnVlXCIgOmxhYmVsPVwiaXRlbS5sYWJlbCArJ++8micgXCJcclxuXHRcdFx0XHRcdDpsYWJlbC13aWR0aD1cIml0ZW0ubGFiZWxXaWR0aCsncHgnXCI+XHJcblx0XHRcdFx0XHQ8IS0tIDx0ZXh0IGNsYXNzPVwidHh0X3RpdGxlXCIgOnN0eWxlPVwieyd3aWR0aCc6aXRlbS5sYWJlbFdpZHRoKydweCd9XCI+e3tpdGVtLmxhYmVsfX3vvJo8L3RleHQ+IC0tPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJmb3JtLWl0ZW0tc3BhblwiIHYtaWY9XCJpdGVtLmRpc2FibGVkXCJcclxuXHRcdFx0XHRcdFx0OnN0eWxlPVwiJ3dpZHRoOiBjYWxjKDEwMCUgLSAnK2l0ZW0ubGFiZWxXaWR0aCsncHgpOydcIj57e2l0ZW0udmFsdWV9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdDwhLS0g5LiL5ouJ5qGGLeWNlemAiSBpdGVtLnVzZURpY3Q/aXRlbS5kaWN0Oml0ZW0uc2VsZWN0aW9ucy0tPlxyXG5cdFx0XHRcdFx0PHVuaS1kYXRhLXNlbGVjdCBpZD1cImR2X3NlbGVjdFwiIHYtaWY9XCJpdGVtLm5hbWU9PSdTZWxlY3QnICYmICFpdGVtLmRpc2FibGVkXCJcclxuXHRcdFx0XHRcdFx0OnN0eWxlPVwiJ3dpZHRoOiBjYWxjKDEwMCUgLSAnK2l0ZW0ubGFiZWxXaWR0aC0xMCsncHgpOydcIlxyXG5cdFx0XHRcdFx0XHQ6Y2xhc3M9XCJpdGVtLmRpc2FibGVkPydpbnB1dC1kaXNhYmxlZCc6JydcIiB2LW1vZGVsPVwiaXRlbS52YWx1ZVwiIDpsb2NhbGRhdGE9XCJpdGVtLmRpY3RcIlxyXG5cdFx0XHRcdFx0XHRAY2hhbmdlPVwib25jaGFuZ2UoaXRlbSlcIiA6ZGlzYWJsZWQ9XCJpdGVtLmRpc2FibGVkXCIgOmNsZWFyPVwiZmFsc2VcIj48L3VuaS1kYXRhLXNlbGVjdD5cclxuXHRcdFx0XHRcdDwhLS0g5paH5pys5qGGL+aVsOWtl+ahhiAtLT5cclxuXHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiXHJcblx0XHRcdFx0XHRcdHYtaWY9XCIoaXRlbS5uYW1lPT0nSW5wdXQnIHx8IGl0ZW0ubmFtZT09J0lucHV0TnVtYmVyJykgJiYgIWl0ZW0uZGlzYWJsZWRcIj5cclxuXHRcdFx0XHRcdFx0PHRleHQgdi1pZj1cIml0ZW0uc2V0dGluZy5wcmVmaXhcIiBjbGFzcz1cInVuaS1pY29uXCIgOmNsYXNzPVwiW2l0ZW0uc2V0dGluZy5wcmVmaXhdXCJcclxuXHRcdFx0XHRcdFx0XHRAY2hhbmdlPVwiY2xhc3NBdHRyX2V4dEJ1dHRvbihpdGVtKVwiPiYjeGU1Njg7PC90ZXh0PlxyXG5cdFx0XHRcdFx0XHQ8aW5wdXQgY2xhc3M9XCJ1bmktaW5wdXRcIiA6Y2xhc3M9XCJpdGVtLmRpc2FibGVkPydpbnB1dC1kaXNhYmxlZCc6JydcIlxyXG5cdFx0XHRcdFx0XHRcdDp0eXBlPVwiaXRlbS5uYW1lPT0nSW5wdXQnPyd0ZXh0JzppdGVtLm5hbWU9PSdJbnB1dE51bWJlcic/J251bWJlcic6J3RleHQnXCJcclxuXHRcdFx0XHRcdFx0XHR2LW1vZGVsPVwiaXRlbS52YWx1ZVwiIDpkaXNhYmxlZD1cIml0ZW0uZGlzYWJsZWRcIiA6cGxhY2Vob2xkZXI9XCJpdGVtLnBsYWNlaG9sZGVyXCJcclxuXHRcdFx0XHRcdFx0XHQ6c3R5bGU9XCJ7J3dpZHRoJzppdGVtLnNldHRpbmcucHJlZml4ICYmIGl0ZW0uc2V0dGluZy5zdWZmaXg/Jzc4JSc6aXRlbS5zZXR0aW5nLnByZWZpeCB8fCBpdGVtLnNldHRpbmcuc3VmZml4Pyc4NyUnOic5NiUnfVwiXHJcblx0XHRcdFx0XHRcdFx0OmZvY3VzPVwiZm9jdXNGaWVsZElkID09IGl0ZW0uZmllbGRJZFwiIEBmb2N1cz1cIm9udGFwKGl0ZW0pXCIgQGNsaWNrPVwib25DbGljayhpdGVtKVwiXHJcblx0XHRcdFx0XHRcdFx0QGJsdXI9XCJvbmV2ZW50KGl0ZW0pXCIgLz5cclxuXHRcdFx0XHRcdFx0PHRleHQgdi1pZj1cIml0ZW0uc2V0dGluZy5zdWZmaXhcIiBjbGFzcz1cInVuaS1pY29uXCIgOmNsYXNzPVwiW2l0ZW0uc2V0dGluZy5zdWZmaXhdXCJcclxuXHRcdFx0XHRcdFx0XHRAY2xpY2s9XCJjbGFzc0F0dHJfZXh0QnV0dG9uKGl0ZW0pXCI+JiN4ZTU2ODs8L3RleHQ+XHJcblx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHQ8IS0tIOWkmuihjOaWh+acrCAtLT5cclxuXHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiIHYtaWY9XCJpdGVtLm5hbWU9PSdUZXh0YXJlYScgJiYgIWl0ZW0uZGlzYWJsZWRcIj5cclxuXHRcdFx0XHRcdFx0PHRleHRhcmVhIGNsYXNzPVwidW5pLWlucHV0XCIgOmNsYXNzPVwiaXRlbS5kaXNhYmxlZD8naW5wdXQtZGlzYWJsZWQnOicnXCIgOnZhbHVlPVwiaXRlbS52YWx1ZVwiXHJcblx0XHRcdFx0XHRcdFx0OmZvY3VzPVwiZm9jdXNGaWVsZElkID09IGl0ZW0uZmllbGRJZFwiIDpwbGFjZWhvbGRlcj1cIml0ZW0ucGxhY2Vob2xkZXJcIlxyXG5cdFx0XHRcdFx0XHRcdEBibHVyPVwib25Nb2RlbFZhbHVlKGl0ZW0pXCIgQGNsaWNrPVwib25DbGljayhpdGVtKVwiIDpkYXRhLWluZGV4PVwiaW5kZXhcIiBzdHlsZT1cImhlaWdodDo2MHB4O1wiXHJcblx0XHRcdFx0XHRcdFx0OnN0eWxlPVwieyd3aWR0aCc6Jzk2JSd9XCIgOmRpc2FibGVkPVwiaXRlbS5kaXNhYmxlZFwiPjwvdGV4dGFyZWE+XHJcblxyXG5cdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdFx0PCEtLSDlpI3pgInmoYYgLS0+XHJcblx0XHRcdFx0XHQ8Y2hlY2tib3gtZ3JvdXAgY2xhc3M9XCJjaGVja19yZW1lbWJlclB3ZFwiIHYtaWY9XCJpdGVtLm5hbWU9PSdDaGVja2JveCdcIlxyXG5cdFx0XHRcdFx0XHQ6Y2xhc3M9XCJpdGVtLmRpc2FibGVkPydpbnB1dC1kaXNhYmxlZCc6JydcIiBAY2hhbmdlPVwib25Nb2RlbFZhbHVlKGl0ZW0pXCJcclxuXHRcdFx0XHRcdFx0OmRpc2FibGVkPVwiaXRlbS5kaXNhYmxlZFwiIDpkYXRhLWlzY2hlY2s9XCJpdGVtLnZhbHVlXCI+XHJcblx0XHRcdFx0XHRcdDxsYWJlbD5cclxuXHRcdFx0XHRcdFx0XHQ8Y2hlY2tib3ggOnZhbHVlPVwiaXRlbS52YWx1ZVwiIDpjaGVja2VkPVwiaXRlbS52YWx1ZVwiIC8+XHJcblx0XHRcdFx0XHRcdFx0PHRleHQ+e3tpdGVtLmxhYmVsfX08L3RleHQ+XHJcblx0XHRcdFx0XHRcdDwvbGFiZWw+XHJcblx0XHRcdFx0XHQ8L2NoZWNrYm94LWdyb3VwPlxyXG5cdFx0XHRcdFx0PCEtLSBTd2l0Y2jlvIDlhbMgLS0+XHJcblx0XHRcdFx0XHQ8c3dpdGNoIGNsYXNzPVwiaW5wdXQtc3dpdGNoXCIgdi1pZj1cIml0ZW0ubmFtZT09J1N3aXRjaCdcIiA6Y2xhc3M9XCJpdGVtLmRpc2FibGVkPydpbnB1dC1kaXNhYmxlZCc6JydcIlxyXG5cdFx0XHRcdFx0XHQ6ZGlzYWJsZWQ9XCJpdGVtLmRpc2FibGVkXCIgdi1tb2RlbD1cIml0ZW0udmFsdWVcIiBAY2hhbmdlPVwib25Nb2RlbFZhbHVlKGl0ZW0pXCIgLz5cclxuXHRcdFx0XHRcdDwhLS0g5pel5pyf5pe26Ze0IC0tPlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCJcclxuXHRcdFx0XHRcdFx0di1pZj1cIihpdGVtLm5hbWU9PSdUaW1lUGlja2VyJyB8fCBpdGVtLm5hbWU9PSdEYXRlUGlja2VyJykgJiYgIWl0ZW0uZGlzYWJsZWRcIj5cclxuXHRcdFx0XHRcdFx0PHBpY2tlciBtb2RlPVwiZGF0ZVwiIGNsYXNzPVwiZGF0ZV9pcHV0XCIgOmNsYXNzPVwiaXRlbS5kaXNhYmxlZD8naW5wdXQtZGlzYWJsZWQnOicnXCJcclxuXHRcdFx0XHRcdFx0XHQ6ZGlzYWJsZWQ9XCJpdGVtLmRpc2FibGVkXCIgOnZhbHVlPVwiaXRlbS52YWx1ZVwiIEBjaGFuZ2U9XCJvbk1vZGVsVmFsdWUoaXRlbSlcIj5cclxuXHRcdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cInBpY2tlclwiPnt7aXRlbS52YWx1ZX19PC92aWV3PlxyXG5cdFx0XHRcdFx0XHQ8L3BpY2tlcj5cclxuXHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHQ8L3VuaS1mb3Jtcy1pdGVtPlxyXG5cdFx0XHRcdDwhLS0g5qCF5qC85biD5bGAIC0tPlxyXG5cdFx0XHRcdDx1bmktcm93IGNsYXNzPVwiZGVtby11bmktcm93XCIgdi1pZj1cIml0ZW0ubmFtZT09J0xheW91dCcgJiYgaXRlbS5zaG93PT10cnVlXCI+XHJcblx0XHRcdFx0XHQ8dW5pLWNvbCB2LWZvcj1cIihjb2xzLGtleSkgaW4gaXRlbS5zZXR0aW5nLmNvbExpc3RcIlxyXG5cdFx0XHRcdFx0XHQ6c3Bhbj1cIml0ZW0uc2V0dGluZy5zcGFuTGlzdD9pdGVtLnNldHRpbmcuc3Bhbkxpc3Rba2V5XToyNCAvIGl0ZW0uc2V0dGluZy5jb2xcIj5cclxuXHRcdFx0XHRcdFx0PHVuaS1mb3Jtcy1pdGVtIHYtaWY9XCJjb2xzIT1udWxsXCIgOmxhYmVsPVwiY29scy5sYWJlbCArJ++8midcIiA6bGFiZWwtd2lkdGg9XCJjb2xzLmxhYmVsV2lkdGgrJ3B4J1wiPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gPHRleHQgY2xhc3M9XCJ0eHRfdGl0bGVcIiA6c3R5bGU9XCJ7J3dpZHRoJzpjb2xzLmxhYmVsV2lkdGgrJ3B4J31cIj57e2NvbHMubGFiZWx9fe+8mjwvdGV4dD4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJmb3JtLWl0ZW0tc3BhblwiIHYtaWY9XCJjb2xzLmRpc2FibGVkXCI+e3tjb2xzLnZhbHVlfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCJcclxuXHRcdFx0XHRcdFx0XHRcdHYtaWY9XCIoY29scy5uYW1lPT0nSW5wdXQnIHx8IGNvbHMubmFtZT09J0lucHV0TnVtYmVyJykgJiYgIWNvbHMuZGlzYWJsZWRcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZXh0IHYtaWY9XCJjb2xzLnNldHRpbmcucHJlZml4XCIgY2xhc3M9XCJ1bmktaWNvblwiIDpjbGFzcz1cIltjb2xzLnNldHRpbmcucHJlZml4XVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdEBjaGFuZ2U9XCJvbmNoYW5nZShjb2xzKVwiPiYjeGU1Njg7PC90ZXh0PlxyXG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IGNsYXNzPVwidW5pLWlucHV0XCIgOmNsYXNzPVwiY29scy5kaXNhYmxlZD8naW5wdXQtZGlzYWJsZWQnOicnXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0OnR5cGU9XCJjb2xzLm5hbWU9PSdJbnB1dCc/J3RleHQnOmNvbHMubmFtZT09J0lucHV0TnVtYmVyJz8nbnVtYmVyJzondGV4dCdcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHR2LW1vZGVsPVwiY29scy52YWx1ZVwiIDpkaXNhYmxlZD1cImNvbHMuZGlzYWJsZWRcIiA6cGxhY2Vob2xkZXI9XCJjb2xzLnBsYWNlaG9sZGVyXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0OnN0eWxlPVwieyd3aWR0aCc6Y29scy5zZXR0aW5nLnByZWZpeCAmJiBjb2xzLnNldHRpbmcuc3VmZml4Pyc3OCUnOmNvbHMuc2V0dGluZy5wcmVmaXggfHwgY29scy5zZXR0aW5nLnN1ZmZpeD8nODclJzonOTYlJ31cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ6Zm9jdXM9XCJmb2N1c0ZpZWxkSWQgPT0gY29scy5maWVsZElkXCIgQGZvY3VzPVwib250YXAoY29scylcIiBAY2xpY2s9XCJvbkNsaWNrKGNvbHMpXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0QGJsdXI9XCJvbmV2ZW50KGNvbHMpXCIgLz5cclxuXHRcdFx0XHRcdFx0XHRcdDx0ZXh0IHYtaWY9XCJjb2xzLnNldHRpbmcuc3VmZml4XCIgY2xhc3M9XCJ1bmktaWNvblwiIDpjbGFzcz1cIltjb2xzLnNldHRpbmcuc3VmZml4XVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdEBjbGljaz1cIm9uY2hhbmdlKGNvbHMpXCI+JiN4ZTU2ODs8L3RleHQ+XHJcblx0XHRcdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0g5LiL5ouJ5qGGLeWNlemAiSBjb2xzLnVzZURpY3Q/Y29scy5kaWN0OmNvbHMuc2VsZWN0aW9ucy0tPlxyXG5cdFx0XHRcdFx0XHRcdDx1bmktZGF0YS1zZWxlY3QgaWQ9XCJkdl9zZWxlY3RcIiB2LWlmPVwiY29scy5uYW1lPT0nU2VsZWN0JyAmJiAhY29scy5kaXNhYmxlZFwiXHJcblx0XHRcdFx0XHRcdFx0XHQ6Y2xhc3M9XCJjb2xzLmRpc2FibGVkPydpbnB1dC1kaXNhYmxlZCc6JydcIiB2LW1vZGVsPVwiY29scy52YWx1ZVwiIDpsb2NhbGRhdGE9XCJjb2xzLmRpY3RcIlxyXG5cdFx0XHRcdFx0XHRcdFx0QGNoYW5nZT1cIm9uY2hhbmdlKGNvbHMpXCIgOmRpc2FibGVkPVwiY29scy5kaXNhYmxlZFwiIDpjbGVhcj1cImZhbHNlXCI+PC91bmktZGF0YS1zZWxlY3Q+XHJcblx0XHRcdFx0XHRcdFx0PCEtLSDlpJrooYzmlofmnKwgLS0+XHJcblx0XHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCIgdi1pZj1cImNvbHMubmFtZT09J1RleHRhcmVhJyAmJiAhY29scy5kaXNhYmxlZFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRleHRhcmVhIGNsYXNzPVwidW5pLWlucHV0XCIgOnZhbHVlPVwiY29scy52YWx1ZVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdDpjbGFzcz1cImNvbHMuZGlzYWJsZWQ/J2lucHV0LWRpc2FibGVkJzonJ1wiIDpwbGFjZWhvbGRlcj1cImNvbHMucGxhY2Vob2xkZXJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ6Zm9jdXM9XCJmb2N1c0ZpZWxkSWQgPT0gY29scy5maWVsZElkXCIgQGJsdXI9XCJvbk1vZGVsVmFsdWUoY29scylcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRAY2xpY2s9XCJvbkNsaWNrKGNvbHMpXCIgc3R5bGU9XCJoZWlnaHQ6NjBweDtcIiA6c3R5bGU9XCJ7J3dpZHRoJzonOTYlJ31cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ6ZGlzYWJsZWQ9XCJjb2xzLmRpc2FibGVkXCI+PC90ZXh0YXJlYT5cclxuXHRcdFx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHRcdFx0PCEtLSDlpI3pgInmoYYgLS0+XHJcblx0XHRcdFx0XHRcdFx0PGNoZWNrYm94LWdyb3VwIGNsYXNzPVwiY2hlY2tfcmVtZW1iZXJQd2RcIiB2LWlmPVwiY29scy5uYW1lPT0nQ2hlY2tib3gnXCJcclxuXHRcdFx0XHRcdFx0XHRcdDpjbGFzcz1cImNvbHMuZGlzYWJsZWQ/J2lucHV0LWRpc2FibGVkJzonJ1wiIDpkaXNhYmxlZD1cIml0ZW0uZGlzYWJsZWRcIlxyXG5cdFx0XHRcdFx0XHRcdFx0QGNoYW5nZT1cIm9uTW9kZWxWYWx1ZShjb2xzKVwiIDpkYXRhLWlzY2hlY2s9XCJjb2xzLnZhbHVlXCJcclxuXHRcdFx0XHRcdFx0XHRcdDpzdHlsZT1cInsnbWFyZ2luLWxlZnQnOicxMHJweCd9XCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWw+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxjaGVja2JveCA6dmFsdWU9XCJjb2xzLnZhbHVlXCIgOmNoZWNrZWQ9XCJjb2xzLnZhbHVlXCIgLz5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PHRleHQ+e3tjb2xzLmxhYmVsfX08L3RleHQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L2xhYmVsPlxyXG5cdFx0XHRcdFx0XHRcdDwvY2hlY2tib3gtZ3JvdXA+XHJcblx0XHRcdFx0XHRcdFx0PCEtLSBTd2l0Y2jlvIDlhbMgLS0+XHJcblx0XHRcdFx0XHRcdFx0PHN3aXRjaCB2LWlmPVwiY29scy5uYW1lPT0nU3dpdGNoJ1wiIDpjbGFzcz1cImNvbHMuZGlzYWJsZWQ/J2lucHV0LWRpc2FibGVkJzonJ1wiXHJcblx0XHRcdFx0XHRcdFx0XHQ6ZGlzYWJsZWQ9XCJpdGVtLmRpc2FibGVkXCIgdi1tb2RlbD1cImNvbHMudmFsdWVcIiBAY2hhbmdlPVwib25Nb2RlbFZhbHVlKGNvbHMpXCJcclxuXHRcdFx0XHRcdFx0XHRcdDpzdHlsZT1cInsnbWFyZ2luLWxlZnQnOicxMHJweCd9XCIgLz5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tIOaXpeacn+aXtumXtCAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImlucHV0LXdyYXBwZXJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0di1pZj1cIihjb2xzLm5hbWU9PSdUaW1lUGlja2VyJyB8fCBjb2xzLm5hbWU9PSdEYXRlUGlja2VyJykgJiYgIWNvbHMuZGlzYWJsZWRcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxwaWNrZXIgbW9kZT1cImRhdGVcIiBjbGFzcz1cImRhdGVfaXB1dFwiIDpjbGFzcz1cImNvbHMuZGlzYWJsZWQ/J2lucHV0LWRpc2FibGVkJzonJ1wiXHJcblx0XHRcdFx0XHRcdFx0XHRcdDpkaXNhYmxlZD1cIml0ZW0uZGlzYWJsZWRcIiA6dmFsdWU9XCJjb2xzLnZhbHVlXCIgQGNoYW5nZT1cIm9uTW9kZWxWYWx1ZShjb2xzKVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cInBpY2tlclwiPnt7Y29scy52YWx1ZX19PC92aWV3PlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9waWNrZXI+XHJcblx0XHRcdFx0XHRcdFx0PC92aWV3PlxyXG5cclxuXHRcdFx0XHRcdFx0PC91bmktZm9ybXMtaXRlbT5cclxuXHRcdFx0XHRcdDwvdW5pLWNvbD5cclxuXHRcdFx0XHQ8L3VuaS1yb3c+XHJcblx0XHRcdDwvdmlldz5cclxuXHRcdDwvdW5pLWZvcm1zPlxyXG5cdFx0PHZpZXcgY2xhc3M9XCJ2aWV3LWZsb29yXCI+XHJcblx0XHRcdDxidXR0b24gdHlwZT1cImRlZmF1bHRcIiBAdGFwPVwic2F2YVwiIGNsYXNzPVwiYnRuX2FkZFwiPnt7dGl0bGV9fTwvYnV0dG9uPlxyXG5cdFx0XHQ8YnV0dG9uIHR5cGU9XCJkZWZhdWx0XCIgQHRhcD1cImNhbmNlbFwiIGNsYXNzPVwiYnRuX2NhbmNlbFwiPnt7dHJhbnNsYXRlU3lzKCdjYW5jZWwnKX19PC9idXR0b24+XHJcblx0XHQ8L3ZpZXc+XHJcblx0XHQ8IS0tIOaZrumAmuW8ueeqlyB0b3AgYm90dG9tIGNlbnRlciBsZWZ0IHJpZ2h0IC0tPlxyXG5cdFx0PHZpZXc+XHJcblx0XHRcdDx1bmktcG9wdXAgY2xhc3M9XCJ2aWV3LXBvcHVwXCIgcmVmPVwicG9wdXBcIiBiYWNrZ3JvdW5kLWNvbG9yPVwiI2ZmZlwiIEBjaGFuZ2U9XCJwb3B1cENoYW5nZVwiPlxyXG5cdFx0XHRcdDx2aWV3IGNsYXNzPVwicG9wdXAtaGVhZGVyXCI+e3tjaGVja19saXN0LnRpdGxlfX08L3ZpZXc+XHJcblx0XHRcdFx0PHZpZXcgY2xhc3M9XCJwb3B1cC1jb250ZW50XCIgOmNsYXNzPVwieyAncG9wdXAtaGVpZ2h0JzogcG9wdXBUeXBlID09PSAnbGVmdCcgfHwgcG9wdXBUeXBlID09PSAncmlnaHQnIH1cIlxyXG5cdFx0XHRcdFx0OnN0eWxlPVwieyd3aWR0aCc6Y2hlY2tfbGlzdC53aWR0aD9jaGVja19saXN0LndpZHRoKydweCc6JzIwMHB4JywnaGVpZ2h0JzpjaGVja19saXN0LmhlaWdodD9jaGVja19saXN0LmhlaWdodCsncHgnOic4OCUnfVwiPlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJwb3B1cC1jb250XCIgOnN0eWxlPVwieydoZWlnaHQnOmNoZWNrX2xpc3QuaGVpZ2h0P2NoZWNrX2xpc3QuaGVpZ2h0LTQ1KydweCc6JzQxNXB4J31cIj5cclxuXHRcdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJ2aWV3X3BvcHVwX0NoZWNrTGlzdFwiIHYtZm9yPVwiKGl0ZW0saW5kZXgpIGluIGNoZWNrX2xpc3QuaXRlbXNcIj5cclxuXHRcdFx0XHRcdFx0XHQ8Y2hlY2tib3gtZ3JvdXAgY2xhc3M9XCJjaGVja19saXN0XCIgQGNoYW5nZT1cImNoZWNrQ2hhbmdlXCIgOmRhdGEtaXNjaGVjaz1cIml0ZW0uY2hlY2tcIlxyXG5cdFx0XHRcdFx0XHRcdFx0OmRhdGEtaW5kZXg9XCJpbmRleFwiIDpzdHlsZT1cInsnbWFyZ2luLWxlZnQnOiAnMTBycHgnfVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGxhYmVsPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8Y2hlY2tib3ggOnZhbHVlPVwiaXRlbS5jaGVja1wiIDpjaGVja2VkPVwiaXRlbS5jaGVja1wiIC8+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDx0ZXh0Pnt7aXRlbS5uYW1lfX08L3RleHQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L2xhYmVsPlxyXG5cdFx0XHRcdFx0XHRcdDwvY2hlY2tib3gtZ3JvdXA+XHJcblx0XHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwicG9wdXAtZm9vdGVyXCI+XHJcblx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImRlZmF1bHRcIiBAdGFwPVwicG9wdXBfc2F2YVwiIGNsYXNzPVwiYnRuX3BvcHVwX2FkZFwiPnt7dHJhbnNsYXRlU3lzKCdvaycpfX08L2J1dHRvbj5cclxuXHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiZGVmYXVsdFwiIEB0YXA9XCJwb3B1cF9jYW5jZWxcIlxyXG5cdFx0XHRcdFx0XHRcdGNsYXNzPVwiYnRuX3BvcHVwX2NhbmNlbFwiPnt7dHJhbnNsYXRlU3lzKCdjYW5jZWwnKX19PC9idXR0b24+XHJcblx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHQ8L3VuaS1wb3B1cD5cclxuXHRcdDwvdmlldz5cclxuXHQ8L3ZpZXc+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0PlxyXG5cdGltcG9ydCBCYXNlNjQgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9qcy1iYXNlNjQvYmFzZTY0LmpzJ1xyXG5cdGltcG9ydCB1dGlscyBmcm9tIFwiQC9qcy91dGlscy5qc1wiXHJcblx0ZXhwb3J0IGRlZmF1bHQge1xyXG5cdFx0bW9kdWxlczoge1xyXG5cdFx0XHRCYXNlNjQsXHJcblx0XHR9LFxyXG5cdFx0ZGF0YSgpIHtcclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoJ2FkZDInKSxcclxuXHRcdFx0XHRwYXJhbToge30sXHJcblx0XHRcdFx0ZWRpdF9pbml0YWxfZXZlbnQ6IFwiXCIsIC8v5by556qX5Yid5aeL5YyW5LqL5Lu2SURcclxuXHRcdFx0XHRlZGl0X29rX2V2ZW50OiBcIlwiLCAvL+W8ueeql+eCueWHu09LIOinpuWPkeS6i+S7tklEXHJcblx0XHRcdFx0ZWRpdF9zZWxlY3RfY29tcG9zZV9ldmVudDogXCJcIiwgLy/pgInmi6nnu4TmiJDlr7nosaHml7bosIPnlKhcclxuXHRcdFx0XHRlZGl0X2NvbXBvc2VfY2xzX2lkOiBcIlwiLFxyXG5cdFx0XHRcdGdsb2JhbF9hdHRyOiBbXSxcclxuXHRcdFx0XHRyZWZkYXRhc3RvcmU6IFtdLCAvL+W8leeUqOaVsOaNruWtmOWCqOWMui8vIHthdHRyOidHX1BSSl8nICsgYmluZGF0dHIgKyAnX0lEJywgdmFsdWU6aW5mby5pZH1cclxuXHRcdFx0XHRzY2FuQ29kZVZhbDogXCJcIixcclxuXHRcdFx0XHRzdWJDbGFzc0F0dHJMaXN0OiBbXSxcclxuXHRcdFx0XHRzdWJQYW5lbExpc3Q6IFtdLFxyXG5cdFx0XHRcdHN1YkNsYXNzR3JpZFN0eWxlOiBbXSxcclxuXHRcdFx0XHRwb3B1cFR5cGU6IFwiY2VudGVyXCIsXHJcblx0XHRcdFx0Y2hlY2tfbGlzdDoge30sXHJcblxyXG5cdFx0XHRcdGZvY3VzRmllbGRJZDogXCJcIixcclxuXHRcdFx0XHRmb2N1c09sZEZpZWxkSWQ6IFwiXCIsXHJcblx0XHRcdFx0aGVhZF9zdHlsZWRlZjoge1xyXG5cdFx0XHRcdFx0Zm9ybToge1xyXG5cdFx0XHRcdFx0XHRpdGVtczogW11cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGFmdGVyX29rOiB7fSxcclxuXHRcdFx0XHRhY3Rpdml0eTogbnVsbCxcclxuXHRcdFx0XHRyZWNlaXZlcjogbnVsbCxcclxuXHRcdFx0XHRpbnRlbnRGaWx0ZXI6IG51bGwsXHJcblx0XHRcdFx0Y29udGVudDogJydcclxuXHRcdFx0fTtcclxuXHRcdH0sXHJcblx0XHRvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAoZSkge1xyXG5cdFx0XHRpZiAoZS5pbmRleCA9PSAwKSB7XHJcblx0XHRcdFx0Y29uc3QgJHRoaXMgPSB0aGlzXHJcblx0XHRcdFx0dW5pLnNjYW5Db2RlKHtcclxuXHRcdFx0XHRcdHNjYW5UeXBlOiBbXCJxckNvZGVcIl0sXHJcblx0XHRcdFx0XHRzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICgkdGhpcy5mb2N1c0ZpZWxkSWQpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBpdGVtcyA9ICR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5pdGVtcyB8fCBbXVxyXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgaW4gaXRlbXMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGVsZSA9IGl0ZW1zW2ldXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZWxlLm5hbWUgPT0gJ0lucHV0JyB8fCBlbGUubmFtZSA9PSAnSW5wdXROdW1iZXInIHx8IGVsZS5uYW1lID09XHJcblx0XHRcdFx0XHRcdFx0XHRcdCdUZXh0YXJlYScpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCR0aGlzLmZvY3VzRmllbGRJZCA9PSBlbGUuZmllbGRJZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLm9uU2NhblZhbHVlKGVsZSwgcmVzLnJlc3VsdClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChlbGUubmFtZSA9PSBcIkxheW90XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGN1ckluZGV4ID0gKGVsZS5zZXR0aW5nLmNvbExpc3QgfHwgW10pLmZpbmRJbmRleCgoY29sLCBpbmRleDIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0YXJyKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIChjb2wubmFtZSA9PSAnSW5wdXQnIHx8IGNvbC5uYW1lID09ICdJbnB1dE51bWJlcicgfHwgY29sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5uYW1lID09ICdUZXh0YXJlYScpICYmICR0aGlzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZm9jdXNGaWVsZElkID09IGNvbC5maWVsZElkO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoY3VySW5kZXggPiAtMSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBjb2wgPSBlbGUuc2V0dGluZy5jb2xMaXN0W2N1ckluZGV4XVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLm9uU2NhblZhbHVlKGNvbCwgcmVzLnJlc3VsdClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVha1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdH0gZWxzZSBpZiAoZS5pbmRleCA9PSAxKSB7XHJcblx0XHRcdFx0Ly/liLfmlrBcclxuXHRcdFx0XHR1bmkucmVkaXJlY3RUbyh7XHJcblx0XHRcdFx0XHR1cmw6ICcuLi9tb2RhbC8zMDE4XzI/cGFyYW09JyArIEpTT04uc3RyaW5naWZ5KHRoaXMuJGRhdGEucGFyYW0pICtcclxuXHRcdFx0XHRcdFx0XCImdGl0bGVuYW1lPVwiICsgdGhpcy4kZGF0YS50aXRsZVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0b25Mb2FkKG9wdGlvbnMpIHtcclxuXHRcdFx0Ly8gY29uc29sZS5sb2cob3B0aW9ucyk7XHJcblx0XHRcdHVuaS5zZXROYXZpZ2F0aW9uQmFyVGl0bGUoe1xyXG5cdFx0XHRcdHRpdGxlOiBvcHRpb25zLnRpdGxlbmFtZVxyXG5cdFx0XHR9KTsgLy/orr7nva7pobbpg6jmoIfpopggXHJcblx0XHRcdHRoaXMuJGRhdGEucGFyYW0gPSBKU09OLnBhcnNlKG9wdGlvbnMucGFyYW0pO1xyXG5cdFx0XHR0aGlzLiRkYXRhLnRpdGxlID0gdGhpcy4kZGF0YS5wYXJhbS5BZGRfQnRuTmFtZSA/IHRoaXMuJGRhdGEucGFyYW0uQWRkX0J0bk5hbWUgOiBvcHRpb25zXHJcblx0XHRcdFx0LnRpdGxlbmFtZTsgLy/orr7nva7mjInpkq7mloflrZdcclxuXHRcdFx0dGhpcy5sb2FkRGF0YShvcHRpb25zLnBhcmFtVmFsdWUpXHJcblx0XHR9LFxyXG5cclxuXHRcdG1ldGhvZHM6IHtcclxuXHRcdFx0c2V0RGF0YTogZnVuY3Rpb24ob2JqKSB7XHJcblx0XHRcdFx0bGV0IHRoYXQgPSB0aGlzO1xyXG5cdFx0XHRcdGxldCBrZXlzID0gW107XHJcblx0XHRcdFx0bGV0IHZhbCwgZGF0YTtcclxuXHJcblx0XHRcdFx0T2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xyXG5cdFx0XHRcdFx0a2V5cyA9IGtleS5zcGxpdChcIi5cIik7XHJcblx0XHRcdFx0XHR2YWwgPSBvYmpba2V5XTtcclxuXHRcdFx0XHRcdGRhdGEgPSB0aGF0LiRkYXRhO1xyXG5cdFx0XHRcdFx0a2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleTIsIGluZGV4KSB7XHJcblx0XHRcdFx0XHRcdGlmIChpbmRleCArIDEgPT0ga2V5cy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGF0LiRzZXQoZGF0YSwga2V5MiwgdmFsKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIWRhdGFba2V5Ml0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoYXQuJHNldChkYXRhLCBrZXkyLCB7fSk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGRhdGEgPSBkYXRhW2tleTJdO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0sXHJcblx0XHRcdGFzeW5jIGxvYWREYXRhKHBhcmFtVmFsdWUpIHtcclxuXHJcblx0XHRcdFx0Ly/ojrflj5bmlbDmja7nsbvnmoToh6rlrprkuYnooajljZXlj4LmlbBcclxuXHRcdFx0XHRhd2FpdCB0aGlzLkhlYWRfVUlTdHlsZUdldEluZm8odGhpcy5wYXJhbS5EYXRhQ2xzPy5pZCwgdGhpcy5wYXJhbS5VSV9TdHlsZT8uSUQpO1xyXG5cdFx0XHRcdC8v5Lyg5YWl5Y+C5pWw5YC8XHJcblx0XHRcdFx0aWYgKHBhcmFtVmFsdWUpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGF0dHJzID0gcGFyYW1WYWx1ZS5hdHRycyB8fCBbXTtcclxuXHRcdFx0XHRcdCh0aGlzLiRkYXRhLmhlYWRfc3R5bGVkZWY/LmZvcm0/Lml0ZW1zIHx8IFtdKS5mb3JFYWNoKGFzeW5jIChlbGUsIGluZGV4KSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmIChlbGUubmFtZSAhPSBcIkxheW91dFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0YXR0cnMuZm9yRWFjaChhc3luYyAoZWxlMiwgaW5kZXgyKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZWxlLmZpZWxkSWQgPT0gZWxlMi5uYW1lKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVsZS52YWx1ZSA9IGVsZTIudmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0ZWxlLnNldHRpbmcuY29sTGlzdC5mb3JFYWNoKGFzeW5jIChjb2wpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChjb2wpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YXR0cnMuZm9yRWFjaChhc3luYyAoZWxlMixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpbmRleDIpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29sLmZpZWxkSWQgPT0gZWxlMi5uYW1lKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb2wudmFsdWUgPSBlbGUyLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zb2xlLmxvZyh0aGlzLiRkYXRhLnBhcmFtKTtcclxuXHJcblx0XHRcdH0sXHJcblx0XHRcdGFzeW5jIEhlYWRfVUlTdHlsZUdldEluZm8oY2xhc3NfaWQsIHN0eWxlX2lkKSB7IC8v6I635Y+W6Ieq5a6a5LmJ6KGo5Y2V5qC35byPXHJcblx0XHRcdFx0dmFyICR0aGlzID0gdGhpcztcclxuXHRcdFx0XHR2YXIgZGF0YUluZm8gPSB7XHJcblx0XHRcdFx0XHRjbGFzc19pZDogY2xhc3NfaWQsXHJcblx0XHRcdFx0XHR1aV9zdHlsZV9pZDogc3R5bGVfaWQsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHR0aGlzLiRzdG9yZS5kaXNwYXRjaCgnVUlTdHlsZUdldEluZm8nLCBkYXRhSW5mbykudGhlbihyZXQgPT4ge1xyXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2cocmV0KTtcclxuXHRcdFx0XHRcdGlmIChyZXQuZXJyX2NvZGUgPT0gMCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgc3R5bGVkZWYgPSBcIlwiO1xyXG5cdFx0XHRcdFx0XHRpZiAocmV0LnJlc3VsdC5zdHlsZV9kZWYpIHtcclxuXHRcdFx0XHRcdFx0XHQvL21vYm94MueahHN0eWxlX2RlZuaYr2pzb27lrZfnrKbkuLJcclxuXHRcdFx0XHRcdFx0XHRzdHlsZWRlZiA9IHJldC5yZXN1bHQuc3R5bGVfZGVmLnJlcGxhY2UoL1xcXFwvZywgXCJcIik7XHJcblx0XHRcdFx0XHRcdFx0Ly9tb2JveDPnmoRzdHlsZV9kZWbmmK9iYXNlNjTlrZfnrKbkuLJcclxuXHRcdFx0XHRcdFx0XHRpZiAoIXJldC5yZXN1bHQuc3R5bGVfZGVmLmluY2x1ZGVzKCdcIicpKSBzdHlsZWRlZiA9IEJhc2U2NC5kZWNvZGUocmV0XHJcblx0XHRcdFx0XHRcdFx0XHQucmVzdWx0XHJcblx0XHRcdFx0XHRcdFx0XHQuc3R5bGVfZGVmKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHQkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmID0gcmV0LnJlc3VsdC5zdHlsZV9kZWYgPyBKU09OLnBhcnNlKHN0eWxlZGVmKSA6IHt9O1xyXG5cdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmKTtcclxuXHRcdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zLmZvckVhY2goYXN5bmMgKGVsZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRlbGUuc2hvdyA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGVsZS51c2VEaWN0ID09IHRydWUpIHsgLy/liKTmlq11c2VEaWN05piv5ZCm5L2/55So5a2X5YW4XHJcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLkRpY3RHZXRJbmZvKGVsZS5iaW5kLmRpY3QsIGluZGV4LCAnbWFzdCcpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRpZiAoJHRoaXMuZm9jdXNGaWVsZElkID09IFwiXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChlbGUubmFtZSA9PSAnSW5wdXQnIHx8IGVsZS5uYW1lID09ICdJbnB1dE51bWJlcicgfHwgZWxlLm5hbWUgPT1cclxuXHRcdFx0XHRcdFx0XHRcdFx0J1RleHRhcmVhJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5zZXREYXRhKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmb2N1c0ZpZWxkSWQ6IGVsZS5maWVsZElkXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdGlmICgkdGhpcy5oZWFkX3N0eWxlZGVmLmV2ZW50Py5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5ldmVudC5mb3JFYWNoKGFzeW5jIChhKSA9PiB7IC8v5Yik5pat5piv5ZCm5piv5Yid5aeL5YyW5LqL5Lu2XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoYS5ldmVudF9pZCA9PSBcImluaXRpYWxcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhd2FpdCAkdGhpcy5sb2FkSW5pdEV2ZW50KGEuc2NyaXBfaWQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhLmV2ZW50X2lkID09ICdhZnRlcl9vaycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuYWZ0ZXJfb2sgPSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWQ6IGEuc2NyaXBfaWQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bmFtZTogYS5zY3JpcF9uYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJlcnJvclwiKSArIFwiMVwiLFxyXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHJldC5lcnJfbXNnLFxyXG5cdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KS5jYXRjaChleCA9PiB7XHJcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhleCk7XHJcblx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwiZXJyb3JcIikgKyBcIjEuMVwiLFxyXG5cdFx0XHRcdFx0XHRjb250ZW50OiBleC5lcnJNc2csXHJcblx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0fSxcclxuXHRcdFx0YXN5bmMgRGljdEdldEluZm8oZGljdCwgaW5kZXgsIHR5cGUpIHsgLy9Nb2JveDPlvpfliLDlvpfliLDlrZflhbjkv6Hmga/lrZflhbjpobnliJfooahcclxuXHRcdFx0XHR0aGlzLmRhdGEgPSBbXTtcclxuXHRcdFx0XHR2YXIgJHRoaXMgPSB0aGlzO1xyXG5cdFx0XHRcdHZhciBkYXRhSW5mbyA9IHtcclxuXHRcdFx0XHRcdGRpY3RfaWQ6IGRpY3QuaWQsXHJcblx0XHRcdFx0XHRkaWN0X25hbWU6IGRpY3QubmFtZVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coZGF0YUluZm8pO1xyXG5cdFx0XHRcdHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdEaWN0R2V0SW5mbycsIGRhdGFJbmZvKS50aGVuKGFzeW5jIChzdWNjZXNzKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhzdWNjZXNzKTtcclxuXHRcdFx0XHRcdGlmIChzdWNjZXNzLmVycl9jb2RlID09IDApIHtcclxuXHRcdFx0XHRcdFx0aWYgKHR5cGUgPT0gJ21hc3QnKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIGxpc3QgPSBbXTtcclxuXHRcdFx0XHRcdFx0XHR2YXIgaXRlbU5hbWUgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRzdWNjZXNzLnJlc3VsdC5kaWN0X2l0ZW1fbGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoaXRlbS5pc19kZWZhdWx0ID09ICcxJylcclxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbU5hbWUgPSBpdGVtLm5hbWU7XHJcblx0XHRcdFx0XHRcdFx0XHRsaXN0LnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBpdGVtLnZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogaXRlbS5uYW1lLFxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0Ly/mnInpu5jorqTlgLzvvIzmmL7npLrpu5jorqTlgLxcclxuXHRcdFx0XHRcdFx0XHRpZiAoaXRlbU5hbWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdCR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5pdGVtc1tpbmRleF0udmFsdWUgPSBpdGVtTmFtZTtcclxuXHRcdFx0XHRcdFx0XHRcdHZhciBhdHRyID0gJHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zW2luZGV4XS5maWVsZElkO1xyXG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW2F0dHJdID0gaXRlbU5hbWU7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdCR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5pdGVtc1tpbmRleF0uZGljdCA9IGxpc3Q7XHJcblx0XHRcdFx0XHRcdFx0Ly8gJHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zW2luZGV4XS5kaWN0aXRlbT1zdWNjZXNzLnJlc3VsdDtcclxuXHRcdFx0XHRcdFx0XHQvLyB0aGlzLiRzdG9yZS5jb21taXQoXCJjbGFzc0F0dHJMaXN0XCIsICR0aGlzLiRkYXRhLmNsYXNzQXR0ckxpc3QpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdC8vICR0aGlzLiRkYXRhLnN1YkNsYXNzQXR0ckxpc3RbaW5kZXhdLmF0dHJfbGlzdFtrZXldLmRpY3RpdGVtPXN1Y2Nlc3MucmVzdWx0O1xyXG5cdFx0XHRcdFx0XHRcdC8vIHRoaXMuJHN0b3JlLmNvbW1pdChcInN1YkNsYXNzQXR0ckxpc3RcIiwgJHRoaXMuJGRhdGEuc3ViQ2xhc3NBdHRyTGlzdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJlcnJvclwiKSArIFwiMS4yXCIsXHJcblx0XHRcdFx0XHRcdFx0Y29udGVudDogc3VjY2Vzcy5lcnJfbXNnLFxyXG5cdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KS5jYXRjaChleCA9PiB7XHJcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhleCk7XHJcblx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwiZXJyb3JcIikgKyBcIjEuM1wiLFxyXG5cdFx0XHRcdFx0XHRjb250ZW50OiBleC5lcnJNc2csXHJcblx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRhc3luYyBsb2FkSW5pdEV2ZW50KGV2ZW50aWQpIHtcclxuXHRcdFx0XHR2YXIgJHRoaXMgPSB0aGlzO1xyXG5cdFx0XHRcdGlmICghZXZlbnRpZC5pbmNsdWRlcygneycpKSBldmVudGlkID0gJ3snICsgZXZlbnRpZCArICd9JztcclxuXHRcdFx0XHR2YXIgZGF0YUluZm8gPSB7XHJcblx0XHRcdFx0XHRlZF90eXBlOiAwLFxyXG5cdFx0XHRcdFx0c3RhcnRfdHJhbnNhY3Rpb246IHRydWUsXHJcblx0XHRcdFx0XHRjbGFzc19pZDogdGhpcy5wYXJhbS5EYXRhQ2xzLmlkLFxyXG5cdFx0XHRcdFx0ZXZlbnRfaWQ6IGV2ZW50aWQsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhkYXRhSW5mbyk7XHJcblx0XHRcdFx0Ly8gcmV0dXJuO1xyXG5cdFx0XHRcdHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdydW5DdXN0b21FdmVudCcsIGRhdGFJbmZvKS50aGVuKHN1Y2Nlc3MgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coc3VjY2Vzcyk7XHJcblx0XHRcdFx0XHRpZiAoc3VjY2Vzcy5lcnJfY29kZSA9PSAwKSB7XHJcblx0XHRcdFx0XHRcdHZhciBkYXRhID0gc3VjY2Vzcy5yZXN1bHQ7XHJcblx0XHRcdFx0XHRcdGlmIChkYXRhLnJldCAhPSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIHRpcCA9IGRhdGEuZXJyX2luZm8gPyB0eXBlb2YgZGF0YS5lcnJfaW5mbyA9PSAnc3RyaW5nJyA/IGRhdGFcclxuXHRcdFx0XHRcdFx0XHRcdC5lcnJfaW5mbyA6IGRhdGFcclxuXHRcdFx0XHRcdFx0XHRcdC5lcnJfaW5mby5qb2luKCc8YnIvPicpIDogJyc7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGRhdGEucmV0ID09IDgwMSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMucGFyYW0uT25seV9TY3JpcHRfRXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHBvcyA9IHRpcC5pbmRleE9mKFwi77yaXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocG9zID4gLTEpIHRpcCA9IHRpcC5zdWJzdHJpbmcocG9zICsgMSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiB0aXAsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRpcCArICcsJyArIHRoaXMudHJhbnNsYXRlU3lzKCd0aXAnKSArICc6JyArIGRhdGEucmV0LFxyXG5cdFx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgdGlwID0gZGF0YS5pbmZvID8gdHlwZW9mIGRhdGEuaW5mbyA9PSAnc3RyaW5nJyA/IGRhdGEuaW5mbyA6IGRhdGEuaW5mb1xyXG5cdFx0XHRcdFx0XHRcdFx0LmpvaW4oXHJcblx0XHRcdFx0XHRcdFx0XHRcdCc8YnIvPicpIDogJyc7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRpcCkgdW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiB0aXAsXHJcblx0XHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR2YXIgYWN0aW9ubGlzdCA9IGRhdGEuYWN0aW9uO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChhY3Rpb25saXN0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhhY3Rpb25saXN0KTtcclxuXHRcdFx0XHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYWN0aW9ubGlzdC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgYWN0aW9uID0gYWN0aW9ubGlzdFtpXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFjdGlvbi5hY3Rpb25fdHlwZSA9PSAnc2V0X2RsZ19hdHRyJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciByZXN1bHQgPSBhY3Rpb24udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChyZXN1bHRbaV0uY2hvaWNlX2xpc3QpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgYyA9IDA7IGMgPCAkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQubGVuZ3RoOyBjKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgYXR0ciA9ICR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5pdGVtc1tjXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYXR0ci5uYW1lICE9ICdMYXlvdXQnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYXR0ci5maWVsZElkID09IHJlc3VsdFtpXS5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBkaWN0SXRlbUxpc3QgPSBbXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgZCBpbiByZXN1bHRbaV0uY2hvaWNlX2xpc3QpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgdmFsID0gcmVzdWx0W2ldLmNob2ljZV9saXN0W2RdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRpY3RJdGVtTGlzdC5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ05fU19OQU1FXCI6IHZhbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ05fU19WQUxVRVwiOiB2YWwsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogdmFsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJ2YWx1ZVwiOiB2YWxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLmRpY3QgPSBkaWN0SXRlbUxpc3Q7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhdHRyLm5hbWUgPT0gJ0xheW91dCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIuc2V0dGluZy5jb2xMaXN0LmZvckVhY2goY29sID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb2wuZmllbGRJZCA9PSByZXN1bHRbaV1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgZGljdEl0ZW1MaXN0ID0gW107XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBkIGluIHJlc3VsdFtpXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5jaG9pY2VfbGlzdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgdmFsID0gcmVzdWx0W2ldXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNob2ljZV9saXN0W2RdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkaWN0SXRlbUxpc3QucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDTl9TX05BTUVcIjogdmFsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ05fU19WQUxVRVwiOiB2YWwsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IHZhbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInZhbHVlXCI6IHZhbFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC5kaWN0ID0gZGljdEl0ZW1MaXN0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgYyA9IDA7IGMgPCAkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Lmxlbmd0aDsgYysrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBhdHRyID0gJHRoaXMuJGRhdGEuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zW2NdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhhdHRyW2pdLk5hbWUrJz09JytyZXN1bHRbaV0uYXR0cik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8v5Yik5pat6KGo5Y2V6YeM5piv5ZCm5pyJ6L+U5Zue5a2X5q6177yM5rKh5pyJ5bCx6KOF6L295YiwbW9kZWzph4zvvIzngrnlh7vnoa7lrprmj5DkuqTnmoTml7blgJnluKbkuIrov5nkupvmlbDmja5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5tb2RlbFtyZXN1bHRbaV0uYXR0cl0gPT1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWxbcmVzdWx0W2ldLmF0dHJdID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdFtpXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8v5Yik5pat5piv5ZCm5piv5qCF5qC86KGo5Y2VXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhdHRyLm5hbWUgIT0gJ0xheW91dCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYXR0ci5maWVsZElkID09IHJlc3VsdFtpXS5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLnZhbHVlID0gJyc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLm9sZHZhbHVlID0gJyc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLnZhbHVlID0gcmVzdWx0W2ldLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXR0ci5vbGR2YWx1ZSA9IHJlc3VsdFtpXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5tb2RlbFthdHRyLmZpZWxkSWRdID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0W1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGldLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhdHRyLm5hbWUgPT0gJ0xheW91dCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLnNldHRpbmcuY29sTGlzdC5mb3JFYWNoKGNvbCA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29sKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb2wuZmllbGRJZCA9PSByZXN1bHRbaV1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuYXR0cikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC52YWx1ZSA9ICcnO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC5vbGR2YWx1ZSA9ICcnO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC52YWx1ZSA9IHJlc3VsdFtpXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb2wub2xkdmFsdWUgPSByZXN1bHRbaV0udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb2xcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmZpZWxkSWRdID0gcmVzdWx0W2ldXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGxlbmd0aCA9IDA7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoISR0aGlzLiRkYXRhLnJlZmRhdGFzdG9yZS5maWx0ZXIoZnVuY3Rpb24ocykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRbaV0uYXR0ciA9PSBzLmF0dHJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSkubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxlbmd0aCA9IDE7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLiRkYXRhLnJlZmRhdGFzdG9yZS5wdXNoKHJlc3VsdFtpXSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAobGVuZ3RoID09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCAkdGhpcy4kZGF0YS5yZWZkYXRhc3RvcmVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoJHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlW2pdLmF0dHIgPT0gcmVzdWx0W2ldXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuYXR0cikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlW2pdLnZhbHVlID0gcmVzdWx0W2ldXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZGF0YS5hY3Rpb25baV0uYWN0aW9uX3R5cGUgPT0gJ3NldF9kbGdfYXR0cl9zaG93Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciByZXN1bHQgPSBhY3Rpb24udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0LmZvckVhY2goYXN5bmMgKGF0dHIsIGtleSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJGRhdGEuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zLmZvckVhY2goXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFzeW5jIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbGUsIGluZGV4KSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly/liKTmlq3mmK/lkKbmmK/moIXmoLzooajljZVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZWxlLm5hbWUgIT0gJ0xheW91dCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbGUuZmllbGRJZCA9PSBhdHRyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsZS5zaG93ID0gYXR0ci5zaG93O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZWxlLm5hbWUgPT1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdMYXlvdXQnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbGUuc2V0dGluZy5jb2xMaXN0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5mb3JFYWNoKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbCA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29sKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb2xcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZmllbGRJZCA9PVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuYXR0clxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb2wuc2hvdyA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuc2hvdztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGhlYWRfc3R5bGVkZWYgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KCR0aGlzLiRkYXRhXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuaGVhZF9zdHlsZWRlZikpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLiRkYXRhLmhlYWRfc3R5bGVkZWYgPSBbXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmID0gaGVhZF9zdHlsZWRlZjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdleGVjdXRlX2luaXRfZXZlbnRfZmFpbGVkJykgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zbGF0ZVN5cyhcImZ1bGxfc3RvcFwiKSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNsYXRlKCdyZWFzb24nKSArIHRoaXMudHJhbnNsYXRlU3lzKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiY29sb25cIikgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zbGF0ZVN5cyhcInF1b3RhdGlvbl9tYXJrX2xlZnRcIikgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhY3Rpb25cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmFjdGlvbl90eXBlICsgdGhpcy50cmFuc2xhdGVTeXMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJxdW90YXRpb25fbWFya19yaWdodFwiKSArIHRoaXNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnRyYW5zbGF0ZSgndGlwX2FjdGlvbl91bnByb2Nlc3NlZCcpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwiZXJyb3JcIikgKyBcIjNcIixcclxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiB0aGlzLnRyYW5zbGF0ZSgnZXhlY3V0ZV9pbml0X2V2ZW50X2ZhaWxlZCcpICtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNsYXRlU3lzKFwiZnVsbF9zdG9wXCIpICtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNsYXRlKCdyZWFzb24nKSArIHRoaXMudHJhbnNsYXRlU3lzKFwiY29sb25cIikgKyBzdWNjZXNzXHJcblx0XHRcdFx0XHRcdFx0XHQuZXJyX21zZyxcclxuXHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSkuY2F0Y2goZXggPT4ge1xyXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coZXgpO1xyXG5cdFx0XHRcdFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcImVycm9yXCIpICsgXCIzLjFcIixcclxuXHRcdFx0XHRcdFx0Y29udGVudDogdGhpcy50cmFuc2xhdGUoJ2V4ZWN1dGVfaW5pdF9ldmVudF9mYWlsZWQnKSArXHJcblx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2xhdGVTeXMoXCJmdWxsX3N0b3BcIikgK1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNsYXRlKCdyZWFzb24nKSArIHRoaXMudHJhbnNsYXRlU3lzKFwiY29sb25cIikgKyBleC5lcnJNc2csXHJcblx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9LFxyXG5cclxuXHJcblx0XHRcdG9udGFwKGl0ZW0pIHsgLy/miavnoIHlip/og71cclxuXHRcdFx0XHQvLyDmiZPlvIDok53niZnpgILphY3lmahcclxuXHRcdFx0XHQvLyB1bmkub3BlbkJsdWV0b290aEFkYXB0ZXIoe1xyXG5cdFx0XHRcdC8vICAgc3VjY2VzczogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0Ly8gXHQvLyDlvIDlp4vmkJzntKLok53niZnorr7lpIdcclxuXHRcdFx0XHQvLyBcdHVuaS5zdGFydEJsdWV0b290aERldmljZXNEaXNjb3Zlcnkoe1xyXG5cdFx0XHRcdC8vIFx0ICBzdWNjZXNzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHQvLyBcdFx0Ly8g55uR5ZCs5om+5Yiw5paw6K6+5aSH55qE5LqL5Lu2XHJcblx0XHRcdFx0Ly8gXHRcdHVuaS5vbkJsdWV0b290aERldmljZUZvdW5kKGZ1bmN0aW9uKGRldmljZXMpIHtcclxuXHRcdFx0XHQvLyBcdFx0ICAvLyDov5nph4zlj6/ku6Xov4fmu6Tlh7pSRklE6Iqv54mH77yM6L+e5o6l5bm26K+75Y+W5pWw5o2uXHJcblx0XHRcdFx0Ly8gXHRcdCAgY29uc29sZS5sb2coZGV2aWNlc1swXS5kZXZpY2VJZCk7XHJcblx0XHRcdFx0Ly8gXHRcdH0pXHJcblx0XHRcdFx0Ly8gXHQgIH1cclxuXHRcdFx0XHQvLyBcdH0pXHJcblx0XHRcdFx0Ly8gICB9XHJcblx0XHRcdFx0Ly8gfSk7XHJcblx0XHRcdFx0Ly8g55uR5ZCsTkZD5Yqf6IO95piv5ZCm5Y+v55SoXHJcblx0XHRcdFx0Ly8gdW5pLmdldE5GQ0FkYXB0ZXJTdGF0ZSh7XHJcblx0XHRcdFx0Ly8gICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHtcclxuXHRcdFx0XHQvLyBcdGNvbnNvbGUubG9nKHJlcyk7XHJcblx0XHRcdFx0Ly8gICAgIGlmIChyZXMuZXJyQ29kZSA9PT0gMCkge1xyXG5cdFx0XHRcdC8vICAgICAgIC8vIE5GQ+WKn+iDveWPr+eUqO+8jOW8gOWni+ebkeWQrFxyXG5cdFx0XHRcdC8vICAgICAgIHVuaS5vbk5GQ1N0YXJ0KChyZXMpID0+IHtcclxuXHRcdFx0XHQvLyAgICAgICAgIGlmIChyZXMuZXJyQ29kZSA9PT0gMCkge1xyXG5cdFx0XHRcdC8vICAgICAgICAgICAvLyDlvIDlp4tORkPmoIfnrb7mo4DmtYtcclxuXHRcdFx0XHQvLyAgICAgICAgICAgdW5pLm1ha2VORkNSZWFkZXJTdGFydCh7XHJcblx0XHRcdFx0Ly8gICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0Ly8gICAgICAgICAgICAgICAvLyDnm5HlkKxORkPmoIfnrb5cclxuXHRcdFx0XHQvLyAgICAgICAgICAgICAgIHVuaS5vbk5GQ1RhZ0Rpc2NvdmVyZWQoZnVuY3Rpb24ocmVzKSB7XHJcblx0XHRcdFx0Ly8gXHRcdFx0XHRcdFx0XHRcdFx0XHQgIGNvbnNvbGUubG9nKHJlcyk7XHJcblx0XHRcdFx0Ly8gICAgICAgICAgICAgICAgIC8vIOi/memHjOWPr+S7peWkhOeQhk5GQ+agh+etvuaVsOaNrlxyXG5cdFx0XHRcdC8vICAgICAgICAgICAgICAgfSlcclxuXHRcdFx0XHQvLyAgICAgICAgICAgICB9XHJcblx0XHRcdFx0Ly8gICAgICAgICAgIH0pXHJcblx0XHRcdFx0Ly8gICAgICAgICB9XHJcblx0XHRcdFx0Ly8gICAgICAgfSlcclxuXHRcdFx0XHQvLyAgICAgfVxyXG5cdFx0XHRcdC8vICAgfVxyXG5cdFx0XHRcdC8vIH0pXHJcblx0XHRcdFx0dGhpcy5mb2N1c09sZEZpZWxkSWQgPSBpdGVtLmZpZWxkSWRcclxuXHRcdFx0XHRnZXRBcHAoKS5vblNjYW4oKHJlc3VsdCkgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2cocmVzdWx0KTtcclxuXHRcdFx0XHRcdC8vIHVuaS5oaWRlS2V5Ym9hcmQoKTtcclxuXHRcdFx0XHRcdHRoaXMub25TY2FuVmFsdWUoaXRlbSwgcmVzdWx0LmRlY29kZWRhdGEpXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0fSxcclxuXHRcdFx0b25TY2FuVmFsdWUoaXRlbSwgdmFsdWUpIHtcclxuXHRcdFx0XHRjb25zdCAkdGhpcyA9IHRoaXM7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coXCJvblNjYW5WYWx1ZVwiLCBpdGVtKTtcclxuXHRcdFx0XHRpZiAoaXRlbS5vbGR2YWx1ZSAhPSB2YWx1ZSkge1xyXG5cdFx0XHRcdFx0aXRlbS5vbGR2YWx1ZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0aXRlbS52YWx1ZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0dmFyIGF0dHIgPSB2YWx1ZVxyXG5cdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW2F0dHJdID0gdmFsdWU7XHJcblx0XHRcdFx0XHRpZiAoaXRlbS52YWx1ZSkgeyAvL+esrOS4gOS4qui+k+WFpeahhuS4jeS4uuepulxyXG5cdFx0XHRcdFx0XHQvL+WIneWni+WMlu+8jOS4i+S4qui+k+WFpeahhmZvY3Vz5bGe5oCnXHJcblx0XHRcdFx0XHRcdHZhciBmaW5kZCA9IGZhbHNlXHJcblx0XHRcdFx0XHRcdGNvbnN0IGl0ZW1zID0gJHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zIHx8IFtdXHJcblx0XHRcdFx0XHRcdGZvciAobGV0IGkgaW4gaXRlbXMpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBlbGUgPSBpdGVtc1tpXVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoZWxlLm5hbWUgIT0gXCJMYXlvdXRcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGVsZS5uYW1lID09ICdJbnB1dCcgfHwgZWxlLm5hbWUgPT0gJ0lucHV0TnVtYmVyJyB8fCBlbGUubmFtZSA9PSAnVGV4dGFyZWEnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChhdHRyID09IGVsZS5maWVsZElkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmluZGQgPSB0cnVlXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGZpbmRkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5zZXREYXRhKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9jdXNGaWVsZElkOiBlbGUuZmllbGRJZFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGZpbmRkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBjdXJJbmRleCA9IGVsZS5zZXR0aW5nLmNvbExpc3QuZmluZEluZGV4KChjb2wsIGluZGV4MiwgYXJyKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIChjb2wubmFtZSA9PSAnSW5wdXQnIHx8IGNvbC5uYW1lID09ICdJbnB1dE51bWJlcicgfHwgY29sLm5hbWUgPT1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdUZXh0YXJlYScpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoY3VySW5kZXggPiAtMSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLnNldERhdGEoe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9jdXNGaWVsZElkOiBlbGUuc2V0dGluZy5jb2xMaXN0W2N1ckluZGV4XVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZmllbGRJZFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBjdXJJbmRleCA9IGVsZS5zZXR0aW5nLmNvbExpc3QuZmluZEluZGV4KChjb2wsIGluZGV4MiwgYXJyKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGF0dHIgPT0gY29sLmZpZWxkSWQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjdXJJbmRleCA+IC0xKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmluZGQgPSB0cnVlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGN1ckluZGV4MiA9IGVsZS5zZXR0aW5nLmNvbExpc3QuZmluZEluZGV4KChjb2wsIGluZGV4MiwgYXJyKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKGNvbC5uYW1lID09ICdJbnB1dCcgfHwgY29sLm5hbWUgPT1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnSW5wdXROdW1iZXInIHx8IGNvbC5uYW1lID09ICdUZXh0YXJlYScpICYmXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGluZGV4MiA+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGN1ckluZGV4O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGN1ckluZGV4MiA+IC0xKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5zZXREYXRhKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9jdXNGaWVsZElkOiBlbGUuc2V0dGluZy5jb2xMaXN0W2N1ckluZGV4XVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5maWVsZElkXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dmFyIGV2ZW50aWQgPSBpdGVtLmJpbmQub25DaGFuZ2VFdmVudC5pZDsgLy/lhoXlrrnlj5jljJblkI7kuovku7ZcclxuXHRcdFx0XHRcdGlmIChldmVudGlkKSB7XHJcblx0XHRcdFx0XHRcdHZhciBvYmpfYXR0ciA9IHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsO1xyXG5cdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhvYmpfYXR0cik7XHJcblx0XHRcdFx0XHRcdHZhciByZXEgPSBPYmplY3Qua2V5cyhvYmpfYXR0cikubWFwKChhKSA9PiAoe1xyXG5cdFx0XHRcdFx0XHRcdGF0dHI6IGEsXHJcblx0XHRcdFx0XHRcdFx0dmFsOiBvYmpfYXR0clthXSB8fCBcIlwiLFxyXG5cdFx0XHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgaW5mbyA9IHtcclxuXHRcdFx0XHRcdFx0XHRldmVudGlkOiBldmVudGlkLFxyXG5cdFx0XHRcdFx0XHRcdGVkdHlwZTogXCIwXCIsXHJcblx0XHRcdFx0XHRcdFx0cHJvamVjdGlkOiAnJyxcclxuXHRcdFx0XHRcdFx0XHRyY2xzaWQ6ICcnLFxyXG5cdFx0XHRcdFx0XHRcdHJvYmppZDogJycsXHJcblx0XHRcdFx0XHRcdFx0dXNlcmxvZ2luOiAnJyxcclxuXHRcdFx0XHRcdFx0XHRjbHNpZDogdGhpcy4kZGF0YS5wYXJhbS5EYXRhQ2xzLmlkLFxyXG5cdFx0XHRcdFx0XHRcdG9iamlkOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdGF0dHI6IHJlcSxcclxuXHRcdFx0XHRcdFx0XHRkYXRhSnNvbjogW10sXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0dGhpcy5EYXRhT2JqUnVuQ3VzdG9tRXZlbnQoaW5mbywgJycpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0b25DbGljayhpdGVtKSB7XHJcblx0XHRcdFx0dGhpcy5mb2N1c0ZpZWxkSWQgPSBpdGVtLmZpZWxkSWRcclxuXHRcdFx0fSxcclxuXHRcdFx0b25ldmVudChpdGVtKSB7XHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coZS50YXJnZXQpO1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKGl0ZW0pO1xyXG5cdFx0XHRcdGlmIChpdGVtLm9sZHZhbHVlICE9IGl0ZW0udmFsdWUpIHtcclxuXHRcdFx0XHRcdGl0ZW0ub2xkdmFsdWUgPSBpdGVtLnZhbHVlO1xyXG5cdFx0XHRcdFx0dmFyIGF0dHIgPSBpdGVtLmZpZWxkSWQ7XHJcblx0XHRcdFx0XHR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5tb2RlbFthdHRyXSA9IGl0ZW0udmFsdWU7XHJcblx0XHRcdFx0XHQvL+WtkOaVsOaNruexu+aJq+eggeWMuuS6i+S7tuiEmuacrFxyXG5cdFx0XHRcdFx0dmFyIGV2ZW50aWQgPSBpdGVtLmJpbmQub25DaGFuZ2VFdmVudC5pZDsgLy/lhoXlrrnlj5jljJblkI7kuovku7ZcclxuXHRcdFx0XHRcdGlmIChldmVudGlkKSB7XHJcblx0XHRcdFx0XHRcdHZhciBvYmpfYXR0ciA9IHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsO1xyXG5cdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhvYmpfYXR0cik7XHJcblx0XHRcdFx0XHRcdHZhciByZXEgPSBPYmplY3Qua2V5cyhvYmpfYXR0cikubWFwKChhKSA9PiAoe1xyXG5cdFx0XHRcdFx0XHRcdGF0dHI6IGEsXHJcblx0XHRcdFx0XHRcdFx0dmFsOiBvYmpfYXR0clthXSB8fCBcIlwiLFxyXG5cdFx0XHRcdFx0XHR9KSk7XHJcblx0XHRcdFx0XHRcdHZhciBpbmZvID0ge1xyXG5cdFx0XHRcdFx0XHRcdGV2ZW50aWQ6IGV2ZW50aWQsXHJcblx0XHRcdFx0XHRcdFx0ZWR0eXBlOiBcIjBcIixcclxuXHRcdFx0XHRcdFx0XHRwcm9qZWN0aWQ6ICcnLFxyXG5cdFx0XHRcdFx0XHRcdHJjbHNpZDogJycsXHJcblx0XHRcdFx0XHRcdFx0cm9iamlkOiAnJyxcclxuXHRcdFx0XHRcdFx0XHR1c2VybG9naW46ICcnLFxyXG5cdFx0XHRcdFx0XHRcdGNsc2lkOiB0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHMuaWQsXHJcblx0XHRcdFx0XHRcdFx0b2JqaWQ6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0YXR0cjogcmVxLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGFKc29uOiBbXSxcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR0aGlzLkRhdGFPYmpSdW5DdXN0b21FdmVudChpbmZvLCBcIlwiKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9LFxyXG5cdFx0XHRvbmNoYW5nZShpdGVtKSB7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coaXRlbSk7XHJcblx0XHRcdFx0aWYgKGl0ZW0ub2xkdmFsdWUgIT0gaXRlbS52YWx1ZSkge1xyXG5cdFx0XHRcdFx0aXRlbS5vbGR2YWx1ZSA9IGl0ZW0udmFsdWU7XHJcblx0XHRcdFx0XHR2YXIgYXR0ciA9IGl0ZW0uZmllbGRJZDtcclxuXHRcdFx0XHRcdHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW2F0dHJdID0gaXRlbS52YWx1ZTtcclxuXHRcdFx0XHRcdHZhciBldmVudGlkID0gaXRlbS5iaW5kLm9uQ2hhbmdlRXZlbnQuaWQ7IC8v5YaF5a655Y+Y5YyW5ZCO5LqL5Lu2XHJcblx0XHRcdFx0XHRpZiAoZXZlbnRpZCkge1xyXG5cdFx0XHRcdFx0XHQvLyBzZWxmLmV2ZW50X25vX3N1YiA9IDE7XHJcblx0XHRcdFx0XHRcdHZhciBvYmpfYXR0ciA9IHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsO1xyXG5cdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhvYmpfYXR0cik7XHJcblx0XHRcdFx0XHRcdHZhciByZXEgPSBPYmplY3Qua2V5cyhvYmpfYXR0cikubWFwKChhKSA9PiAoe1xyXG5cdFx0XHRcdFx0XHRcdGF0dHI6IGEsXHJcblx0XHRcdFx0XHRcdFx0dmFsOiBvYmpfYXR0clthXSB8fCBcIlwiLFxyXG5cdFx0XHRcdFx0XHR9KSk7XHJcblx0XHRcdFx0XHRcdHZhciBpbmZvID0ge1xyXG5cdFx0XHRcdFx0XHRcdGV2ZW50aWQ6IGV2ZW50aWQsXHJcblx0XHRcdFx0XHRcdFx0ZWR0eXBlOiBcIjBcIixcclxuXHRcdFx0XHRcdFx0XHRwcm9qZWN0aWQ6ICcnLFxyXG5cdFx0XHRcdFx0XHRcdHJjbHNpZDogJycsXHJcblx0XHRcdFx0XHRcdFx0cm9iamlkOiAnJyxcclxuXHRcdFx0XHRcdFx0XHR1c2VybG9naW46ICcnLFxyXG5cdFx0XHRcdFx0XHRcdGNsc2lkOiB0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHMuaWQsXHJcblx0XHRcdFx0XHRcdFx0b2JqaWQ6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0YXR0cjogcmVxLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGFKc29uOiBbXVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHRoaXMuRGF0YU9ialJ1bkN1c3RvbUV2ZW50KGluZm8pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblx0XHRcdG9uTW9kZWxWYWx1ZShpdGVtKSB7IC8v57uR5a6aTW9kZWzlgLxcclxuXHRcdFx0XHR2YXIgYXR0ciA9IGl0ZW0uZmllbGRJZDtcclxuXHRcdFx0XHR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5tb2RlbFthdHRyXSA9IGl0ZW0udmFsdWU7XHJcblx0XHRcdH0sXHJcblx0XHRcdGNsYXNzQXR0cl9leHRCdXR0b24oaXRlbSkge1xyXG5cdFx0XHRcdHZhciBvblN1ZmZpeENsaWNrQ2FsbGJhY2tFdmVudCA9IGl0ZW0uYmluZC5vblN1ZmZpeENsaWNrQ2FsbGJhY2tFdmVudDsgLy/lkI7lm77moIfngrnlh7vkuovku7ZcclxuXHRcdFx0XHR2YXIgb25TdWZmaXhDbGlja0V2ZW50ID0gaXRlbS5iaW5kLm9uU3VmZml4Q2xpY2tFdmVudDsgLy/lkI7lm77moIfngrnlh7vlm57osINcclxuXHJcblx0XHRcdFx0aWYgKCFvblN1ZmZpeENsaWNrQ2FsbGJhY2tFdmVudC5pZCkge1xyXG5cdFx0XHRcdFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHRcdFx0Y29udGVudDogdGhpcy50cmFuc2xhdGUoJ2ljb25fY2xpY2tfZXZlbnRfZW1wdHknKSxcclxuXHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmICghb25TdWZmaXhDbGlja0V2ZW50LmlkKSB7XHJcblx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRjb250ZW50OiB0aGlzLnRyYW5zbGF0ZSgnaWNvbl9jbGlja19ldmVudF9lbXB0eScpLFxyXG5cdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy4kZGF0YS5wb3B1cFR5cGUgPSAncmlnaHQnXHJcblx0XHRcdFx0Ly8gb3BlbiDmlrnms5XkvKDlhaXlj4LmlbAg562J5ZCM5ZyoIHVuaS1wb3B1cCDnu4Tku7bkuIrnu5HlrpogdHlwZeWxnuaAp1xyXG5cdFx0XHRcdHRoaXMuJHJlZnMucG9wdXAub3BlbigkdGhpcy5wb3B1cFR5cGUpO1xyXG5cclxuXHRcdFx0XHR0aGlzLkRhdGFPYmpSdW5DdXN0b21FdmVudF9SZXR1cm4ob25TdWZmaXhDbGlja0NhbGxiYWNrRXZlbnQuaWQsICcnLCBvblN1ZmZpeENsaWNrRXZlbnQuaWQsIGl0ZW0pO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRwb3B1cENoYW5nZShlKSB7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coJ+W9k+WJjeaooeW8j++8micgKyBlLnR5cGUgKyAnLOeKtuaAge+8micgKyBlLnNob3cpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRjaGVja0NoYW5nZShlKSB7IC8v5by55qGGY2hlY2vpgInmi6lcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhlLnRhcmdldC5kYXRhc2V0KTtcclxuXHRcdFx0XHR2YXIgaW5kZXggPSBlLnRhcmdldC5kYXRhc2V0LmluZGV4O1xyXG5cdFx0XHRcdHZhciBpc2NoZWNrID0gZS50YXJnZXQuZGF0YXNldC5pc2NoZWNrO1xyXG5cdFx0XHRcdHZhciBkYXRhID0gdGhpcy4kZGF0YS5jaGVja19saXN0Lml0ZW1zO1xyXG5cdFx0XHRcdC8vIHRoaXMuJGRhdGEuY2hlY2tfbGlzdC5pdGVtcz1bXTtcclxuXHRcdFx0XHRpZiAodGhpcy4kZGF0YS5jaGVja19saXN0Lm11bHRpcGxlX2Nob2ljZSA9PSBcIjBcIikgeyAvL+WIpOaWreaXtuWNlemAiei/mOaYr+WkmumAiVxyXG5cdFx0XHRcdFx0Zm9yICh2YXIgaSBpbiBkYXRhKSB7XHJcblx0XHRcdFx0XHRcdGRhdGFbaV0uY2hlY2sgPSBmYWxzZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZGF0YVtpbmRleF0uY2hlY2sgPSBpc2NoZWNrID8gZmFsc2UgOiB0cnVlO1xyXG5cdFx0XHRcdHRoaXMuJGRhdGEuY2hlY2tfbGlzdC5pdGVtcyA9IGRhdGE7XHJcblxyXG5cdFx0XHR9LFxyXG5cdFx0XHRwb3B1cF9jYW5jZWwoZSkgeyAvL+W8ueahhuWPlua2iFxyXG5cdFx0XHRcdHRoaXMuJHJlZnMucG9wdXAuY2xvc2UoKTtcclxuXHRcdFx0fSxcclxuXHRcdFx0cG9wdXBfc2F2YShlKSB7IC8v5by55qGG56Gu5a6aXHJcblx0XHRcdFx0dmFyICR0aGlzID0gdGhpcztcclxuXHRcdFx0XHR2YXIgaXRlbXMgPSAkdGhpcy4kZGF0YS5jaGVja19saXN0Lml0ZW1zO1xyXG5cdFx0XHRcdHZhciBkYXRhID0gW107XHJcblx0XHRcdFx0dmFyIG5hbWUgPSBcIlwiO1xyXG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGlmIChpdGVtc1tpXS5jaGVjayA9PSB0cnVlKSB7XHJcblx0XHRcdFx0XHRcdGlmIChuYW1lKVxyXG5cdFx0XHRcdFx0XHRcdG5hbWUgKz0gJzsnO1xyXG5cdFx0XHRcdFx0XHRuYW1lICs9IGl0ZW1zW2ldLm5hbWU7XHJcblx0XHRcdFx0XHRcdGRhdGEucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0aWQ6IGl0ZW1zW2ldLmlkLFxyXG5cdFx0XHRcdFx0XHRcdG5hbWU6IGl0ZW1zW2ldLm5hbWVcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIGlmICghJHRoaXMuJGRhdGEucG9wdXBQYXJhbSkge1xyXG5cdFx0XHRcdC8vIFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0Ly8gXHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHQvLyBcdFx0Y29udGVudDogXCJwb3B1cFBhcmFt5Li656m677yBXCIsXHJcblx0XHRcdFx0Ly8gXHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdC8vIFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHQvLyBcdH0pO1xyXG5cdFx0XHRcdC8vIFx0cmV0dXJuO1xyXG5cdFx0XHRcdC8vIH1cclxuXHJcblx0XHRcdFx0dmFyIGZpZWxkSWQgPSAkdGhpcy4kZGF0YS5wb3B1cFBhcmFtLml0ZW0uZmllbGRJZDtcclxuXHRcdFx0XHQkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWxbYXR0cl0gPSBuYW1lO1xyXG5cdFx0XHRcdGZvciAodmFyIGMgPSAwOyBjIDwgJHRoaXMuJGRhdGEuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zLmxlbmd0aDsgYysrKSB7XHJcblx0XHRcdFx0XHR2YXIgYXR0ciA9ICR0aGlzLiRkYXRhLmhlYWRfc3R5bGVkZWYuZm9ybS5pdGVtc1tjXTtcclxuXHRcdFx0XHRcdGlmIChhdHRyLmZpZWxkSWQgPT0gZmllbGRJZCkge1xyXG5cdFx0XHRcdFx0XHRhdHRyLnZhbHVlID0gbmFtZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc29sZS5sb2coZGF0YSk7XHJcblx0XHRcdFx0dmFyIGNhbGxiYWNrX2V2ZW50aWQgPSAkdGhpcy4kZGF0YS5wb3B1cFBhcmFtLmJ1dHRvbl9jYWxsYmFjay50cmltKCk7XHJcblx0XHRcdFx0dmFyIGluZm8gPSB7XHJcblx0XHRcdFx0XHRldmVudGlkOiBjYWxsYmFja19ldmVudGlkLFxyXG5cdFx0XHRcdFx0ZWR0eXBlOiBcIjBcIixcclxuXHRcdFx0XHRcdHByb2plY3RpZDogJycsXHJcblx0XHRcdFx0XHRyY2xzaWQ6ICcnLFxyXG5cdFx0XHRcdFx0cm9iamlkOiAnJyxcclxuXHRcdFx0XHRcdHVzZXJsb2dpbjogJycsXHJcblx0XHRcdFx0XHRjbHNpZDogJHRoaXMuJGRhdGEucGFyYW0uRGF0YUNscy5pZCxcclxuXHRcdFx0XHRcdG9iamlkOiBcIlwiLFxyXG5cdFx0XHRcdFx0YXR0cjogJHRoaXMuJGRhdGEucG9wdXBQYXJhbS5yZXEsXHJcblx0XHRcdFx0XHRkYXRhSnNvbjogZGF0YVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQkdGhpcy5EYXRhT2JqUnVuQ3VzdG9tRXZlbnQoaW5mbywgJHRoaXMuJGRhdGEucG9wdXBQYXJhbS5kYXRhX2F0dHIpO1xyXG5cdFx0XHRcdHRoaXMuJHJlZnMucG9wdXAuY2xvc2UoKTtcclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdERhdGFPYmpSdW5DdXN0b21FdmVudChpbmZvLCBkYXRhX2F0dHIpIHtcclxuXHRcdFx0XHR2YXIgJHRoaXMgPSB0aGlzO1xyXG5cdFx0XHRcdHZhciBlbnZpcm9tZW50ID0ge1xyXG5cdFx0XHRcdFx0J2Z1bmN0aW9uJzogJzMwMDAnLCAvLyDlip/og73ngrnnvJblj7dcclxuXHRcdFx0XHRcdGNsc19pZDogdGhpcy4kZGF0YS5wYXJhbS5EYXRhQ2xzLmlkLCAvLyDlip/og73ngrnkuLvmlbDmja7nsbvmoIfor4ZcclxuXHRcdFx0XHRcdCdidXR0b24nOiAndG9wJywgLy8gdG9wL2JvdHRvbVxyXG5cdFx0XHRcdFx0YnV0dG9uX25hbWU6IHRoaXMudHJhbnNsYXRlU3lzKCdhZGQyJyksXHJcblx0XHRcdFx0XHRtYXN0ZXI6IHtcclxuXHRcdFx0XHRcdFx0Y2xzX2lkOiB0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHMuaWQsIC8vIGJ1dHRvbj1ib3R0b23ml7YgbWFzdGVy55qEY2xzX2lkXHJcblx0XHRcdFx0XHRcdC8vb2JqX2lkOiAnJyAgLy8gYnV0dG9uPWJvdHRvbeaXtiBtYXN0ZXLnmoRvYmpfaWRcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGlmIChkYXRhX2F0dHIpIHtcclxuXHRcdFx0XHRcdGVudmlyb21lbnQuZWRpdF9kbGcgPSB7XHJcblx0XHRcdFx0XHRcdHR5cGU6ICdzbWFsbCcsIC8v5bCP56qX5Y+jXHJcblx0XHRcdFx0XHRcdGNsYXNzX2lkOiB0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHMuaWQsIC8v5b2T5YmN5pWw5o2u57G7aWRcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChkYXRhX2F0dHIpIHtcclxuXHRcdFx0XHRcdFx0ZW52aXJvbWVudC5lZGl0X2RsZy5mb3JtX2NvbnRyb2wgPSB7IC8v5omA5bGe55qE6KGo5Y2V5o6n5Lu2XHJcblx0XHRcdFx0XHRcdFx0bmFtZTogZGF0YV9hdHRyLk5hbWUsIC8v5a2X5q615bGe5oCnXHJcblx0XHRcdFx0XHRcdFx0dGV4dDogZGF0YV9hdHRyLkRpc3BOYW1lLCAvL+aYvuekuuaWh+acrFxyXG5cdFx0XHRcdFx0XHRcdGdyb3VwX25hbWU6IGRhdGFfYXR0ci5Hcm91cE5hbWUsIC8v5bGe5oCn57uEXHJcblx0XHRcdFx0XHRcdFx0dHlwZTogZGF0YV9hdHRyLlR5cGUsIC8v5a2X5q6157G75Z6LXHJcblx0XHRcdFx0XHRcdFx0cmVhZG9ubHk6IGRhdGFfYXR0ci5SZWFkT25seSwgLy/mmK/lkKblj6ror7tcclxuXHRcdFx0XHRcdFx0XHRidXR0b25faW1nOiBkYXRhX2F0dHIuYnV0dG9uX2ltZywgLy/lvJXnlKjmjInpkq7nmoTlm77moIdcclxuXHRcdFx0XHRcdFx0XHRidXR0b25fdG9vbHRpcDogZGF0YV9hdHRyLmJ1dHRvbl90b29sdGlwIC8v5byV55So5oyJ6ZKu55qEdG9vbHRpcFxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyB2YXIgZGF0YUluZm8gPSB7XHJcblx0XHRcdFx0Ly8gICAgIGVkdHlwZTogaW5mby5lZHR5cGUsIGV2ZW50aWQ6IGluZm8uZXZlbnRpZCwgcHJvamVjdGlkOiBpbmZvLnByb2plY3RpZC5yZXBsYWNlKCd7JywnJykucmVwbGFjZSgnfScsJycpLFxyXG5cdFx0XHRcdC8vICAgICByY2xzaWQ6IGluZm8ucmNsc2lkLCByb2JqaWQ6IGluZm8ucm9iamlkLCB1c2VybG9naW46IGluZm8udXNlcmxvZ2luLCBjbHNpZDogaW5mby5jbHNpZCwgb2JqaWQ6IGluZm8ub2JqaWQsXHJcblx0XHRcdFx0Ly8gICAgIGF0dHI6IEpTT04uc3RyaW5naWZ5KGluZm8uYXR0ciksIGV4dGluZm86IEpTT04uc3RyaW5naWZ5KGVudmlyb21lbnQpLCBpbnB1dHBhcmFtZXRlcjogXCJcIixcclxuXHRcdFx0XHQvLyBcdGdsb2JhbF9hdHRyOiBKU09OLnN0cmluZ2lmeSh0aGlzLiRkYXRhLmdsb2JhbF9hdHRyKSwgZGF0YUpzb246SlNPTi5zdHJpbmdpZnkoaW5mby5kYXRhSnNvbilcclxuXHRcdFx0XHQvLyB9XHJcblx0XHRcdFx0ZW52aXJvbWVudCA9IEJhc2U2NC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoZW52aXJvbWVudCkpOyAvL+WwhuWtl+espuS4sui9rOaNouS4umJhc2U2NOe8lueggVxyXG5cdFx0XHRcdHZhciBpbnB1dF9wYXJhbSA9IEJhc2U2NC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoaW5mby5hdHRyKSk7IC8v5bCG5a2X56ym5Liy6L2s5o2i5Li6YmFzZTY057yW56CBXHJcblx0XHRcdFx0dmFyIGdsb2JhbF9hdHRyID0gQmFzZTY0LmVuY29kZShKU09OLnN0cmluZ2lmeSh0aGlzLiRkYXRhLmdsb2JhbF9hdHRyKSk7IC8v5bCG5a2X56ym5Liy6L2s5o2i5Li6YmFzZTY057yW56CBXHJcblx0XHRcdFx0aWYgKGluZm8uZGF0YUpzb24pXHJcblx0XHRcdFx0XHRpbmZvLmRhdGFKc29uID0gQmFzZTY0LmVuY29kZShKU09OLnN0cmluZ2lmeShpbmZvLmRhdGFKc29uKSk7IC8v5bCG5a2X56ym5Liy6L2s5o2i5Li6YmFzZTY057yW56CBXHJcblx0XHRcdFx0dmFyIG9ial9hdHRyID0ge307XHJcblx0XHRcdFx0aW5mby5hdHRyLmZvckVhY2goaXRlbSA9PiB7XHJcblx0XHRcdFx0XHRvYmpfYXR0cltpdGVtLmF0dHJdID0gaXRlbS52YWw7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0aWYgKCFpbmZvLmV2ZW50aWQuaW5jbHVkZXMoJ3snKSkgaW5mby5ldmVudGlkID0gJ3snICsgaW5mby5ldmVudGlkICsgJ30nO1xyXG5cdFx0XHRcdHZhciBkYXRhSW5mbyA9IHtcclxuXHRcdFx0XHRcdGVkX3R5cGU6IGluZm8uZWR0eXBlLFxyXG5cdFx0XHRcdFx0c3RhcnRfdHJhbnNhY3Rpb246IHRydWUsXHJcblx0XHRcdFx0XHRjbGFzc19pZDogaW5mby5jbHNpZCxcclxuXHRcdFx0XHRcdGNsYXNzX25hbWU6ICcnLFxyXG5cdFx0XHRcdFx0ZXZlbnRfaWQ6IGluZm8uZXZlbnRpZCxcclxuXHRcdFx0XHRcdGV2ZW50X25hbWU6ICcnLFxyXG5cdFx0XHRcdFx0ZGF0YV9vYmpfaWQ6IGluZm8ub2JqaWQsXHJcblx0XHRcdFx0XHRvYmpfYXR0cjogb2JqX2F0dHIsXHJcblx0XHRcdFx0XHRwcmpfaWQ6IGluZm8ucHJvamVjdGlkLFxyXG5cdFx0XHRcdFx0cmVmX2Nsc19pZDogaW5mby5yY2xzaWQsXHJcblx0XHRcdFx0XHRyZWxfb2JqX2lkOiBpbmZvLnJvYmppZCxcclxuXHRcdFx0XHRcdHVzZXJfbG9naW46IGluZm8udXNlcmxvZ2luLFxyXG5cdFx0XHRcdFx0ZGF0YV9qc29uOiBpbmZvLmRhdGFKc29uLFxyXG5cdFx0XHRcdFx0Y29tcG9zZV9pbmZvOiAnJyxcclxuXHRcdFx0XHRcdGV4dF9pbmZvOiBlbnZpcm9tZW50LFxyXG5cdFx0XHRcdFx0Z2xvYmFsX2F0dHI6IGdsb2JhbF9hdHRyLFxyXG5cdFx0XHRcdFx0aW5wdXRfcGFyYW06IGlucHV0X3BhcmFtLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0Y29uc29sZS5sb2coZGF0YUluZm8pO1xyXG5cdFx0XHRcdC8vIHJldHVybjtcclxuXHRcdFx0XHR0aGlzLiRzdG9yZS5kaXNwYXRjaCgncnVuQ3VzdG9tRXZlbnQnLCBkYXRhSW5mbykudGhlbihzdWNjZXNzID0+IHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKHN1Y2Nlc3MpO1xyXG5cdFx0XHRcdFx0aWYgKHN1Y2Nlc3MuZXJyX2NvZGUgPT0gMCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgZGF0YSA9IHN1Y2Nlc3MucmVzdWx0O1xyXG5cdFx0XHRcdFx0XHRpZiAoZGF0YS5yZXQgIT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciB0aXAgPSBkYXRhLmVycl9pbmZvID8gdHlwZW9mIGRhdGEuZXJyX2luZm8gPT0gJ3N0cmluZycgPyBkYXRhLmVycl9pbmZvIDpcclxuXHRcdFx0XHRcdFx0XHRcdGRhdGFcclxuXHRcdFx0XHRcdFx0XHRcdC5lcnJfaW5mby5qb2luKCc8YnIvPicpIDogJyc7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGRhdGEucmV0ID09IDgwMSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMucGFyYW0uT25seV9TY3JpcHRfRXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHBvcyA9IHRpcC5pbmRleE9mKFwi77yaXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocG9zID4gLTEpIHRpcCA9IHRpcC5zdWJzdHJpbmcocG9zICsgMSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiB0aXAsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRpcCArICcsJyArIHRoaXMudHJhbnNsYXRlU3lzKCd0aXAnKSArICc6JyArIGRhdGEucmV0LFxyXG5cdFx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgdGlwID0gZGF0YS5pbmZvID8gdHlwZW9mIGRhdGEuaW5mbyA9PSAnc3RyaW5nJyA/IGRhdGEuaW5mbyA6IGRhdGEuaW5mb1xyXG5cdFx0XHRcdFx0XHRcdFx0LmpvaW4oXHJcblx0XHRcdFx0XHRcdFx0XHRcdCc8YnIvPicpIDogJyc7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRpcCkgdW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiB0aXAsXHJcblx0XHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR2YXIgYWN0aW9ubGlzdCA9IGRhdGEuYWN0aW9uO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChhY3Rpb25saXN0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhhY3Rpb25saXN0KTtcclxuXHRcdFx0XHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYWN0aW9ubGlzdC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgYWN0aW9uID0gYWN0aW9ubGlzdFtpXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFjdGlvbi5hY3Rpb25fdHlwZSA9PSAnc2V0X2RsZ19hdHRyJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciByZXN1bHQgPSBhY3Rpb24udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChyZXN1bHRbaV0uY2hvaWNlX2xpc3QpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgYyA9IDA7IGMgPCAkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQubGVuZ3RoOyBjKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgYXR0ciA9ICR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5pdGVtc1tjXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYXR0ci5uYW1lICE9ICdMYXlvdXQnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYXR0ci5maWVsZElkID09IHJlc3VsdFtpXS5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBkaWN0SXRlbUxpc3QgPSBbXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgZCBpbiByZXN1bHRbaV0uY2hvaWNlX2xpc3QpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgdmFsID0gcmVzdWx0W2ldLmNob2ljZV9saXN0W2RdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRpY3RJdGVtTGlzdC5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ05fU19OQU1FXCI6IHZhbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ05fU19WQUxVRVwiOiB2YWwsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogdmFsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJ2YWx1ZVwiOiB2YWxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLmRpY3QgPSBkaWN0SXRlbUxpc3Q7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhdHRyLm5hbWUgPT0gJ0xheW91dCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIuc2V0dGluZy5jb2xMaXN0LmZvckVhY2goY29sID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb2wuZmllbGRJZCA9PSByZXN1bHRbaV1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgZGljdEl0ZW1MaXN0ID0gW107XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBkIGluIHJlc3VsdFtpXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5jaG9pY2VfbGlzdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgdmFsID0gcmVzdWx0W2ldXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNob2ljZV9saXN0W2RdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkaWN0SXRlbUxpc3QucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDTl9TX05BTUVcIjogdmFsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ05fU19WQUxVRVwiOiB2YWwsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJ0ZXh0XCI6IHZhbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInZhbHVlXCI6IHZhbFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC5kaWN0ID0gZGljdEl0ZW1MaXN0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgYyA9IDA7IGMgPCAkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Lmxlbmd0aDsgYysrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBhdHRyID0gJHRoaXMuJGRhdGEuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zW2NdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhhdHRyW2pdLk5hbWUrJz09JytyZXN1bHRbaV0uYXR0cik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8v5Yik5pat6KGo5Y2V6YeM5piv5ZCm5pyJ6L+U5Zue5a2X5q6177yM5rKh5pyJ5bCx6KOF6L295YiwbW9kZWzph4zvvIzngrnlh7vnoa7lrprmj5DkuqTnmoTml7blgJnluKbkuIrov5nkupvmlbDmja5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5tb2RlbFtyZXN1bHRbaV0uYXR0cl0gPT1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWxbcmVzdWx0W2ldLmF0dHJdID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdFtpXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8v5Yik5pat5piv5ZCm5piv5qCF5qC86KGo5Y2VXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhdHRyLm5hbWUgIT0gJ0xheW91dCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYXR0ci5maWVsZElkID09IHJlc3VsdFtpXS5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLnZhbHVlID0gJyc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLm9sZHZhbHVlID0gJyc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLnZhbHVlID0gcmVzdWx0W2ldLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXR0ci5vbGR2YWx1ZSA9IHJlc3VsdFtpXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5tb2RlbFthdHRyLmZpZWxkSWRdID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0W2ldXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYXR0ci5uYW1lID09ICdMYXlvdXQnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXR0ci5zZXR0aW5nLmNvbExpc3QuZm9yRWFjaChjb2wgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29sLmZpZWxkSWQgPT0gcmVzdWx0W2ldLmF0dHIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb2wudmFsdWUgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb2wub2xkdmFsdWUgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb2wudmFsdWUgPSByZXN1bHRbaV0udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sLm9sZHZhbHVlID0gcmVzdWx0W2ldLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5tb2RlbFtjb2xcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5maWVsZElkXSA9IHJlc3VsdFtpXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgbGVuZ3RoID0gMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghJHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlLmZpbHRlcihmdW5jdGlvbihzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdFtpXS5hdHRyID09IHMuYXR0clxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGVuZ3RoID0gMTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlLnB1c2gocmVzdWx0W2ldKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChsZW5ndGggPT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8ICR0aGlzLiRkYXRhLnJlZmRhdGFzdG9yZS5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICgkdGhpcy4kZGF0YS5yZWZkYXRhc3RvcmVbal0uYXR0ciA9PSByZXN1bHRbaV1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy4kZGF0YS5yZWZkYXRhc3RvcmVbal0udmFsdWUgPSByZXN1bHRbaV1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb24uYWN0aW9uX3R5cGUgPT0gJ3NldF9kbGdfYXR0cl9zaG93Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciByZXN1bHQgPSBhY3Rpb24udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0LmZvckVhY2goYXN5bmMgKGF0dHIsIGtleSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJGRhdGEuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zLmZvckVhY2goXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFzeW5jIChlbGUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5kZXgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL+WIpOaWreaYr+WQpuaYr+agheagvOihqOWNlVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbGUubmFtZSAhPSAnTGF5b3V0Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVsZS5maWVsZElkID09IGF0dHIuYXR0cikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbGUuc2hvdyA9IGF0dHIuc2hvdztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGVsZS5uYW1lID09ICdMYXlvdXQnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbGUuc2V0dGluZy5jb2xMaXN0LmZvckVhY2goXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbCA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZmllbGRJZCA9PVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC5zaG93ID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnNob3c7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBoZWFkX3N0eWxlZGVmID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSgkdGhpcy4kZGF0YVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmhlYWRfc3R5bGVkZWYpKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmID0gW107XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJGRhdGEuaGVhZF9zdHlsZWRlZiA9IGhlYWRfc3R5bGVkZWY7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coJHRoaXMuJGRhdGEuaGVhZF9zdHlsZWRlZik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uLmFjdGlvbl90eXBlID09ICdzZXRfZ2xvYmFsX2F0dHInKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJGRhdGEuZ2xvYmFsX2F0dHIgPSBhY3Rpb24udmFsdWUgfHwgW107XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVN5cyhcInF1b3RhdGlvbl9tYXJrX2xlZnRcIikgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhY3Rpb25cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmFjdGlvbl90eXBlICsgdGhpcy50cmFuc2xhdGVTeXMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJxdW90YXRpb25fbWFya19yaWdodFwiKSArIHRoaXMudHJhbnNsYXRlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwidGlwX2FjdGlvbl91bnByb2Nlc3NlZFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0Ly8gdmFyIGhlYWRfc3R5bGVkZWYgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KCR0aGlzLmhlYWRfc3R5bGVkZWYpKTtcclxuXHRcdFx0XHRcdFx0XHQvLyAkdGhpcy5oZWFkX3N0eWxlZGVmPVtdO1xyXG5cdFx0XHRcdFx0XHRcdC8vICR0aGlzLmhlYWRfc3R5bGVkZWYgPSBoZWFkX3N0eWxlZGVmO1xyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCR0aGlzLmhlYWRfc3R5bGVkZWYpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0YS5yZXN1bHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhciByZXN1bHQgPSBkYXRhLnJlc3VsdDtcclxuXHRcdFx0XHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvciAodmFyIGMgPSAwOyBjIDwgJHRoaXMuJGRhdGEuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zLmxlbmd0aDsgYysrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGF0dHIgPSAkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXNbY107XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly/liKTmlq3ooajljZXph4zmmK/lkKbmnInov5Tlm57lrZfmrrXvvIzmsqHmnInlsLHoo4Xovb3liLBtb2RlbOmHjO+8jOeCueWHu+ehruWumuaPkOS6pOeahOaXtuWAmeW4puS4iui/meS6m+aVsOaNrlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICgkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWxbcmVzdWx0W2ldLmF0dHJdID09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW3Jlc3VsdFtpXS5hdHRyXSA9IHJlc3VsdFtpXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8v5Yik5pat5piv5ZCm5piv5qCF5qC86KGo5Y2VXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGF0dHIubmFtZSAhPSAnTGF5b3V0Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGF0dHIuZmllbGRJZCA9PSByZXN1bHRbaV0uYXR0cikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLnZhbHVlID0gJyc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIub2xkdmFsdWUgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXR0ci52YWx1ZSA9IHJlc3VsdFtpXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXR0ci5vbGR2YWx1ZSA9IHJlc3VsdFtpXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW2F0dHIuZmllbGRJZF0gPSByZXN1bHRbaV1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhdHRyLm5hbWUgPT0gJ0xheW91dCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIuc2V0dGluZy5jb2xMaXN0LmZvckVhY2goY29sID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb2wuZmllbGRJZCA9PSByZXN1bHRbaV0uYXR0cikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sLnZhbHVlID0gJyc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb2wub2xkdmFsdWUgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC52YWx1ZSA9IHJlc3VsdFtpXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC5vbGR2YWx1ZSA9IHJlc3VsdFtpXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5tb2RlbFtjb2xcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZmllbGRJZF0gPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHRbaV0udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBsZW5ndGggPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoISR0aGlzLiRkYXRhLnJlZmRhdGFzdG9yZS5maWx0ZXIoZnVuY3Rpb24ocykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdFtpXS5hdHRyID09IHMuYXR0clxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxlbmd0aCA9IDE7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlLnB1c2gocmVzdWx0W2ldKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAobGVuZ3RoID09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8ICR0aGlzLiRkYXRhLnJlZmRhdGFzdG9yZS5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCR0aGlzLiRkYXRhLnJlZmRhdGFzdG9yZVtqXS5hdHRyID09IHJlc3VsdFtpXS5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLiRkYXRhLnJlZmRhdGFzdG9yZVtqXS52YWx1ZSA9IHJlc3VsdFtpXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcImVycm9yXCIpICsgXCIzXCIsXHJcblx0XHRcdFx0XHRcdFx0Y29udGVudDogc3VjY2Vzcy5lcnJfbXNnLFxyXG5cdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KS5jYXRjaChleCA9PiB7XHJcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhleCk7XHJcblx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwiZXJyb3JcIikgKyBcIjMuMVwiLFxyXG5cdFx0XHRcdFx0XHRjb250ZW50OiBleC5lcnJNc2csXHJcblx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHREYXRhT2JqUnVuQ3VzdG9tRXZlbnRfUmV0dXJuKGV2ZW50aWQsIGRhdGFfYXR0ciwgYnV0dG9uX2NhbGxiYWNrLCBpdGVtKSB7XHJcblx0XHRcdFx0dmFyIGVudmlyb21lbnQgPSB7XHJcblx0XHRcdFx0XHQnZnVuY3Rpb24nOiAnMzAwMCcsIC8vIOWKn+iDveeCuee8luWPt1xyXG5cdFx0XHRcdFx0Y2xzX2lkOiB0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHMuaWQsIC8vIOWKn+iDveeCueS4u+aVsOaNruexu+agh+ivhlxyXG5cdFx0XHRcdFx0J2J1dHRvbic6ICd0b3AnLCAvLyB0b3AvYm90dG9tXHJcblx0XHRcdFx0XHRidXR0b25fbmFtZTogdGhpcy50cmFuc2xhdGVTeXMoJ2FkZDInKSxcclxuXHRcdFx0XHRcdG1hc3Rlcjoge1xyXG5cdFx0XHRcdFx0XHRjbHNfaWQ6IHRoaXMuJGRhdGEucGFyYW0uRGF0YUNscy5pZCwgLy8gYnV0dG9uPWJvdHRvbeaXtiBtYXN0ZXLnmoRjbHNfaWRcclxuXHRcdFx0XHRcdFx0Ly9vYmpfaWQ6ICcnICAvLyBidXR0b249Ym90dG9t5pe2IG1hc3RlcueahG9ial9pZFxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0dmFyIG9ial9hdHRyID0gdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWw7XHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2cob2JqX2F0dHIpO1xyXG5cdFx0XHRcdHZhciByZXEgPSBPYmplY3Qua2V5cyhvYmpfYXR0cikubWFwKChhKSA9PiAoe1xyXG5cdFx0XHRcdFx0YXR0cjogYSxcclxuXHRcdFx0XHRcdHZhbDogb2JqX2F0dHJbYV0gfHwgXCJcIixcclxuXHRcdFx0XHR9KSk7XHJcblx0XHRcdFx0aWYgKHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy4kZGF0YS5yZWZkYXRhc3RvcmUubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0aWYgKCFyZXEuZmlsdGVyKGZ1bmN0aW9uKHMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLiRkYXRhLnJlZmRhdGFzdG9yZVtpXS5hdHRyID09IHMubmFtZVxyXG5cdFx0XHRcdFx0XHRcdH0pLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdGxlbmd0aCA9IDE7XHJcblx0XHRcdFx0XHRcdFx0cmVxLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0J2F0dHInOiB0aGlzLiRkYXRhLnJlZmRhdGFzdG9yZVtpXS5hdHRyLFxyXG5cdFx0XHRcdFx0XHRcdFx0J3ZhbCc6IHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlW2ldLnZhbHVlXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dmFyIGV4dGluZm8gPSBlbnZpcm9tZW50O1xyXG5cdFx0XHRcdGV4dGluZm8uZWRpdF9kbGcgPSB7XHJcblx0XHRcdFx0XHR0eXBlOiAnc21hbGwnLCAvL+Wwj+eql+WPo1xyXG5cdFx0XHRcdFx0Y2xhc3NfaWQ6IHRoaXMuJGRhdGEucGFyYW0uRGF0YUNscy5pZCwgLy/lvZPliY3mlbDmja7nsbtpZFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyB2YXIgZGF0YUluZm8gPSB7XHJcblx0XHRcdFx0Ly8gXHRlZHR5cGU6ICBcIjBcIiwgZXZlbnRpZDogZXZlbnRpZCwgcHJvamVjdGlkOiAnJyxyY2xzaWQ6ICcnLCByb2JqaWQ6ICcnLCB1c2VybG9naW46ICcnLCBcclxuXHRcdFx0XHQvLyBcdGNsc2lkOiB0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHMuaWQsIG9iamlkOiAnJyxhdHRyOiBKU09OLnN0cmluZ2lmeShyZXEpLCBcclxuXHRcdFx0XHQvLyBcdGV4dGluZm86IEpTT04uc3RyaW5naWZ5KGV4dGluZm8pLCBnbG9iYWxfYXR0cjogSlNPTi5zdHJpbmdpZnkodGhpcy4kZGF0YS5nbG9iYWxfYXR0cilcclxuXHRcdFx0XHQvLyB9XHJcblx0XHRcdFx0ZXh0aW5mbyA9IEJhc2U2NC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoZXh0aW5mbykpOyAvL+WwhuWtl+espuS4sui9rOaNouS4umJhc2U2NOe8lueggVxyXG5cdFx0XHRcdHZhciBnbG9iYWxfYXR0ciA9IEJhc2U2NC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodGhpcy4kZGF0YS5nbG9iYWxfYXR0cikpOyAvL+WwhuWtl+espuS4sui9rOaNouS4umJhc2U2NOe8lueggVxyXG5cdFx0XHRcdHZhciBvYmpfYXR0ciA9IHt9O1xyXG5cdFx0XHRcdHJlcS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG5cdFx0XHRcdFx0b2JqX2F0dHJbaXRlbS5hdHRyXSA9IGl0ZW0udmFsO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdGlmICghZXZlbnRpZC5pbmNsdWRlcygneycpKSBldmVudGlkID0gJ3snICsgZXZlbnRpZCArICd9JztcclxuXHRcdFx0XHR2YXIgZGF0YUluZm8gPSB7XHJcblx0XHRcdFx0XHRlZF90eXBlOiBcIjBcIixcclxuXHRcdFx0XHRcdHN0YXJ0X3RyYW5zYWN0aW9uOiB0cnVlLFxyXG5cdFx0XHRcdFx0Y2xhc3NfaWQ6IHRoaXMuJGRhdGEucGFyYW0uRGF0YUNscy5pZCxcclxuXHRcdFx0XHRcdGNsYXNzX25hbWU6ICcnLFxyXG5cdFx0XHRcdFx0ZXZlbnRfaWQ6IGV2ZW50aWQsXHJcblx0XHRcdFx0XHRldmVudF9uYW1lOiAnJyxcclxuXHRcdFx0XHRcdGRhdGFfb2JqX2lkOiAnJyxcclxuXHRcdFx0XHRcdG9ial9hdHRyOiBvYmpfYXR0cixcclxuXHRcdFx0XHRcdHByal9pZDogJycsXHJcblx0XHRcdFx0XHRyZWZfY2xzX2lkOiAnJyxcclxuXHRcdFx0XHRcdHJlbF9vYmpfaWQ6ICcnLFxyXG5cdFx0XHRcdFx0dXNlcl9sb2dpbjogJycsXHJcblx0XHRcdFx0XHRkYXRhX2pzb246ICcnLFxyXG5cdFx0XHRcdFx0Y29tcG9zZV9pbmZvOiAnJyxcclxuXHRcdFx0XHRcdGV4dF9pbmZvOiBleHRpbmZvLFxyXG5cdFx0XHRcdFx0Z2xvYmFsX2F0dHI6IGdsb2JhbF9hdHRyLFxyXG5cdFx0XHRcdFx0aW5wdXRfcGFyYW06ICcnLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0Y29uc29sZS5sb2coZGF0YUluZm8pO1xyXG5cdFx0XHRcdC8vIHJldHVybjtcclxuXHRcdFx0XHR0aGlzLiRzdG9yZS5kaXNwYXRjaCgncnVuQ3VzdG9tRXZlbnQnLCBkYXRhSW5mbykudGhlbihzdWNjZXNzID0+IHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKHN1Y2Nlc3MpO1xyXG5cdFx0XHRcdFx0aWYgKHN1Y2Nlc3MuZXJyX2NvZGUgPT0gMCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgZGF0YSA9IHN1Y2Nlc3MucmVzdWx0O1xyXG5cdFx0XHRcdFx0XHRpZiAoZGF0YS5yZXQgIT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciB0aXAgPSBkYXRhLmVycl9pbmZvID8gdHlwZW9mIGRhdGEuZXJyX2luZm8gPT0gJ3N0cmluZycgPyBkYXRhLmVycl9pbmZvIDpcclxuXHRcdFx0XHRcdFx0XHRcdGRhdGFcclxuXHRcdFx0XHRcdFx0XHRcdC5lcnJfaW5mby5qb2luKCc8YnIvPicpIDogJyc7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGRhdGEucmV0ID09IDgwMSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMucGFyYW0uT25seV9TY3JpcHRfRXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHBvcyA9IHRpcC5pbmRleE9mKFwi77yaXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAocG9zID4gLTEpIHRpcCA9IHRpcC5zdWJzdHJpbmcocG9zICsgMSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiB0aXAsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRpcCArICcsJyArIHRoaXMudHJhbnNsYXRlU3lzKCd0aXAnKSArICc6JyArIGRhdGEucmV0LFxyXG5cdFx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgdGlwID0gZGF0YS5pbmZvID8gdHlwZW9mIGRhdGEuaW5mbyA9PSAnc3RyaW5nJyA/IGRhdGEuaW5mbyA6IGRhdGEuaW5mb1xyXG5cdFx0XHRcdFx0XHRcdFx0LmpvaW4oXHJcblx0XHRcdFx0XHRcdFx0XHRcdCc8YnIvPicpIDogJyc7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRpcCkgdW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiB0aXAsXHJcblx0XHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0YSAhPSBcIlwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgYWN0aW9ucyA9IGRhdGEuYWN0aW9uO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coYWN0aW9ucyk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoYWN0aW9ucykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgYWN0aW9uID0gYWN0aW9uc1tpXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgdmFsID0gYWN0aW9uLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBlbnZpcm9tZW50ID0gSlNPTi5zdHJpbmdpZnkoZW52aXJvbWVudCk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhY3Rpb24uYWN0aW9uX3R5cGUgPT0gJ29wZW5fcGFuZWwnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgZCA9IGRpYWxvZyh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiAnPGkgY2xhc3M9XCJhY2UtaWNvbiBmYSBmYS1pbmZvLWNpcmNsZVwiPjwvaT4gJyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU3lzKFwicXVvdGF0aW9uX21hcmtfbGVmdFwiKSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YWN0aW9uXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmFjdGlvbl90eXBlICsgdGhpcy50cmFuc2xhdGVTeXMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInF1b3RhdGlvbl9tYXJrX3JpZ2h0XCIpICsgdGhpcy50cmFuc2xhdGUoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInRpcF9hY3Rpb25fdW5wcm9jZXNzZWRcIilcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZC5zaG93KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb24uYWN0aW9uX3R5cGUgPT0gJ29wZW5fc2VsZWN0X3VzZXJkbGcnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgc3R5bGUgPSB2YWwuc3R5bGU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBzdHlsZSA9PSAndXNlcicgPyAn6YCJ5oup5Lq65ZGYJyA6IHN0eWxlID09ICdkZXBhcnRtZW50JyA/ICfpgInmi6npg6jpl6gnIDogc3R5bGUgPT0gJ3JvbGUnID8gJ+mAieaLqeinkuiJsicgOiAnJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyICR0aGlzID0gdGhpcztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBwYXJhbSA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aXRlbTogaXRlbSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnV0dG9uX2NhbGxiYWNrOiBidXR0b25fY2FsbGJhY2ssXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlcTogcmVxLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhX2F0dHI6IGRhdGFfYXR0clxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pLm5hdmlnYXRlVG8oe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1cmw6ICcuLi9zZWxwc24vaW5kZXg/bXVsaXQ9ZmFsc2UmcGFyYW09JyArIEpTT05cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuc3RyaW5naWZ5KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyYW0pLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRldmVudHM6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRBZGRQZXIoZGF0YSwgcGFyYW0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKHBhcmFtKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGRhdGEpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGNhbGxiYWNrX2V2ZW50aWQgPSBwYXJhbVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuYnV0dG9uX2NhbGxiYWNrXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC50cmltKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgaW5mbyA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXZlbnRpZDogY2FsbGJhY2tfZXZlbnRpZCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWR0eXBlOiBcIjBcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvamVjdGlkOiAnJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmNsc2lkOiAnJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cm9iamlkOiAnJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dXNlcmxvZ2luOiAnJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xzaWQ6ICR0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuaWQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9iamlkOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyOiBwYXJhbS5yZXEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlucHV0cGFyYW1ldGVyOiBkYXRhLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhSnNvbjogW10sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5EYXRhT2JqUnVuQ3VzdG9tRXZlbnQoaW5mbywgcGFyYW1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmRhdGFfYXR0cik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGFjdGlvbi5hY3Rpb25fdHlwZSA9PSAnb3Blbl9kYXRhX3F1ZXJ5X2RsZycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBkID0gZGlhbG9nKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6ICc8aSBjbGFzcz1cImFjZS1pY29uIGZhIGZhLWluZm8tY2lyY2xlXCI+PC9pPiAnICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudDogdGhpcy50cmFuc2xhdGVTeXMoXCJxdW90YXRpb25fbWFya19sZWZ0XCIpICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhY3Rpb25cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuYWN0aW9uX3R5cGUgKyB0aGlzLnRyYW5zbGF0ZVN5cyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwicXVvdGF0aW9uX21hcmtfcmlnaHRcIikgKyB0aGlzLnRyYW5zbGF0ZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwidGlwX2FjdGlvbl91bnByb2Nlc3NlZFwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkLnNob3coKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGFjdGlvbi5hY3Rpb25fdHlwZSA9PSAnb3Blbl9jb21tb25fZGxnJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyICR0aGlzID0gdGhpcztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh2YWwuY29tbW9uX2RsZ19pZCA9PSAnY2hlY2tfbGlzdCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJGRhdGEuY2hlY2tfbGlzdCA9IHZhbC5jb25maWc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh2YWwuY29uZmlnLmFwcGVhcl9zdHlsZSA9PSAnc2lkZXNsaXAnKSAvL+WIpOaWreaYr+WQpuaYr+S+p+a7kVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLiRkYXRhLnBvcHVwVHlwZSA9ICdyaWdodCc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsc2VcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy4kZGF0YS5wb3B1cFR5cGUgPSAnY2VudGVyJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBvcGVuIOaWueazleS8oOWFpeWPguaVsCDnrYnlkIzlnKggdW5pLXBvcHVwIOe7hOS7tuS4iue7keWumiB0eXBl5bGe5oCnXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLiRyZWZzLnBvcHVwLm9wZW4oJHRoaXMuJGRhdGEucG9wdXBUeXBlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIHBvcHVwUGFyYW0gPSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aXRlbTogaXRlbSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRidXR0b25fY2FsbGJhY2s6IGJ1dHRvbl9jYWxsYmFjayxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXE6IHJlcSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhX2F0dHI6IGRhdGFfYXR0clxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLiRkYXRhLnBvcHVwUGFyYW0gPSBwb3B1cFBhcmFtO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uLmFjdGlvbl90eXBlID09ICdvcGVuX3Byb2plY3RfcXVlcnlfZGxnJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9jb25zb2xlLmxvZyhhY3Rpb24udmFsdWUuc2VsZWN0X3JhbmdlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vY29uc29sZS5sb2coYWN0aW9uLnZhbHVlLm11bGl0X3NlbGVjdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgcHJpUmVsID0gJy0xJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhY3Rpb24udmFsdWUuc2VsZWN0X3JhbmdlID09ICflhajpg6jnm7jlhbMnKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcmlSZWwgPSAnMCc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbHNlIGlmIChhY3Rpb24udmFsdWUuc2VsZWN0X3JhbmdlID09ICfmiJHotJ/otKPnmoTpobnnm64nKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcmlSZWwgPSAnMSc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbHNlIGlmIChhY3Rpb24udmFsdWUuc2VsZWN0X3JhbmdlID09ICfmiJHliJvlu7rnmoQnKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcmlSZWwgPSAnMic7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbHNlIGlmIChhY3Rpb24udmFsdWUuc2VsZWN0X3JhbmdlID09ICfmiJHlj4LkuI7nmoQnIHx8IGFjdGlvbi52YWx1ZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuc2VsZWN0X3JhbmdlID09ICfmiJHlj4LliqDnmoQnKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcmlSZWwgPSAnMyc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbHNlIGlmIChhY3Rpb24udmFsdWUuc2VsZWN0X3JhbmdlID09ICfmiJHlhbPms6jnmoQnKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcmlSZWwgPSAnNCc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbHNlIGlmIChhY3Rpb24udmFsdWUuc2VsZWN0X3JhbmdlID09ICfmiJHkuIvlsZ7nmoTpobnnm64nKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcmlSZWwgPSAnNSc7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyICR0aGlzID0gdGhpcztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBwYXJhbV8gPSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGl0ZW06IGl0ZW0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJ1dHRvbl9jYWxsYmFjazogYnV0dG9uX2NhbGxiYWNrLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXE6IHJlcVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pLm5hdmlnYXRlVG8oe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1cmw6ICcuLi9zZWxQcmovaW5kZXg/cmVsYXRpb249JyArIHByaVJlbCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JyZwYXJhbT0nICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShwYXJhbV8pLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRldmVudHM6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRBZGRQZXIoZGF0YSwgcGFyYW0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBhdHRyID0gcGFyYW0uaXRlbS5maWVsZElkO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW2F0dHJdID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVswXS5JRCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCc7JyArIGRhdGFbMF0uTmFtZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAkdGhpcy4kZGF0YS5jbGFzc0F0dHJMaXN0W3BhcmFtLmluZGV4XS5BdHRyW3BhcmFtLmlpbmRleF0uVmFsdWU9ZGF0YVswXS5OYW1lO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gJHRoaXMuJGRhdGEuY2xhc3NBdHRyTGlzdFtwYXJhbS5pbmRleF0uQXR0cltwYXJhbS5paW5kZXhdLlZhbElEPWRhdGFbMF0uSUQrJzsnK2RhdGFbMF0uTmFtZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBjYWxsYmFja19ldmVudGlkID0gcGFyYW1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmJ1dHRvbl9jYWxsYmFja1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudHJpbSgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNhbGxiYWNrX2V2ZW50aWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGluZm8gPSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXZlbnRpZDogY2FsbGJhY2tfZXZlbnRpZCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlZHR5cGU6IFwiMlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2plY3RpZDogZGF0YVswXS5JRCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyY2xzaWQ6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cm9iamlkOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVzZXJsb2dpbjogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjbHNpZDogJHRoaXMuJGRhdGEucGFyYW1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5EYXRhQ2xzLmlkLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9iamlkOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHI6IHBhcmFtLnJlcSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhSnNvbjogW10sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLkRhdGFPYmpSdW5DdXN0b21FdmVudChpbmZvKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVN5cyhcInF1b3RhdGlvbl9tYXJrX2xlZnRcIikgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGlvbi5hY3Rpb25fdHlwZSArIHRoaXMudHJhbnNsYXRlU3lzKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJxdW90YXRpb25fbWFya19yaWdodFwiKSArIHRoaXMudHJhbnNsYXRlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJ0aXBfYWN0aW9uX3VucHJvY2Vzc2VkXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cygndGlwJykgKyBcIjUuMlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVN5cyhcInF1b3RhdGlvbl9tYXJrX2xlZnRcIikgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiYmVmb3JlX2NsaWNrX2J1dHRvblwiICsgdGhpcy50cmFuc2xhdGVTeXMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInF1b3RhdGlvbl9tYXJrX3JpZ2h0XCIpICsgdGhpcy50cmFuc2xhdGVTeXMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcImNvbW1hXCIpICsgJ2V2ZW50X2lkJyArIGV2ZW50aWQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwiZXJyb3JcIikgKyBcIjVcIixcclxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBzdWNjZXNzLmVycl9tc2csXHJcblx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pLmNhdGNoKGV4ID0+IHtcclxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKGV4KTtcclxuXHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoJ3RpcCcpICsgXCI1LjFcIixcclxuXHRcdFx0XHRcdFx0Y29udGVudDogZXguZXJyTXNnLFxyXG5cdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdC8v56Gu5a6aXHJcblx0XHRcdHNhdmEoKSB7XHJcblx0XHRcdFx0aWYgKHRoaXMuYWZ0ZXJfb2s/LmlkKSB7IC8vIOeCueWHu+ehruWumuaMiemSruWQjlxyXG5cdFx0XHRcdFx0dGhpcy5hZnRlck9LKCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRoaXMuYWRkKCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHRcdFx0YWRkKCkge1xyXG5cdFx0XHRcdHVuaS5zaG93TG9hZGluZyh7XHJcblx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJsb2FkaW5nXCIpLFxyXG5cdFx0XHRcdFx0bWFzazogdHJ1ZVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdHZhciBvYmpfYXR0ciA9IHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsO1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKG9ial9hdHRyKTtcclxuXHRcdFx0XHQvLyB2YXIgcmVxID0gT2JqZWN0LmtleXMob2JqX2F0dHIpLm1hcCgoYSkgPT4gKHtcclxuXHRcdFx0XHQvLyBcdG5hbWU6IGEsXHJcblx0XHRcdFx0Ly8gXHR2YWx1ZTogb2JqX2F0dHJbYV0gfHwgXCJcIixcclxuXHRcdFx0XHQvLyB9KSk7XHJcblxyXG5cdFx0XHRcdHZhciBlbnZpcm9tZW50ID0ge1xyXG5cdFx0XHRcdFx0J2Z1bmN0aW9uJzogJzMwMDAnLCAvLyDlip/og73ngrnnvJblj7dcclxuXHRcdFx0XHRcdGNsc19pZDogdGhpcy4kZGF0YS5wYXJhbS5EYXRhQ2xzLmlkLCAvLyDlip/og73ngrnkuLvmlbDmja7nsbvmoIfor4ZcclxuXHRcdFx0XHRcdCdidXR0b24nOiAndG9wJywgLy8gdG9wL2JvdHRvbVxyXG5cdFx0XHRcdFx0YnV0dG9uX25hbWU6IHRoaXMudHJhbnNsYXRlU3lzKCdhZGQyJyksXHJcblx0XHRcdFx0XHRtYXN0ZXI6IHtcclxuXHRcdFx0XHRcdFx0Y2xzX2lkOiB0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHMuaWQsXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRlbnZpcm9tZW50ID0gQmFzZTY0LmVuY29kZShKU09OLnN0cmluZ2lmeShlbnZpcm9tZW50KSk7IC8v5bCG5a2X56ym5Liy6L2s5o2i5Li6YmFzZTY057yW56CBXHJcblxyXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKG9ial9hdHRyKTtcclxuXHRcdFx0XHQvLyB2YXIgZGF0YUluZm89e1xyXG5cdFx0XHRcdC8vICAgICBjbGFzc19pZDogdGhpcy4kZGF0YS5wYXJhbS5EYXRhQ2xzLmlkLCBkYXRhX29ial9pZDogJycsIG1hc3RlcmNsc2lkOiAnJyxcclxuXHRcdFx0XHQvLyAgICAgcmVxOiBKU09OLnN0cmluZ2lmeShyZXEpLCB1cGZpbGU6IEpTT04uc3RyaW5naWZ5KFtdKSwgcG9zdF9kYXRhOiBKU09OLnN0cmluZ2lmeSh7fSksXHJcblx0XHRcdFx0Ly8gICAgIGNvbXBvc2U6IEpTT04uc3RyaW5naWZ5KFtdKSwgcmVmZGF0YXN0b3JlOiBKU09OLnN0cmluZ2lmeShbXSksIGV4dGluZm86IEpTT04uc3RyaW5naWZ5KGVudmlyb21lbnQpLCBcclxuXHRcdFx0XHQvLyBcdG5vdF90cmlnZ2VyX3N5c19ldmVudDogJydcclxuXHRcdFx0XHQvLyB9O1xyXG5cdFx0XHRcdHZhciBkYXRhSW5mbyA9IHtcclxuXHRcdFx0XHRcdGNsYXNzX2lkOiB0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHMuaWQsXHJcblx0XHRcdFx0XHRjbGFzc19uYW1lOiAnJyxcclxuXHRcdFx0XHRcdG1hc3Rlcl9jbHNfaWQ6ICcnLFxyXG5cdFx0XHRcdFx0bWFzdGVyX29ial9pZDogJycsXHJcblx0XHRcdFx0XHRjcmVhdG9yOiAnJyxcclxuXHRcdFx0XHRcdGNyZWF0b3JfbmFtZTogJycsXHJcblx0XHRcdFx0XHRub3RfdHJpZ2dlcl9ldmVudDogJycsXHJcblx0XHRcdFx0XHR1cGRhdGVfZXhpc3Q6ICcnLFxyXG5cdFx0XHRcdFx0cG9zdF9wcm9jZXNzOiAnJyxcclxuXHRcdFx0XHRcdGV4dF9pbmZvOiBlbnZpcm9tZW50LFxyXG5cdFx0XHRcdFx0b2JqX2F0dHI6IG9ial9hdHRyXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhkYXRhSW5mbyk7XHJcblx0XHRcdFx0Ly8gcmV0dXJuXHJcblx0XHRcdFx0dGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2NyZWF0ZURhdGFPYmonLCBkYXRhSW5mbykudGhlbihzdWNjZXNzID0+IHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKHN1Y2Nlc3MpO1xyXG5cdFx0XHRcdFx0dW5pLmhpZGVMb2FkaW5nKCk7XHJcblx0XHRcdFx0XHRpZiAoc3VjY2Vzcy5lcnJfY29kZSA9PSAwKSB7XHJcblx0XHRcdFx0XHRcdHZhciByZXN1bHQgPSBzdWNjZXNzLnJlc3VsdDtcclxuXHRcdFx0XHRcdFx0Ly8gaWYocmVzdWx0LnJlc3VsdF90eXBlID09IDApe31cclxuXHRcdFx0XHRcdFx0aWYgKHN1Y2Nlc3MucmVzdWx0LmFjdGlvbikge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBhY3Rpb24gPSBKU09OLnBhcnNlKHN1Y2Nlc3MucmVzdWx0LmFjdGlvbik7XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coYWN0aW9uKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoYWN0aW9uLnJldCA9PSAnMCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChhY3Rpb24ucmV0ICE9IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlKCdleGVjdXRlX3NjcmlwdF9mYWlsZWQnKSArIHRoaXNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC50cmFuc2xhdGVTeXMoJ2NvbW1hJykgKyB0aGlzLnRyYW5zbGF0ZSgncmVzdWx0JykgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnRyYW5zbGF0ZVN5cygnY29sb24nKSArIGFjdGlvbi5yZXN1bHQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoYWN0aW9uLmluZm8pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlKCdleGVjdXRlX3NjcmlwdF9mYWlsZWQnKSArIHRoaXNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC50cmFuc2xhdGVTeXMoJ2NvbW1hJykgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2xhdGVTeXMoJ2NvbG9uJykgKyBhY3Rpb24uaW5mbyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChhY3Rpb24ucmVzdWx0X3R5cGUgPT0gJzAnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHVuaS5zaG93VG9hc3Qoe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiBhY3Rpb24ucmVzdWx0LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGljb246IFwic3VjY2Vzc1wiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGR1cmF0aW9uOiAzMDAwXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIFwie1wicmV0XCI6MCwgXCJyZXN1bHRfdHlwZVwiOjAsIFwicmVzdWx0XCI6XCLliJvlu7rmiJDlip8xMjMxMjMxMjNcIixcImluZm9cIjpcIlwifVwiXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2VcclxuXHRcdFx0XHRcdFx0XHR1bmkuc2hvd1RvYXN0KHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZSgnY3JlYXRlX3N1Y2Nlc3MnKSxcclxuXHRcdFx0XHRcdFx0XHRcdGljb246IFwic3VjY2Vzc1wiLFxyXG5cdFx0XHRcdFx0XHRcdFx0ZHVyYXRpb246IDMwMDBcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLiRkYXRhLnBhcmFtLkFmdGVyX0J0bl9Ob3RfUmVmcmVzaCkge1xyXG5cdFx0XHRcdFx0XHRcdC8v5Yi35pawXHJcblx0XHRcdFx0XHRcdFx0dW5pLnJlZGlyZWN0VG8oe1xyXG5cdFx0XHRcdFx0XHRcdFx0dXJsOiAnLi4vbW9kYWwvMzAxOF8yP3BhcmFtPScgKyBKU09OLnN0cmluZ2lmeSh0aGlzLiRkYXRhLnBhcmFtKSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFwiJnRpdGxlbmFtZT1cIiArIHRoaXMuJGRhdGEudGl0bGVcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Ly8gdGhpcy5jbGFzc19hdHRyX2luaXQoKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcImVycm9yXCIpLFxyXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHN1Y2Nlc3MuZXJyX21zZyxcclxuXHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSkuY2F0Y2goZXggPT4ge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coZXgpO1xyXG5cdFx0XHRcdFx0dW5pLmhpZGVMb2FkaW5nKCk7XHJcblx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRjb250ZW50OiBleC5lcnJNc2csXHJcblx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRhZnRlck9LKCkge1xyXG5cdFx0XHRcdHZhciBvYmpfYXR0ciA9IHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsO1xyXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKG9ial9hdHRyKTtcclxuXHRcdFx0XHR2YXIgaW5wdXRfcGFyYW0gPSB7XHJcblx0XHRcdFx0XHRpZDogXCJcIixcclxuXHRcdFx0XHRcdGF0dHJzOiBPYmplY3Qua2V5cyhvYmpfYXR0cikubWFwKChhKSA9PiAoe1xyXG5cdFx0XHRcdFx0XHRhdHRyOiBhLFxyXG5cdFx0XHRcdFx0XHR2YWx1ZTogb2JqX2F0dHJbYV0sXHJcblx0XHRcdFx0XHR9KSksXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRpZiAoIXRoaXMuYWZ0ZXJfb2suaWQuaW5jbHVkZXMoJ3snKSkgdGhpcy5hZnRlcl9vay5pZCA9ICd7JyArIHRoaXMuYWZ0ZXJfb2suaWQgKyAnfSc7XHJcblx0XHRcdFx0dmFyIGRhdGFJbmZvID0ge1xyXG5cdFx0XHRcdFx0ZWRfdHlwZTogXCIwXCIsXHJcblx0XHRcdFx0XHRzdGFydF90cmFuc2FjdGlvbjogdHJ1ZSxcclxuXHRcdFx0XHRcdGNsYXNzX2lkOiB0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHMuaWQsXHJcblx0XHRcdFx0XHRjbGFzc19uYW1lOiAnJyxcclxuXHRcdFx0XHRcdGV2ZW50X2lkOiB0aGlzLmFmdGVyX29rLmlkLFxyXG5cdFx0XHRcdFx0ZXZlbnRfbmFtZTogJycsXHJcblx0XHRcdFx0XHRkYXRhX29ial9pZDogJycsXHJcblx0XHRcdFx0XHRvYmpfYXR0cjogb2JqX2F0dHIsXHJcblx0XHRcdFx0XHRwcmpfaWQ6ICcnLFxyXG5cdFx0XHRcdFx0cmVmX2Nsc19pZDogJycsXHJcblx0XHRcdFx0XHRyZWxfb2JqX2lkOiAnJyxcclxuXHRcdFx0XHRcdHVzZXJfbG9naW46ICcnLFxyXG5cdFx0XHRcdFx0ZGF0YV9qc29uOiAnJyxcclxuXHRcdFx0XHRcdGNvbXBvc2VfaW5mbzogJycsXHJcblx0XHRcdFx0XHRpbnB1dF9wYXJhbTogJycsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhkYXRhSW5mbyk7XHJcblx0XHRcdFx0Ly8gcmV0dXJuO1xyXG5cdFx0XHRcdHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdydW5DdXN0b21FdmVudCcsIGRhdGFJbmZvKS50aGVuKHN1Y2Nlc3MgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coc3VjY2Vzcyk7XHJcblx0XHRcdFx0XHRpZiAoc3VjY2Vzcy5lcnJfY29kZSA9PSAwKSB7XHJcblx0XHRcdFx0XHRcdHZhciBkYXRhID0gc3VjY2Vzcy5yZXN1bHQ7XHJcblx0XHRcdFx0XHRcdGlmIChkYXRhLnJldCAhPSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIHRpcCA9IGRhdGEuZXJyX2luZm8gPyB0eXBlb2YgZGF0YS5lcnJfaW5mbyA9PSAnc3RyaW5nJyA/IGRhdGEuZXJyX2luZm8gOlxyXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YVxyXG5cdFx0XHRcdFx0XHRcdFx0LmVycl9pbmZvLmpvaW4oJzxici8+JykgOiAnJztcclxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0YS5yZXQgPT0gODAxKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5wYXJhbS5Pbmx5X1NjcmlwdF9FcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgcG9zID0gdGlwLmluZGV4T2YoXCLvvJpcIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChwb3MgPiAtMSkgdGlwID0gdGlwLnN1YnN0cmluZyhwb3MgKyAxKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRpcCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudDogdGlwICsgJywnICsgdGhpcy50cmFuc2xhdGVTeXMoJ3RpcCcpICsgJzonICsgZGF0YS5yZXQsXHJcblx0XHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHZhciB0aXAgPSBkYXRhLmluZm8gPyB0eXBlb2YgZGF0YS5pbmZvID09ICdzdHJpbmcnID8gZGF0YS5pbmZvIDogZGF0YS5pbmZvXHJcblx0XHRcdFx0XHRcdFx0XHQuam9pbihcclxuXHRcdFx0XHRcdFx0XHRcdFx0Jzxici8+JykgOiAnJztcclxuXHRcdFx0XHRcdFx0XHRpZiAodGlwKSB1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRpcCxcclxuXHRcdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHZhciByZXN1bHQgPSBkYXRhLnJlc3VsdDtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcImVycm9yXCIpICsgXCI3XCIsXHJcblx0XHRcdFx0XHRcdFx0Y29udGVudDogc3VjY2Vzcy5lcnJfbXNnLFxyXG5cdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KS5jYXRjaChleCA9PiB7XHJcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhleCk7XHJcblx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKCd0aXAnKSArIFwiNy4xXCIsXHJcblx0XHRcdFx0XHRcdGNvbnRlbnQ6IGV4LmVyck1zZyxcclxuXHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRjYW5jZWwoZSkgeyAvL+WPlua2iFxyXG5cdFx0XHRcdHVuaS5uYXZpZ2F0ZUJhY2soe1xyXG5cdFx0XHRcdFx0ZGVsdGE6IDEgLy/ov5Tlm57lsYLmlbDvvIwy5YiZ5LiK5LiK6aG1XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0sXHJcblx0XHRcdHRyYW5zbGF0ZSh0KSB7XHJcblx0XHRcdFx0aWYgKHR5cGVvZiB0aGlzLiR0ID09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRoaXMuJHQoYHBhZ2UuJHt0fWApXHJcblx0XHRcdFx0ZWxzZSByZXR1cm4gdDtcclxuXHRcdFx0fSxcclxuXHRcdFx0dHJhbnNsYXRlU3lzKHQpIHtcclxuXHRcdFx0XHRpZiAodHlwZW9mIHRoaXMuJHQgPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdGhpcy4kdChgc3lzLiR7dH1gKVxyXG5cdFx0XHRcdGVsc2UgcmV0dXJuIHQ7XHJcblx0XHRcdH0sXHJcblx0XHR9LFxyXG5cdH07XHJcbjwvc2NyaXB0PlxyXG48c3R5bGU+XHJcblx0LnBvcHVwLWNvbnRlbnQge1xyXG5cdFx0QGluY2x1ZGUgZmxleDtcclxuXHJcblx0fVxyXG5cclxuXHQucG9wdXAtaGVpZ2h0IHtcclxuXHRcdEBpbmNsdWRlIGhlaWdodDtcclxuXHRcdC8qIHdpZHRoOiAyMDBweDsgKi9cclxuXHR9XHJcbjwvc3R5bGU+XHJcbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxyXG5cdC51bmktcGFnZS1tb2RhbC0zMDE4LTIge1xyXG5cdFx0ZGlzcGxheTogZmxleDtcclxuXHRcdGhlaWdodDogY2FsYygxMDB2aCAtIDMwcnB4KTtcclxuXHRcdHdpZHRoOiA3MjBycHg7XHJcblx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uICFpbXBvcnRhbnQ7XHJcblx0XHRwYWRkaW5nOiAxNXJweDtcclxuXHJcblx0XHQudi1oZWFkU3R5bGUge1xyXG5cdFx0XHQvKiBib3JkZXI6IDAuMXJweCBzb2xpZCByZWQ7ICovXHJcblx0XHRcdC8qIGxpbmUtaGVpZ2h0OiAzMHJweDsgKi9cclxuXHRcdFx0Ly8gcGFkZGluZzogNXJweCAwO1xyXG5cdFx0XHR3aWR0aDogOTglO1xyXG5cdFx0fVxyXG5cclxuXHRcdC52LWhlYWRTdHlsZTpmaXJzdC1jaGlsZCB7XHJcblx0XHRcdG1hcmdpbi10b3A6IDE1cnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC52LWhlYWRTdHlsZSAudHh0X3RpdGxlIHtcclxuXHRcdFx0Zm9udC1zaXplOiAzNHJweDtcclxuXHRcdFx0dGV4dC1hbGlnbjogcmlnaHQ7XHJcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuXHRcdFx0LyogdmVydGljYWwtYWxpZ246IDI0cnB4OyAqL1xyXG5cclxuXHRcdFx0LyogYm9yZGVyOiAwLjFycHggc29saWQgcmVkOyAqL1xyXG5cdFx0fVxyXG5cclxuXHRcdC52LWhlYWRTdHlsZSBpbnB1dCB7XHJcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuXHRcdFx0LyogYm9yZGVyOiAxcHggc29saWQgI2Q1ZDVkNTsgKi9cclxuXHRcdFx0Lyogd2lkdGg6IDY1JTsgKi9cclxuXHRcdFx0d2lkdGg6IDg1JTtcclxuXHRcdFx0aGVpZ2h0OiA1MnJweDtcclxuXHRcdFx0bGluZS1oZWlnaHQ6IDM0cnB4O1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjRkZGO1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAwICFpbXBvcnRhbnQ7XHJcblx0XHRcdGNvbG9yOiAjMmQ4Y2YwO1xyXG5cdFx0XHRwYWRkaW5nOiAxMHJweCA4cnB4IDEycnB4O1xyXG5cdFx0XHRmb250LXNpemU6IDM0cnB4O1xyXG5cdFx0XHRmb250LWZhbWlseTogaW5oZXJpdDtcclxuXHRcdFx0Ym94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xyXG5cdFx0XHR0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjFzO1xyXG5cdFx0XHRtYXJnaW4tdG9wOiA0cnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC52LWhlYWRTdHlsZSBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XHJcblx0XHRcdGZvbnQtc2l6ZTogMTJycHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LnYtaGVhZFN0eWxlIC5mb3JtLWl0ZW0tc3BhbiB7XHJcblx0XHRcdC8qIHZlcnRpY2FsLWFsaWduOnRvcDsgKi9cclxuXHRcdFx0Ly8gY29sb3I6ICMyZDhjZjA7XHJcblx0XHRcdC8vIHdoaXRlLXNwYWNlOiBub3JtYWw7XHJcblx0XHRcdC8vIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcclxuXHRcdFx0Ly8gZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG5cclxuXHRcdFx0dmVydGljYWwtYWxpZ246IHRleHQtdG9wO1xyXG5cdFx0XHRjb2xvcjogIzJkOGNmMDtcclxuXHRcdFx0d2hpdGUtc3BhY2U6IG5vcm1hbDtcclxuXHRcdFx0d29yZC1icmVhazogYnJlYWstYWxsO1xyXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcblx0XHRcdHdpZHRoOiBjYWxjKDEwMCUgLSAxMDBweCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LmlucHV0LXdyYXBwZXIge1xyXG5cdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjZDVkNWQ1O1xyXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcblx0XHRcdHdpZHRoOiAxMDAlO1xyXG5cdFx0XHRsaW5lLWhlaWdodDogMjJycHg7XHJcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcblx0XHR9XHJcblxyXG5cdFx0LmNoZWNrX3JlbWVtYmVyUHdkLFxyXG5cdFx0LmlucHV0LXN3aXRjaCB7XHJcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcblx0XHRcdG1hcmdpbi1sZWZ0OiAxMHJweFxyXG5cdFx0fVxyXG5cclxuXHRcdFtudnVlXSB1bmktdmlldyB7XHJcblx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuXHRcdFx0Ym9yZGVyOiAwIHNvbGlkICMwMDA7XHJcblx0XHRcdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcblx0XHR9XHJcblxyXG5cdFx0LnVuaS1pbnB1dCB7XHJcblx0XHRcdC8qIGJvcmRlcjogbm9uZTsgKi9cclxuXHRcdH1cclxuXHJcblx0XHQudW5pLWljb24ge1xyXG5cdFx0XHQvKiBib3JkZXI6IDFweCBzb2xpZCByZWQ7ICovXHJcblx0XHRcdHdpZHRoOiA4JTtcclxuXHRcdFx0Zm9udC1mYW1pbHk6IHVuaWljb25zO1xyXG5cdFx0XHRmb250LXNpemU6IDQwcnB4O1xyXG5cdFx0XHRmb250LXdlaWdodDogNDAwO1xyXG5cdFx0XHRmb250LXN0eWxlOiBub3JtYWw7XHJcblx0XHRcdC8qIHdpZHRoOiA0OHJweDsgKi9cclxuXHRcdFx0LyogaGVpZ2h0OiA0OHJweDsgKi9cclxuXHRcdFx0LyogbGluZS1oZWlnaHQ6IDQ0cnB4OyAqL1xyXG5cdFx0XHRjb2xvcjogIzJkOGNmMDtcclxuXHRcdFx0Y3Vyc29yOiBwb2ludGVyO1xyXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdC52aWV3LWNvbnRlbnQge1xyXG5cdFx0XHRtaW4taGVpZ2h0OiA3MDBycHg7XHJcblx0XHRcdC8qIGJvcmRlcjoxcHggc29saWQgcmVkOyAqL1xyXG5cdFx0fVxyXG5cclxuXHRcdC5pbnB1dC1kaXNhYmxlZCB7XHJcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmM2YzZjMgIWltcG9ydGFudDtcclxuXHRcdH1cclxuXHJcblx0XHRidXR0b24uYnRuX2FkZCB7XHJcblx0XHRcdHdpZHRoOiA0OS41JTtcclxuXHRcdFx0bWFyZ2luLXRvcDogNTBycHg7XHJcblx0XHRcdHBhZGRpbmc6IDIwcnB4O1xyXG5cdFx0XHRsaW5lLWhlaWdodDogMS41O1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjNEQ2QUY0O1xyXG5cdFx0XHRib3JkZXI6IG5vbmU7XHJcblx0XHRcdGNvbG9yOiAjZmZmO1xyXG5cdFx0XHRmb250LXNpemU6IDM4cnB4O1xyXG5cdFx0XHRmb250LXdlaWdodDogYm9sZDtcclxuXHRcdFx0ZmxvYXQ6IHJpZ2h0O1xyXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcblx0XHR9XHJcblxyXG5cdFx0YnV0dG9uLmJ0bl9jYW5jZWwge1xyXG5cdFx0XHR3aWR0aDogNDkuNSU7XHJcblx0XHRcdG1hcmdpbi10b3A6IDUwcnB4O1xyXG5cdFx0XHRwYWRkaW5nOiAyMHJweDtcclxuXHRcdFx0bGluZS1oZWlnaHQ6IDEuNTtcclxuXHRcdFx0YmFja2dyb3VuZDogI2ZmZjtcclxuXHRcdFx0Ym9yZGVyOiBub25lO1xyXG5cdFx0XHRjb2xvcjogIzAwMDtcclxuXHRcdFx0Zm9udC1zaXplOiAzOHJweDtcclxuXHRcdFx0Zm9udC13ZWlnaHQ6IGJvbGQ7XHJcblx0XHRcdGZsb2F0OiBsZWZ0O1xyXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcblx0XHR9XHJcblxyXG5cdFx0LnZpZXctcG9wdXAge1xyXG5cdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XHJcblx0XHR9XHJcblxyXG5cdFx0LnBvcHVwLWNvbnRlbnQge1xyXG5cdFx0XHQvLyBAaW5jbHVkZSBmbGV4O1xyXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuXHRcdFx0cGFkZGluZzogMzBycHg7XHJcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XHJcblx0XHRcdC8qIGhlaWdodDogMTUwcHg7ICovXHJcblx0XHRcdC8qIGJvcmRlcjogMXB4IHNvbGlkIHJlZDsgKi9cclxuXHRcdH1cclxuXHJcblx0XHQucG9wdXAtY29udCB7XHJcblx0XHRcdG92ZXJmbG93LXk6IGF1dG87XHJcblx0XHRcdC8qIGJvcmRlcjogMXB4IHNvbGlkIHJlZDsgKi9cclxuXHRcdH1cclxuXHJcblx0XHQucG9wdXAtaGVpZ2h0IHtcclxuXHRcdFx0Ly8gQGluY2x1ZGUgaGVpZ2h0O1xyXG5cdFx0XHQvKiB3aWR0aDogMjAwcHg7ICovXHJcblx0XHR9XHJcblxyXG5cdFx0LnBvcHVwLWhlYWRlciB7XHJcblx0XHRcdGZvbnQtc2l6ZTogNDJycHg7XHJcblx0XHRcdGZvbnQtd2VpZ2h0OiBib2xkO1xyXG5cdFx0XHRtYXJnaW46IDIwcnB4IDIwcnB4IDBweCAyMHJweDtcclxuXHRcdH1cclxuXHJcblx0XHQudmlld19wb3B1cF9DaGVja0xpc3Qge1xyXG5cdFx0XHRtYXJnaW4tYm90dG9tOiAyMHJweDtcclxuXHRcdH1cclxuXHJcblx0XHQucG9wdXAtZm9vdGVyIHtcclxuXHRcdFx0ZmxvYXQ6IHJpZ2h0O1xyXG5cdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XHJcblx0XHRcdGJvdHRvbTogMDtcclxuXHRcdFx0cmlnaHQ6IDIwcnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdGJ1dHRvbi5idG5fcG9wdXBfYWRkIHtcclxuXHRcdFx0d2lkdGg6IDE4MHJweDtcclxuXHRcdFx0bWFyZ2luLXRvcDogNTBycHg7XHJcblx0XHRcdG1hcmdpbi1yaWdodDogMjBycHg7XHJcblx0XHRcdHBhZGRpbmc6IDE1cnB4O1xyXG5cdFx0XHRsaW5lLWhlaWdodDogMS41O1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjMjdBNkUxO1xyXG5cdFx0XHRib3JkZXI6IG5vbmU7XHJcblx0XHRcdGNvbG9yOiAjZmZmO1xyXG5cdFx0XHRmb250LXNpemU6IDM4cnB4O1xyXG5cdFx0XHRmb250LXdlaWdodDogYm9sZDtcclxuXHRcdFx0LyogZmxvYXQ6IGxlZnQ7ICovXHJcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuXHRcdH1cclxuXHJcblx0XHRidXR0b24uYnRuX3BvcHVwX2NhbmNlbCB7XHJcblx0XHRcdHdpZHRoOiAxODBycHg7XHJcblx0XHRcdG1hcmdpbi10b3A6IDUwcnB4O1xyXG5cdFx0XHRwYWRkaW5nOiAxNXJweDtcclxuXHRcdFx0bGluZS1oZWlnaHQ6IDEuNTtcclxuXHRcdFx0YmFja2dyb3VuZDogIzI3QTZFMTtcclxuXHRcdFx0Ym9yZGVyOiBub25lO1xyXG5cdFx0XHRjb2xvcjogI2ZmZjtcclxuXHRcdFx0Zm9udC1zaXplOiAzOHJweDtcclxuXHRcdFx0Zm9udC13ZWlnaHQ6IGJvbGQ7XHJcblx0XHRcdC8qIGZsb2F0OiByaWdodDsgKi9cclxuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG5cdFx0fVxyXG5cclxuXHRcdCNkdl9zZWxlY3Qge1xyXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcblx0XHRcdC8vIHdpZHRoOiA2NiU7XHJcblx0XHRcdGJhY2tncm91bmQ6ICNGRkY7XHJcblx0XHRcdGJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDtcclxuXHRcdFx0Y29sb3I6ICMyZDhjZjA7XHJcblx0XHRcdC8qIHBhZGRpbmc6IDEwcnB4IDhycHggMTJycHg7ICovXHJcblx0XHRcdGZvbnQtc2l6ZTogMzRycHg7XHJcblx0XHRcdGZvbnQtZmFtaWx5OiBpbmhlcml0O1xyXG5cdFx0XHRib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XHJcblx0XHRcdHRyYW5zaXRpb24tZHVyYXRpb246IDAuMXM7XHJcblx0XHRcdG1hcmdpbi10b3A6IDBycHg7XHJcblx0XHRcdC8qIHZlcnRpY2FsLWFsaWduOiAxMHB4OyAqL1xyXG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG5cdFx0fVxyXG5cclxuXHRcdCNkdl9zZWxlY3QgLnVuaS1zZWxlY3Qge1xyXG5cdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAwICFpbXBvcnRhbnQ7XHJcblx0XHRcdGNvbG9yOiAjMmQ4Y2YwO1xyXG5cdFx0fVxyXG5cclxuXHRcdCNkdl9zZWxlY3QgLnVuaS1zZWxlY3RfX2lucHV0LXRleHQge1xyXG5cdFx0XHRjb2xvcjogIzJkOGNmMDtcclxuXHRcdH1cclxuXHJcblx0XHQucGFuZWxfdGl0bGUge1xyXG5cdFx0XHRmb250LXNpemU6IDM4cnB4O1xyXG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjMjdBNkUxO1xyXG5cdFx0XHRsaW5lLWhlaWdodDogODBycHg7XHJcblx0XHRcdGNvbG9yOiAjZmZmO1xyXG5cdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XHJcblx0XHRcdGZvbnQtd2VpZ2h0OiBib2xkO1xyXG5cdFx0fVxyXG5cclxuXHRcdC52LXBhbmVsIHtcclxuXHRcdFx0bWluLWhlaWdodDogNzg4cnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC52LXBhbmVsbGlzdCB7XHJcblx0XHRcdGJvcmRlcjogNHJweCBzb2xpZCAjYWFhO1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAxMHJweDtcclxuXHRcdFx0bWFyZ2luOiAxMHJweCAyMHJweCAwcnB4IDIwcnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC52LXBhbmVsZGVsIHtcclxuXHRcdFx0dGV4dC1hbGlnbjogcmlnaHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0LnBhbmVsX2RlbCB7XHJcblx0XHRcdGZvbnQtc2l6ZTogNDRycHg7XHJcblx0XHRcdHRleHQtZGVjb3JhdGlvbjogaW5pdGlhbDtcclxuXHRcdFx0bWFyZ2luLXRvcDogMTBycHg7XHJcblx0XHRcdG1hcmdpbi1yaWdodDogMjBycHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LmNsYXNzX2F0dHJfYm9keSAuZm9ybS1ncm91cCB7XHJcblx0XHRcdG1hcmdpbjogMjBycHggMzBycHg7XHJcblx0XHRcdC8qIG1hcmdpbi1sZWZ0OiAtMTJweDtcclxuICAgIG1hcmdpbi1yaWdodDogLTEycHg7ICovXHJcblx0XHR9XHJcblxyXG5cdFx0LnN1YmNsYXNzX2F0dHJfYm9keSAuZm9ybS1ncm91cCB7XHJcblx0XHRcdG1hcmdpbjogMjBycHggMTBycHg7XHJcblx0XHRcdC8qIG1hcmdpbi1sZWZ0OiAtMTJweDtcclxuICAgIG1hcmdpbi1yaWdodDogLTEycHg7ICovXHJcblx0XHR9XHJcblxyXG5cdFx0LmZvcm0tZ3JvdXA+bGFiZWxbY2xhc3MqPVwiY29sLVwiXSB7XHJcblx0XHRcdG1hcmdpbi1ib3R0b206IDhycHg7XHJcblx0XHRcdGZvbnQtc2l6ZTogMzJycHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LmZvcm0tZ3JvdXAgbGFiZWwge1xyXG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG5cdFx0XHRsaW5lLWhlaWdodDogNjBycHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LnR4X3RpdGxlMiB7XHJcblx0XHRcdGZvbnQtc2l6ZTogMzJycHg7XHJcblx0XHRcdHRleHQtYWxpZ246IHJpZ2h0O1xyXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcblx0XHRcdHZlcnRpY2FsLWFsaWduOiAtMnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5hdHRyX2ZpZWxkIHtcclxuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG5cdFx0XHRtYXJnaW4tbGVmdDogOHB4O1xyXG5cdFx0XHQvKiB3aWR0aDogNzElOyAqL1xyXG5cdFx0fVxyXG5cclxuXHRcdC50ZXh0LXJpZ2h0MiB7XHJcblx0XHRcdG1hcmdpbjogMDtcclxuXHRcdFx0dmVydGljYWwtYWxpZ246IC00cHg7XHJcblx0XHRcdG1hcmdpbi1sZWZ0OiA5cHg7XHJcblx0XHRcdGZsb2F0OiBub25lO1xyXG5cdFx0XHRmb250LXNpemU6IDQ0cnB4O1xyXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcblx0XHR9XHJcblxyXG5cdFx0aW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIge1xyXG5cdFx0XHRmb250LXNpemU6IDEycnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC52LXBhbmVsIGlucHV0IHtcclxuXHRcdFx0Ym9yZGVyOiAxcHggc29saWQgI2Q1ZDVkNTtcclxuXHRcdFx0d2lkdGg6IDk4JTtcclxuXHRcdFx0aGVpZ2h0OiA1MnJweDtcclxuXHRcdFx0YmFja2dyb3VuZDogI0ZGRjtcclxuXHRcdFx0Ym9yZGVyLXJhZGl1czogMCAhaW1wb3J0YW50O1xyXG5cdFx0XHRjb2xvcjogIzA0NmRiMztcclxuXHRcdFx0cGFkZGluZzogMTBycHggOHJweCAxMnJweDtcclxuXHRcdFx0Zm9udC1zaXplOiAzNHJweDtcclxuXHRcdFx0Zm9udC1mYW1pbHk6IGluaGVyaXQ7XHJcblx0XHRcdGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcclxuXHRcdFx0dHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xcztcclxuXHRcdFx0bWFyZ2luLXRvcDogNHJweDtcclxuXHRcdH1cclxuXHJcblx0XHQuZGF0ZV9pcHV0IHtcclxuXHRcdFx0LyogYm9yZGVyOiAxcHggc29saWQgI2Q1ZDVkNTsgKi9cclxuXHRcdFx0Lyogd2lkdGg6IDk4JTsgKi9cclxuXHRcdFx0aGVpZ2h0OiA2MnJweDtcclxuXHRcdFx0YmFja2dyb3VuZDogI0ZGRjtcclxuXHRcdFx0Ym9yZGVyLXJhZGl1czogMCAhaW1wb3J0YW50O1xyXG5cdFx0XHRjb2xvcjogIzA0NmRiMztcclxuXHRcdFx0cGFkZGluZzogMTBycHggOHJweCA0cnB4O1xyXG5cdFx0XHRmb250LXNpemU6IDM0cnB4O1xyXG5cdFx0XHRmb250LWZhbWlseTogaW5oZXJpdDtcclxuXHRcdFx0Ym94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xyXG5cdFx0XHR0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjFzO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5kdl9pbnB1dCB7XHJcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuXHRcdFx0d2lkdGg6IDY1JTtcclxuXHRcdFx0LyogbGluZS1oZWlnaHQ6IDIycnB4OyAqL1xyXG5cdFx0fVxyXG5cclxuXHRcdC52aWV3LWZsb29yIHtcclxuXHRcdFx0cGFkZGluZzogMCAyMHJweDtcclxuXHRcdH1cclxuXHJcblx0XHQuZGVtby11bmktcm93IHtcclxuXHRcdFx0bWFyZ2luLWJvdHRvbTogMHB4O1xyXG5cdFx0XHRkaXNwbGF5OiBibG9jaztcclxuXHRcdH1cclxuXHJcblx0XHQ6OnYtZGVlcCAudW5pLXJvdyB7XHJcblx0XHRcdG1hcmdpbi1ib3R0b206IDBweDtcclxuXHRcdH1cclxuXHJcblx0XHQudmlldy10YWJwYWdlIDo6di1kZWVwIC51bmktcm93IHtcclxuXHRcdFx0bWFyZ2luLWJvdHRvbTogNXB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5kZW1vLXVuaS1jb2wge1xyXG5cdFx0XHRoZWlnaHQ6IDM2cHg7XHJcblx0XHRcdGJvcmRlci1yYWRpdXM6IDVweDtcclxuXHRcdH1cclxuXHJcblx0XHQuZGVtby11bmktcm93IC51bmktaW5wdXQge1xyXG5cdFx0XHR3aWR0aDogY2FsYygxMDAlIC0gMTIwcHgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC50ZXh0IHtcclxuXHRcdFx0Zm9udC1zaXplOiAxMnB4O1xyXG5cdFx0XHRjb2xvcjogIzY2NjtcclxuXHRcdFx0bWFyZ2luLXRvcDogNXB4O1xyXG5cdFx0fVxyXG5cdH1cclxuPC9zdHlsZT4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///159\n");
eval("/* WEBPACK VAR INJECTION */(function(__f__) {\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 1);\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ 57));\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ 59));\nvar _base = _interopRequireDefault(__webpack_require__(/*! ../../components/js-base64/base64.js */ 67));\nvar _utils = _interopRequireDefault(__webpack_require__(/*! @/js/utils.js */ 61));\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n  modules: {\n    Base64: _base.default\n  },\n  data: function data() {\n    return {\n      title: this.translateSys('add2'),\n      param: {},\n      edit_inital_event: \"\",\n      //弹窗初始化事件ID\n      edit_ok_event: \"\",\n      //弹窗点击OK 触发事件ID\n      edit_select_compose_event: \"\",\n      //选择组成对象时调用\n      edit_compose_cls_id: \"\",\n      global_attr: [],\n      refdatastore: [],\n      //引用数据存储区// {attr:'G_PRJ_' + bindattr + '_ID', value:info.id}\n      scanCodeVal: \"\",\n      subClassAttrList: [],\n      subPanelList: [],\n      subClassGridStyle: [],\n      popupType: \"center\",\n      check_list: {},\n      focusFieldId: \"\",\n      focusOldFieldId: \"\",\n      head_styledef: {\n        form: {\n          items: []\n        }\n      },\n      after_ok: {},\n      activity: null,\n      receiver: null,\n      intentFilter: null,\n      content: ''\n    };\n  },\n  onNavigationBarButtonTap: function onNavigationBarButtonTap(e) {\n    if (e.index == 0) {\n      var _$this = this;\n      uni.scanCode({\n        scanType: [\"qrCode\"],\n        success: function success(res) {\n          if (_$this.focusFieldId) {\n            var items = _$this.head_styledef.form.items || [];\n            for (var i in items) {\n              var ele = items[i];\n              if (ele.name == 'Input' || ele.name == 'InputNumber' || ele.name == 'Textarea') {\n                if (_$this.focusFieldId == ele.fieldId) {\n                  _$this.onScanValue(ele, res.result);\n                  break;\n                }\n              } else if (ele.name == \"Layot\") {\n                var curIndex = (ele.setting.colList || []).findIndex(function (col, index2, arr) {\n                  return (col.name == 'Input' || col.name == 'InputNumber' || col.name == 'Textarea') && _$this.focusFieldId == col.fieldId;\n                });\n                if (curIndex > -1) {\n                  var col = ele.setting.colList[curIndex];\n                  _$this.onScanValue(col, res.result);\n                  break;\n                }\n              }\n            }\n          }\n        }\n      });\n    } else if (e.index == 1) {\n      //刷新\n      uni.redirectTo({\n        url: '../modal/3018_2?param=' + JSON.stringify(this.$data.param) + \"&titlename=\" + this.$data.title\n      });\n    }\n  },\n  onLoad: function onLoad(options) {\n    // console.log(options);\n    uni.setNavigationBarTitle({\n      title: options.titlename\n    }); //设置顶部标题 \n    this.$data.param = JSON.parse(options.param);\n    this.$data.title = this.$data.param.Add_BtnName ? this.$data.param.Add_BtnName : options.titlename; //设置按钮文字\n    this.loadData(options.paramValue);\n  },\n  methods: {\n    setData: function setData(obj) {\n      var that = this;\n      var keys = [];\n      var val, data;\n      Object.keys(obj).forEach(function (key) {\n        keys = key.split(\".\");\n        val = obj[key];\n        data = that.$data;\n        keys.forEach(function (key2, index) {\n          if (index + 1 == keys.length) {\n            that.$set(data, key2, val);\n          } else {\n            if (!data[key2]) {\n              that.$set(data, key2, {});\n            }\n          }\n          data = data[key2];\n        });\n      });\n    },\n    loadData: function loadData(paramValue) {\n      var _this = this;\n      return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {\n        var _this$param$DataCls, _this$param$UI_Style;\n        var _this$$data$head_styl, _this$$data$head_styl2, attrs;\n        return _regenerator.default.wrap(function _callee5$(_context5) {\n          while (1) {\n            switch (_context5.prev = _context5.next) {\n              case 0:\n                _context5.next = 2;\n                return _this.Head_UIStyleGetInfo((_this$param$DataCls = _this.param.DataCls) === null || _this$param$DataCls === void 0 ? void 0 : _this$param$DataCls.id, (_this$param$UI_Style = _this.param.UI_Style) === null || _this$param$UI_Style === void 0 ? void 0 : _this$param$UI_Style.ID);\n              case 2:\n                //传入参数值\n                if (paramValue) {\n                  attrs = paramValue.attrs || [];\n                  (((_this$$data$head_styl = _this.$data.head_styledef) === null || _this$$data$head_styl === void 0 ? void 0 : (_this$$data$head_styl2 = _this$$data$head_styl.form) === null || _this$$data$head_styl2 === void 0 ? void 0 : _this$$data$head_styl2.items) || []).forEach( /*#__PURE__*/function () {\n                    var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(ele, index) {\n                      return _regenerator.default.wrap(function _callee4$(_context4) {\n                        while (1) {\n                          switch (_context4.prev = _context4.next) {\n                            case 0:\n                              if (ele.name != \"Layout\") {\n                                attrs.forEach( /*#__PURE__*/function () {\n                                  var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(ele2, index2) {\n                                    return _regenerator.default.wrap(function _callee$(_context) {\n                                      while (1) {\n                                        switch (_context.prev = _context.next) {\n                                          case 0:\n                                            if (ele.fieldId == ele2.name) {\n                                              ele.value = ele2.value;\n                                            }\n                                          case 1:\n                                          case \"end\":\n                                            return _context.stop();\n                                        }\n                                      }\n                                    }, _callee);\n                                  }));\n                                  return function (_x3, _x4) {\n                                    return _ref2.apply(this, arguments);\n                                  };\n                                }());\n                              } else {\n                                ele.setting.colList.forEach( /*#__PURE__*/function () {\n                                  var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(col) {\n                                    return _regenerator.default.wrap(function _callee3$(_context3) {\n                                      while (1) {\n                                        switch (_context3.prev = _context3.next) {\n                                          case 0:\n                                            if (col) {\n                                              attrs.forEach( /*#__PURE__*/function () {\n                                                var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(ele2, index2) {\n                                                  return _regenerator.default.wrap(function _callee2$(_context2) {\n                                                    while (1) {\n                                                      switch (_context2.prev = _context2.next) {\n                                                        case 0:\n                                                          if (col.fieldId == ele2.name) {\n                                                            col.value = ele2.value;\n                                                          }\n                                                        case 1:\n                                                        case \"end\":\n                                                          return _context2.stop();\n                                                      }\n                                                    }\n                                                  }, _callee2);\n                                                }));\n                                                return function (_x6, _x7) {\n                                                  return _ref4.apply(this, arguments);\n                                                };\n                                              }());\n                                            }\n                                          case 1:\n                                          case \"end\":\n                                            return _context3.stop();\n                                        }\n                                      }\n                                    }, _callee3);\n                                  }));\n                                  return function (_x5) {\n                                    return _ref3.apply(this, arguments);\n                                  };\n                                }());\n                              }\n                            case 1:\n                            case \"end\":\n                              return _context4.stop();\n                          }\n                        }\n                      }, _callee4);\n                    }));\n                    return function (_x, _x2) {\n                      return _ref.apply(this, arguments);\n                    };\n                  }());\n                }\n                __f__(\"log\", _this.$data.param, \" at pages/modal/3018_2.vue:295\");\n              case 4:\n              case \"end\":\n                return _context5.stop();\n            }\n          }\n        }, _callee5);\n      }))();\n    },\n    Head_UIStyleGetInfo: function Head_UIStyleGetInfo(class_id, style_id) {\n      var _this2 = this;\n      return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8() {\n        var $this, dataInfo;\n        return _regenerator.default.wrap(function _callee8$(_context8) {\n          while (1) {\n            switch (_context8.prev = _context8.next) {\n              case 0:\n                //获取自定义表单样式\n                $this = _this2;\n                dataInfo = {\n                  class_id: class_id,\n                  ui_style_id: style_id\n                };\n                _this2.$store.dispatch('UIStyleGetInfo', dataInfo).then(function (ret) {\n                  // console.log(ret);\n                  if (ret.err_code == 0) {\n                    var _$this$head_styledef$;\n                    var styledef = \"\";\n                    if (ret.result.style_def) {\n                      //mobox2的style_def是json字符串\n                      styledef = ret.result.style_def.replace(/\\\\/g, \"\");\n                      //mobox3的style_def是base64字符串\n                      if (!ret.result.style_def.includes('\"')) styledef = _base.default.decode(ret.result.style_def);\n                    }\n                    $this.$data.head_styledef = ret.result.style_def ? JSON.parse(styledef) : {};\n                    // console.log($this.$data.head_styledef);\n                    $this.head_styledef.form.items.forEach( /*#__PURE__*/function () {\n                      var _ref5 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(ele, index) {\n                        return _regenerator.default.wrap(function _callee6$(_context6) {\n                          while (1) {\n                            switch (_context6.prev = _context6.next) {\n                              case 0:\n                                ele.show = true;\n                                if (!(ele.useDict == true)) {\n                                  _context6.next = 4;\n                                  break;\n                                }\n                                _context6.next = 4;\n                                return _this2.DictGetInfo(ele.bind.dict, index, 'mast');\n                              case 4:\n                                if ($this.focusFieldId == \"\") {\n                                  if (ele.name == 'Input' || ele.name == 'InputNumber' || ele.name == 'Textarea') {\n                                    $this.setData({\n                                      focusFieldId: ele.fieldId\n                                    });\n                                  }\n                                }\n                              case 5:\n                              case \"end\":\n                                return _context6.stop();\n                            }\n                          }\n                        }, _callee6);\n                      }));\n                      return function (_x8, _x9) {\n                        return _ref5.apply(this, arguments);\n                      };\n                    }());\n                    if (((_$this$head_styledef$ = $this.head_styledef.event) === null || _$this$head_styledef$ === void 0 ? void 0 : _$this$head_styledef$.length) > 0) {\n                      $this.head_styledef.event.forEach( /*#__PURE__*/function () {\n                        var _ref6 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(a) {\n                          return _regenerator.default.wrap(function _callee7$(_context7) {\n                            while (1) {\n                              switch (_context7.prev = _context7.next) {\n                                case 0:\n                                  if (!(a.event_id == \"initial\")) {\n                                    _context7.next = 5;\n                                    break;\n                                  }\n                                  _context7.next = 3;\n                                  return $this.loadInitEvent(a.scrip_id);\n                                case 3:\n                                  _context7.next = 6;\n                                  break;\n                                case 5:\n                                  if (a.event_id == 'after_ok') {\n                                    $this.after_ok = {\n                                      id: a.scrip_id,\n                                      name: a.scrip_name\n                                    };\n                                  }\n                                case 6:\n                                case \"end\":\n                                  return _context7.stop();\n                              }\n                            }\n                          }, _callee7);\n                        }));\n                        return function (_x10) {\n                          return _ref6.apply(this, arguments);\n                        };\n                      }());\n                    }\n                  } else {\n                    uni.showModal({\n                      title: _this2.translateSys(\"error\") + \"1\",\n                      content: ret.err_msg,\n                      showCancel: false,\n                      confirmText: _this2.translateSys(\"cancel\")\n                    });\n                  }\n                }).catch(function (ex) {\n                  // console.log(ex);\n                  uni.showModal({\n                    title: _this2.translateSys(\"error\") + \"1.1\",\n                    content: ex.errMsg,\n                    showCancel: false,\n                    confirmText: _this2.translateSys(\"cancel\")\n                  });\n                });\n              case 3:\n              case \"end\":\n                return _context8.stop();\n            }\n          }\n        }, _callee8);\n      }))();\n    },\n    DictGetInfo: function DictGetInfo(dict, index, type) {\n      var _this3 = this;\n      return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10() {\n        var $this, dataInfo;\n        return _regenerator.default.wrap(function _callee10$(_context10) {\n          while (1) {\n            switch (_context10.prev = _context10.next) {\n              case 0:\n                //Mobox3得到得到字典信息字典项列表\n                _this3.data = [];\n                $this = _this3;\n                dataInfo = {\n                  dict_id: dict.id,\n                  dict_name: dict.name\n                }; // console.log(dataInfo);\n                _this3.$store.dispatch('DictGetInfo', dataInfo).then( /*#__PURE__*/function () {\n                  var _ref7 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(success) {\n                    var list, itemName, attr;\n                    return _regenerator.default.wrap(function _callee9$(_context9) {\n                      while (1) {\n                        switch (_context9.prev = _context9.next) {\n                          case 0:\n                            __f__(\"log\", success, \" at pages/modal/3018_2.vue:374\");\n                            if (success.err_code == 0) {\n                              if (type == 'mast') {\n                                list = [];\n                                itemName = '';\n                                success.result.dict_item_list.forEach(function (item) {\n                                  if (item.is_default == '1') itemName = item.name;\n                                  list.push({\n                                    text: item.value,\n                                    value: item.name\n                                  });\n                                });\n                                //有默认值,显示默认值\n                                if (itemName) {\n                                  $this.head_styledef.form.items[index].value = itemName;\n                                  attr = $this.head_styledef.form.items[index].fieldId;\n                                  $this.head_styledef.form.model[attr] = itemName;\n                                }\n                                $this.head_styledef.form.items[index].dict = list;\n                                // $this.head_styledef.form.items[index].dictitem=success.result;\n                                // this.$store.commit(\"classAttrList\", $this.$data.classAttrList);\n                              } else {\n                                // $this.$data.subClassAttrList[index].attr_list[key].dictitem=success.result;\n                                // this.$store.commit(\"subClassAttrList\", $this.$data.subClassAttrList);\n                              }\n                            } else {\n                              uni.showModal({\n                                title: _this3.translateSys(\"error\") + \"1.2\",\n                                content: success.err_msg,\n                                showCancel: false,\n                                confirmText: _this3.translateSys(\"cancel\")\n                              });\n                            }\n                          case 2:\n                          case \"end\":\n                            return _context9.stop();\n                        }\n                      }\n                    }, _callee9);\n                  }));\n                  return function (_x11) {\n                    return _ref7.apply(this, arguments);\n                  };\n                }()).catch(function (ex) {\n                  // console.log(ex);\n                  uni.showModal({\n                    title: _this3.translateSys(\"error\") + \"1.3\",\n                    content: ex.errMsg,\n                    showCancel: false,\n                    confirmText: _this3.translateSys(\"cancel\")\n                  });\n                });\n              case 4:\n              case \"end\":\n                return _context10.stop();\n            }\n          }\n        }, _callee10);\n      }))();\n    },\n    loadInitEvent: function loadInitEvent(eventid) {\n      var _this4 = this;\n      return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee13() {\n        var $this, dataInfo;\n        return _regenerator.default.wrap(function _callee13$(_context13) {\n          while (1) {\n            switch (_context13.prev = _context13.next) {\n              case 0:\n                $this = _this4;\n                if (!eventid.includes('{')) eventid = '{' + eventid + '}';\n                dataInfo = {\n                  ed_type: 0,\n                  start_transaction: true,\n                  class_id: _this4.param.DataCls.id,\n                  event_id: eventid\n                };\n                __f__(\"log\", dataInfo, \" at pages/modal/3018_2.vue:428\");\n                // return;\n                _this4.$store.dispatch('runCustomEvent', dataInfo).then(function (success) {\n                  __f__(\"log\", success, \" at pages/modal/3018_2.vue:431\");\n                  if (success.err_code == 0) {\n                    var data = success.result;\n                    if (data.ret != 0) {\n                      var tip = data.err_info ? typeof data.err_info == 'string' ? data.err_info : data.err_info.join('<br/>') : '';\n                      if (data.ret == 801) {\n                        if (_this4.param.Only_Script_Error) {\n                          var pos = tip.indexOf(\":\");\n                          if (pos > -1) tip = tip.substring(pos + 1);\n                        }\n                        uni.showModal({\n                          title: _this4.translateSys(\"tip\"),\n                          content: tip,\n                          showCancel: false,\n                          confirmText: _this4.translateSys(\"cancel\")\n                        });\n                      } else uni.showModal({\n                        title: _this4.translateSys(\"tip\"),\n                        content: tip + ',' + _this4.translateSys('tip') + ':' + data.ret,\n                        showCancel: false,\n                        confirmText: _this4.translateSys(\"cancel\")\n                      });\n                      return false;\n                    } else {\n                      var tip = data.info ? typeof data.info == 'string' ? data.info : data.info.join('<br/>') : '';\n                      if (tip) uni.showModal({\n                        title: _this4.translateSys(\"tip\"),\n                        content: tip,\n                        showCancel: false,\n                        confirmText: _this4.translateSys(\"cancel\")\n                      });\n                      var actionlist = data.action;\n                      if (actionlist) {\n                        __f__(\"log\", actionlist, \" at pages/modal/3018_2.vue:469\");\n                        for (var i = 0; i < actionlist.length; i++) {\n                          var action = actionlist[i];\n                          if (action.action_type == 'set_dlg_attr') {\n                            var result = action.value;\n                            for (var i = 0; i < result.length; i++) {\n                              if (result[i].choice_list) {\n                                for (var c = 0; c < $this.head_styledef.form.items.length; c++) {\n                                  var attr = $this.head_styledef.form.items[c];\n                                  if (attr.name != 'Layout') {\n                                    if (attr.fieldId == result[i].attr) {\n                                      var dictItemList = [];\n                                      for (var d in result[i].choice_list) {\n                                        var val = result[i].choice_list[d];\n                                        dictItemList.push({\n                                          \"CN_S_NAME\": val,\n                                          \"CN_S_VALUE\": val,\n                                          \"text\": val,\n                                          \"value\": val\n                                        });\n                                      }\n                                      attr.dict = dictItemList;\n                                    }\n                                  } else if (attr.name == 'Layout') {\n                                    attr.setting.colList.forEach(function (col) {\n                                      if (col) {\n                                        if (col.fieldId == result[i].attr) {\n                                          var dictItemList = [];\n                                          for (var d in result[i].choice_list) {\n                                            var val = result[i].choice_list[d];\n                                            dictItemList.push({\n                                              \"CN_S_NAME\": val,\n                                              \"CN_S_VALUE\": val,\n                                              \"text\": val,\n                                              \"value\": val\n                                            });\n                                          }\n                                          col.dict = dictItemList;\n                                        }\n                                      }\n                                    });\n                                  }\n                                }\n                              }\n                              for (var c = 0; c < $this.$data.head_styledef.form.items.length; c++) {\n                                var attr = $this.$data.head_styledef.form.items[c];\n                                // console.log(attr[j].Name+'=='+result[i].attr);\n                                //判断表单里是否有返回字段,没有就装载到model里,点击确定提交的时候带上这些数据\n                                if ($this.head_styledef.form.model[result[i].attr] == undefined) {\n                                  $this.head_styledef.form.model[result[i].attr] = result[i].value;\n                                }\n                                //判断是否是栅格表单\n                                if (attr.name != 'Layout') {\n                                  if (attr.fieldId == result[i].attr) {\n                                    attr.value = '';\n                                    attr.oldvalue = '';\n                                    attr.value = result[i].value;\n                                    attr.oldvalue = result[i].value;\n                                    $this.head_styledef.form.model[attr.fieldId] = result[i].value;\n                                  }\n                                } else if (attr.name == 'Layout') {\n                                  attr.setting.colList.forEach(function (col) {\n                                    if (col) {\n                                      if (col.fieldId == result[i].attr) {\n                                        col.value = '';\n                                        col.oldvalue = '';\n                                        col.value = result[i].value;\n                                        col.oldvalue = result[i].value;\n                                        $this.head_styledef.form.model[col.fieldId] = result[i].value;\n                                      }\n                                    }\n                                  });\n                                }\n                              }\n                              var length = 0;\n                              if (!$this.$data.refdatastore.filter(function (s) {\n                                return result[i].attr == s.attr;\n                              }).length) {\n                                length = 1;\n                                $this.$data.refdatastore.push(result[i]);\n                              }\n                              if (length == 0) {\n                                for (var j = 0; j < $this.$data.refdatastore.length; j++) {\n                                  if ($this.$data.refdatastore[j].attr == result[i].attr) {\n                                    $this.$data.refdatastore[j].value = result[i].value;\n                                  }\n                                }\n                              }\n                            }\n                          } else if (data.action[i].action_type == 'set_dlg_attr_show') {\n                            var result = action.value;\n                            result.forEach( /*#__PURE__*/function () {\n                              var _ref8 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee12(attr, key) {\n                                return _regenerator.default.wrap(function _callee12$(_context12) {\n                                  while (1) {\n                                    switch (_context12.prev = _context12.next) {\n                                      case 0:\n                                        $this.$data.head_styledef.form.items.forEach( /*#__PURE__*/function () {\n                                          var _ref9 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee11(ele, index) {\n                                            return _regenerator.default.wrap(function _callee11$(_context11) {\n                                              while (1) {\n                                                switch (_context11.prev = _context11.next) {\n                                                  case 0:\n                                                    //判断是否是栅格表单\n                                                    if (ele.name != 'Layout') {\n                                                      if (ele.fieldId == attr.attr) {\n                                                        ele.show = attr.show;\n                                                      }\n                                                    } else if (ele.name == 'Layout') {\n                                                      ele.setting.colList.forEach(function (col) {\n                                                        if (col) {\n                                                          if (col.fieldId == attr.attr) {\n                                                            col.show = attr.show;\n                                                          }\n                                                        }\n                                                      });\n                                                    }\n                                                  case 1:\n                                                  case \"end\":\n                                                    return _context11.stop();\n                                                }\n                                              }\n                                            }, _callee11);\n                                          }));\n                                          return function (_x14, _x15) {\n                                            return _ref9.apply(this, arguments);\n                                          };\n                                        }());\n                                      case 1:\n                                      case \"end\":\n                                        return _context12.stop();\n                                    }\n                                  }\n                                }, _callee12);\n                              }));\n                              return function (_x12, _x13) {\n                                return _ref8.apply(this, arguments);\n                              };\n                            }());\n                            var head_styledef = JSON.parse(JSON.stringify($this.$data.head_styledef));\n                            $this.$data.head_styledef = [];\n                            $this.$data.head_styledef = head_styledef;\n                            // console.log($this.$data.head_styledef);\n                          } else {\n                            uni.showModal({\n                              title: _this4.translateSys(\"tip\"),\n                              content: _this4.translate('execute_init_event_failed') + _this4.translateSys(\"full_stop\") + _this4.translate('reason') + _this4.translateSys(\"colon\") + _this4.translateSys(\"quotation_mark_left\") + action.action_type + _this4.translateSys(\"quotation_mark_right\") + _this4.translate('tip_action_unprocessed'),\n                              showCancel: false,\n                              confirmText: _this4.translateSys(\"cancel\")\n                            });\n                          }\n                        }\n                      }\n                    }\n                  } else {\n                    uni.showModal({\n                      title: _this4.translateSys(\"error\") + \"3\",\n                      content: _this4.translate('execute_init_event_failed') + _this4.translateSys(\"full_stop\") + _this4.translate('reason') + _this4.translateSys(\"colon\") + success.err_msg,\n                      showCancel: false,\n                      confirmText: _this4.translateSys(\"cancel\")\n                    });\n                  }\n                }).catch(function (ex) {\n                  // console.log(ex);\n                  uni.showModal({\n                    title: _this4.translateSys(\"error\") + \"3.1\",\n                    content: _this4.translate('execute_init_event_failed') + _this4.translateSys(\"full_stop\") + _this4.translate('reason') + _this4.translateSys(\"colon\") + ex.errMsg,\n                    showCancel: false,\n                    confirmText: _this4.translateSys(\"cancel\")\n                  });\n                });\n              case 5:\n              case \"end\":\n                return _context13.stop();\n            }\n          }\n        }, _callee13);\n      }))();\n    },\n    ontap: function ontap(item) {\n      var _this5 = this;\n      //扫码功能\n      // 打开蓝牙适配器\n      // uni.openBluetoothAdapter({\n      //   success: function() {\n      // \t// 开始搜索蓝牙设备\n      // \tuni.startBluetoothDevicesDiscovery({\n      // \t  success: function() {\n      // \t\t// 监听找到新设备的事件\n      // \t\tuni.onBluetoothDeviceFound(function(devices) {\n      // \t\t  // 这里可以过滤出RFID芯片,连接并读取数据\n      // \t\t  console.log(devices[0].deviceId);\n      // \t\t})\n      // \t  }\n      // \t})\n      //   }\n      // });\n      // 监听NFC功能是否可用\n      // uni.getNFCAdapterState({\n      //   success: function(res) {\n      // \tconsole.log(res);\n      //     if (res.errCode === 0) {\n      //       // NFC功能可用,开始监听\n      //       uni.onNFCStart((res) => {\n      //         if (res.errCode === 0) {\n      //           // 开始NFC标签检测\n      //           uni.makeNFCReaderStart({\n      //             success: function() {\n      //               // 监听NFC标签\n      //               uni.onNFCTagDiscovered(function(res) {\n      // \t\t\t\t\t\t\t\t\t\t  console.log(res);\n      //                 // 这里可以处理NFC标签数据\n      //               })\n      //             }\n      //           })\n      //         }\n      //       })\n      //     }\n      //   }\n      // })\n      this.focusOldFieldId = item.fieldId;\n      getApp().onScan(function (result) {\n        __f__(\"log\", result, \" at pages/modal/3018_2.vue:699\");\n        // uni.hideKeyboard();\n        _this5.onScanValue(item, result.decodedata);\n      });\n    },\n    onScanValue: function onScanValue(item, value) {\n      var $this = this;\n      __f__(\"log\", \"onScanValue\", item, \" at pages/modal/3018_2.vue:706\");\n      if (item.oldvalue != value) {\n        item.oldvalue = value;\n        item.value = value;\n        var attr = value;\n        $this.head_styledef.form.model[attr] = value;\n        if (item.value) {\n          //第一个输入框不为空\n          //初始化,下个输入框focus属性\n          var findd = false;\n          var items = $this.head_styledef.form.items || [];\n          for (var i in items) {\n            var ele = items[i];\n            if (ele.name != \"Layout\") {\n              if (ele.name == 'Input' || ele.name == 'InputNumber' || ele.name == 'Textarea') {\n                if (attr == ele.fieldId) {\n                  findd = true;\n                } else {\n                  if (findd) {\n                    $this.setData({\n                      focusFieldId: ele.fieldId\n                    });\n                    break;\n                  }\n                }\n              }\n            } else {\n              if (findd) {\n                var curIndex = ele.setting.colList.findIndex(function (col, index2, arr) {\n                  return col.name == 'Input' || col.name == 'InputNumber' || col.name == 'Textarea';\n                });\n                if (curIndex > -1) {\n                  $this.setData({\n                    focusFieldId: ele.setting.colList[curIndex].fieldId\n                  });\n                  break;\n                }\n              } else {\n                var _ret = function () {\n                  var curIndex = ele.setting.colList.findIndex(function (col, index2, arr) {\n                    return attr == col.fieldId;\n                  });\n                  if (curIndex > -1) {\n                    findd = true;\n                    var curIndex2 = ele.setting.colList.findIndex(function (col, index2, arr) {\n                      return (col.name == 'Input' || col.name == 'InputNumber' || col.name == 'Textarea') && index2 > curIndex;\n                    });\n                    if (curIndex2 > -1) {\n                      $this.setData({\n                        focusFieldId: ele.setting.colList[curIndex].fieldId\n                      });\n                      return \"break\";\n                    }\n                  }\n                }();\n                if (_ret === \"break\") break;\n              }\n            }\n          }\n        }\n        var eventid = item.bind.onChangeEvent.id; //内容变化后事件\n        if (eventid) {\n          var obj_attr = this.head_styledef.form.model;\n          // console.log(obj_attr);\n          var req = Object.keys(obj_attr).map(function (a) {\n            return {\n              attr: a,\n              val: obj_attr[a] || \"\"\n            };\n          });\n          var info = {\n            eventid: eventid,\n            edtype: \"0\",\n            projectid: '',\n            rclsid: '',\n            robjid: '',\n            userlogin: '',\n            clsid: this.$data.param.DataCls.id,\n            objid: \"\",\n            attr: req,\n            dataJson: []\n          };\n          this.DataObjRunCustomEvent(info, '');\n        }\n      }\n    },\n    onClick: function onClick(item) {\n      this.focusFieldId = item.fieldId;\n    },\n    onevent: function onevent(item) {\n      // console.log(e.target);\n      __f__(\"log\", item, \" at pages/modal/3018_2.vue:804\");\n      if (item.oldvalue != item.value) {\n        item.oldvalue = item.value;\n        var attr = item.fieldId;\n        this.head_styledef.form.model[attr] = item.value;\n        //子数据类扫码区事件脚本\n        var eventid = item.bind.onChangeEvent.id; //内容变化后事件\n        if (eventid) {\n          var obj_attr = this.head_styledef.form.model;\n          // console.log(obj_attr);\n          var req = Object.keys(obj_attr).map(function (a) {\n            return {\n              attr: a,\n              val: obj_attr[a] || \"\"\n            };\n          });\n          var info = {\n            eventid: eventid,\n            edtype: \"0\",\n            projectid: '',\n            rclsid: '',\n            robjid: '',\n            userlogin: '',\n            clsid: this.$data.param.DataCls.id,\n            objid: \"\",\n            attr: req,\n            dataJson: []\n          };\n          this.DataObjRunCustomEvent(info, \"\");\n        }\n      }\n    },\n    onchange: function onchange(item) {\n      __f__(\"log\", item, \" at pages/modal/3018_2.vue:836\");\n      if (item.oldvalue != item.value) {\n        item.oldvalue = item.value;\n        var attr = item.fieldId;\n        this.head_styledef.form.model[attr] = item.value;\n        var eventid = item.bind.onChangeEvent.id; //内容变化后事件\n        if (eventid) {\n          // self.event_no_sub = 1;\n          var obj_attr = this.head_styledef.form.model;\n          // console.log(obj_attr);\n          var req = Object.keys(obj_attr).map(function (a) {\n            return {\n              attr: a,\n              val: obj_attr[a] || \"\"\n            };\n          });\n          var info = {\n            eventid: eventid,\n            edtype: \"0\",\n            projectid: '',\n            rclsid: '',\n            robjid: '',\n            userlogin: '',\n            clsid: this.$data.param.DataCls.id,\n            objid: \"\",\n            attr: req,\n            dataJson: []\n          };\n          this.DataObjRunCustomEvent(info);\n        }\n      }\n    },\n    onModelValue: function onModelValue(item) {\n      //绑定Model值\n      var attr = item.fieldId;\n      this.head_styledef.form.model[attr] = item.value;\n    },\n    classAttr_extButton: function classAttr_extButton(item) {\n      var onSuffixClickCallbackEvent = item.bind.onSuffixClickCallbackEvent; //后图标点击事件\n      var onSuffixClickEvent = item.bind.onSuffixClickEvent; //后图标点击回调\n\n      if (!onSuffixClickCallbackEvent.id) {\n        uni.showModal({\n          title: this.translateSys(\"tip\"),\n          content: this.translate('icon_click_event_empty'),\n          showCancel: false,\n          confirmText: this.translateSys(\"cancel\")\n        });\n        return;\n      }\n      if (!onSuffixClickEvent.id) {\n        uni.showModal({\n          title: this.translateSys(\"tip\"),\n          content: this.translate('icon_click_event_empty'),\n          showCancel: false,\n          confirmText: this.translateSys(\"cancel\")\n        });\n        return;\n      }\n      this.$data.popupType = 'right';\n      // open 方法传入参数 等同在 uni-popup 组件上绑定 type属性\n      this.$refs.popup.open($this.popupType);\n      this.DataObjRunCustomEvent_Return(onSuffixClickCallbackEvent.id, '', onSuffixClickEvent.id, item);\n    },\n    popupChange: function popupChange(e) {\n      __f__(\"log\", '当前模式:' + e.type + ',状态:' + e.show, \" at pages/modal/3018_2.vue:900\");\n    },\n    checkChange: function checkChange(e) {\n      //弹框check选择\n      // console.log(e.target.dataset);\n      var index = e.target.dataset.index;\n      var ischeck = e.target.dataset.ischeck;\n      var data = this.$data.check_list.items;\n      // this.$data.check_list.items=[];\n      if (this.$data.check_list.multiple_choice == \"0\") {\n        //判断时单选还是多选\n        for (var i in data) {\n          data[i].check = false;\n        }\n      }\n      data[index].check = ischeck ? false : true;\n      this.$data.check_list.items = data;\n    },\n    popup_cancel: function popup_cancel(e) {\n      //弹框取消\n      this.$refs.popup.close();\n    },\n    popup_sava: function popup_sava(e) {\n      //弹框确定\n      var $this = this;\n      var items = $this.$data.check_list.items;\n      var data = [];\n      var name = \"\";\n      for (var i = 0; i < items.length; i++) {\n        if (items[i].check == true) {\n          if (name) name += ';';\n          name += items[i].name;\n          data.push({\n            id: items[i].id,\n            name: items[i].name\n          });\n        }\n      }\n      // if (!$this.$data.popupParam) {\n      // \tuni.showModal({\n      // \t\ttitle: this.translateSys(\"tip\"),\n      // \t\tcontent: \"popupParam为空!\",\n      // \t\tshowCancel: false,\n      // \t\tconfirmText: this.translateSys(\"cancel\")\n      // \t});\n      // \treturn;\n      // }\n\n      var fieldId = $this.$data.popupParam.item.fieldId;\n      $this.head_styledef.form.model[attr] = name;\n      for (var c = 0; c < $this.$data.head_styledef.form.items.length; c++) {\n        var attr = $this.$data.head_styledef.form.items[c];\n        if (attr.fieldId == fieldId) {\n          attr.value = name;\n        }\n      }\n      __f__(\"log\", data, \" at pages/modal/3018_2.vue:954\");\n      var callback_eventid = $this.$data.popupParam.button_callback.trim();\n      var info = {\n        eventid: callback_eventid,\n        edtype: \"0\",\n        projectid: '',\n        rclsid: '',\n        robjid: '',\n        userlogin: '',\n        clsid: $this.$data.param.DataCls.id,\n        objid: \"\",\n        attr: $this.$data.popupParam.req,\n        dataJson: data\n      };\n      $this.DataObjRunCustomEvent(info, $this.$data.popupParam.data_attr);\n      this.$refs.popup.close();\n    },\n    DataObjRunCustomEvent: function DataObjRunCustomEvent(info, data_attr) {\n      var _this6 = this;\n      var $this = this;\n      var enviroment = {\n        'function': '3000',\n        // 功能点编号\n        cls_id: this.$data.param.DataCls.id,\n        // 功能点主数据类标识\n        'button': 'top',\n        // top/bottom\n        button_name: this.translateSys('add2'),\n        master: {\n          cls_id: this.$data.param.DataCls.id // button=bottom时 master的cls_id\n          //obj_id: ''  // button=bottom时 master的obj_id\n        }\n      };\n\n      if (data_attr) {\n        enviroment.edit_dlg = {\n          type: 'small',\n          //小窗口\n          class_id: this.$data.param.DataCls.id //当前数据类id\n        };\n\n        if (data_attr) {\n          enviroment.edit_dlg.form_control = {\n            //所属的表单控件\n            name: data_attr.Name,\n            //字段属性\n            text: data_attr.DispName,\n            //显示文本\n            group_name: data_attr.GroupName,\n            //属性组\n            type: data_attr.Type,\n            //字段类型\n            readonly: data_attr.ReadOnly,\n            //是否只读\n            button_img: data_attr.button_img,\n            //引用按钮的图标\n            button_tooltip: data_attr.button_tooltip //引用按钮的tooltip\n          };\n        }\n      }\n\n      // var dataInfo = {\n      //     edtype: info.edtype, eventid: info.eventid, projectid: info.projectid.replace('{','').replace('}',''),\n      //     rclsid: info.rclsid, robjid: info.robjid, userlogin: info.userlogin, clsid: info.clsid, objid: info.objid,\n      //     attr: JSON.stringify(info.attr), extinfo: JSON.stringify(enviroment), inputparameter: \"\",\n      // \tglobal_attr: JSON.stringify(this.$data.global_attr), dataJson:JSON.stringify(info.dataJson)\n      // }\n      enviroment = _base.default.encode(JSON.stringify(enviroment)); //将字符串转换为base64编码\n      var input_param = _base.default.encode(JSON.stringify(info.attr)); //将字符串转换为base64编码\n      var global_attr = _base.default.encode(JSON.stringify(this.$data.global_attr)); //将字符串转换为base64编码\n      if (info.dataJson) info.dataJson = _base.default.encode(JSON.stringify(info.dataJson)); //将字符串转换为base64编码\n      var obj_attr = {};\n      info.attr.forEach(function (item) {\n        obj_attr[item.attr] = item.val;\n      });\n      if (!info.eventid.includes('{')) info.eventid = '{' + info.eventid + '}';\n      var dataInfo = {\n        ed_type: info.edtype,\n        start_transaction: true,\n        class_id: info.clsid,\n        class_name: '',\n        event_id: info.eventid,\n        event_name: '',\n        data_obj_id: info.objid,\n        obj_attr: obj_attr,\n        prj_id: info.projectid,\n        ref_cls_id: info.rclsid,\n        rel_obj_id: info.robjid,\n        user_login: info.userlogin,\n        data_json: info.dataJson,\n        compose_info: '',\n        ext_info: enviroment,\n        global_attr: global_attr,\n        input_param: input_param\n      };\n      __f__(\"log\", dataInfo, \" at pages/modal/3018_2.vue:1037\");\n      // return;\n      this.$store.dispatch('runCustomEvent', dataInfo).then(function (success) {\n        __f__(\"log\", success, \" at pages/modal/3018_2.vue:1040\");\n        if (success.err_code == 0) {\n          var data = success.result;\n          if (data.ret != 0) {\n            var tip = data.err_info ? typeof data.err_info == 'string' ? data.err_info : data.err_info.join('<br/>') : '';\n            if (data.ret == 801) {\n              if (_this6.param.Only_Script_Error) {\n                var pos = tip.indexOf(\":\");\n                if (pos > -1) tip = tip.substring(pos + 1);\n              }\n              uni.showModal({\n                title: _this6.translateSys(\"tip\"),\n                content: tip,\n                showCancel: false,\n                confirmText: _this6.translateSys(\"cancel\")\n              });\n            } else uni.showModal({\n              title: _this6.translateSys(\"tip\"),\n              content: tip + ',' + _this6.translateSys('tip') + ':' + data.ret,\n              showCancel: false,\n              confirmText: _this6.translateSys(\"cancel\")\n            });\n            return false;\n          } else {\n            var tip = data.info ? typeof data.info == 'string' ? data.info : data.info.join('<br/>') : '';\n            if (tip) uni.showModal({\n              title: _this6.translateSys(\"tip\"),\n              content: tip,\n              showCancel: false,\n              confirmText: _this6.translateSys(\"cancel\")\n            });\n            var actionlist = data.action;\n            if (actionlist) {\n              __f__(\"log\", actionlist, \" at pages/modal/3018_2.vue:1078\");\n              for (var i = 0; i < actionlist.length; i++) {\n                var action = actionlist[i];\n                if (action.action_type == 'set_dlg_attr') {\n                  var result = action.value;\n                  for (var i = 0; i < result.length; i++) {\n                    if (result[i].choice_list) {\n                      for (var c = 0; c < $this.head_styledef.form.items.length; c++) {\n                        var attr = $this.head_styledef.form.items[c];\n                        if (attr.name != 'Layout') {\n                          if (attr.fieldId == result[i].attr) {\n                            var dictItemList = [];\n                            for (var d in result[i].choice_list) {\n                              var val = result[i].choice_list[d];\n                              dictItemList.push({\n                                \"CN_S_NAME\": val,\n                                \"CN_S_VALUE\": val,\n                                \"text\": val,\n                                \"value\": val\n                              });\n                            }\n                            attr.dict = dictItemList;\n                          }\n                        } else if (attr.name == 'Layout') {\n                          attr.setting.colList.forEach(function (col) {\n                            if (col) {\n                              if (col.fieldId == result[i].attr) {\n                                var dictItemList = [];\n                                for (var d in result[i].choice_list) {\n                                  var val = result[i].choice_list[d];\n                                  dictItemList.push({\n                                    \"CN_S_NAME\": val,\n                                    \"CN_S_VALUE\": val,\n                                    \"text\": val,\n                                    \"value\": val\n                                  });\n                                }\n                                col.dict = dictItemList;\n                              }\n                            }\n                          });\n                        }\n                      }\n                    }\n                    for (var c = 0; c < $this.$data.head_styledef.form.items.length; c++) {\n                      var attr = $this.$data.head_styledef.form.items[c];\n                      // console.log(attr[j].Name+'=='+result[i].attr);\n                      //判断表单里是否有返回字段,没有就装载到model里,点击确定提交的时候带上这些数据\n                      if ($this.head_styledef.form.model[result[i].attr] == undefined) {\n                        $this.head_styledef.form.model[result[i].attr] = result[i].value;\n                      }\n                      //判断是否是栅格表单\n                      if (attr.name != 'Layout') {\n                        if (attr.fieldId == result[i].attr) {\n                          attr.value = '';\n                          attr.oldvalue = '';\n                          attr.value = result[i].value;\n                          attr.oldvalue = result[i].value;\n                          $this.head_styledef.form.model[attr.fieldId] = result[i].value;\n                        }\n                      } else if (attr.name == 'Layout') {\n                        attr.setting.colList.forEach(function (col) {\n                          if (col) {\n                            if (col.fieldId == result[i].attr) {\n                              col.value = '';\n                              col.oldvalue = '';\n                              col.value = result[i].value;\n                              col.oldvalue = result[i].value;\n                              $this.head_styledef.form.model[col.fieldId] = result[i].value;\n                            }\n                          }\n                        });\n                      }\n                    }\n                    var length = 0;\n                    if (!$this.$data.refdatastore.filter(function (s) {\n                      return result[i].attr == s.attr;\n                    }).length) {\n                      length = 1;\n                      $this.$data.refdatastore.push(result[i]);\n                    }\n                    if (length == 0) {\n                      for (var j = 0; j < $this.$data.refdatastore.length; j++) {\n                        if ($this.$data.refdatastore[j].attr == result[i].attr) {\n                          $this.$data.refdatastore[j].value = result[i].value;\n                        }\n                      }\n                    }\n                  }\n                } else if (action.action_type == 'set_dlg_attr_show') {\n                  var result = action.value;\n                  result.forEach( /*#__PURE__*/function () {\n                    var _ref10 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee15(attr, key) {\n                      return _regenerator.default.wrap(function _callee15$(_context15) {\n                        while (1) {\n                          switch (_context15.prev = _context15.next) {\n                            case 0:\n                              $this.$data.head_styledef.form.items.forEach( /*#__PURE__*/function () {\n                                var _ref11 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14(ele, index) {\n                                  return _regenerator.default.wrap(function _callee14$(_context14) {\n                                    while (1) {\n                                      switch (_context14.prev = _context14.next) {\n                                        case 0:\n                                          //判断是否是栅格表单\n                                          if (ele.name != 'Layout') {\n                                            if (ele.fieldId == attr.attr) {\n                                              ele.show = attr.show;\n                                            }\n                                          } else if (ele.name == 'Layout') {\n                                            ele.setting.colList.forEach(function (col) {\n                                              if (col) {\n                                                if (col.fieldId == attr.attr) {\n                                                  col.show = attr.show;\n                                                }\n                                              }\n                                            });\n                                          }\n                                        case 1:\n                                        case \"end\":\n                                          return _context14.stop();\n                                      }\n                                    }\n                                  }, _callee14);\n                                }));\n                                return function (_x18, _x19) {\n                                  return _ref11.apply(this, arguments);\n                                };\n                              }());\n                            case 1:\n                            case \"end\":\n                              return _context15.stop();\n                          }\n                        }\n                      }, _callee15);\n                    }));\n                    return function (_x16, _x17) {\n                      return _ref10.apply(this, arguments);\n                    };\n                  }());\n                  var head_styledef = JSON.parse(JSON.stringify($this.$data.head_styledef));\n                  $this.$data.head_styledef = [];\n                  $this.$data.head_styledef = head_styledef;\n                  // console.log($this.$data.head_styledef);\n                } else if (action.action_type == 'set_global_attr') {\n                  $this.$data.global_attr = action.value || [];\n                } else {\n                  uni.showModal({\n                    title: _this6.translateSys(\"tip\"),\n                    content: _this6.translateSys(\"quotation_mark_left\") + action.action_type + _this6.translateSys(\"quotation_mark_right\") + _this6.translate(\"tip_action_unprocessed\"),\n                    showCancel: false,\n                    confirmText: _this6.translateSys(\"cancel\")\n                  });\n                }\n              }\n            }\n            // var head_styledef = JSON.parse(JSON.stringify($this.head_styledef));\n            // $this.head_styledef=[];\n            // $this.head_styledef = head_styledef;\n            __f__(\"log\", $this.head_styledef, \" at pages/modal/3018_2.vue:1233\");\n            if (data.result) {\n              var result = data.result;\n              for (var i = 0; i < result.length; i++) {\n                for (var c = 0; c < $this.$data.head_styledef.form.items.length; c++) {\n                  var attr = $this.$data.head_styledef.form.items[c];\n                  //判断表单里是否有返回字段,没有就装载到model里,点击确定提交的时候带上这些数据\n                  if ($this.head_styledef.form.model[result[i].attr] == undefined) {\n                    $this.head_styledef.form.model[result[i].attr] = result[i].value;\n                  }\n                  //判断是否是栅格表单\n                  if (attr.name != 'Layout') {\n                    if (attr.fieldId == result[i].attr) {\n                      attr.value = '';\n                      attr.oldvalue = '';\n                      attr.value = result[i].value;\n                      attr.oldvalue = result[i].value;\n                      $this.head_styledef.form.model[attr.fieldId] = result[i].value;\n                    }\n                  } else if (attr.name == 'Layout') {\n                    attr.setting.colList.forEach(function (col) {\n                      if (col) {\n                        if (col.fieldId == result[i].attr) {\n                          col.value = '';\n                          col.oldvalue = '';\n                          col.value = result[i].value;\n                          col.oldvalue = result[i].value;\n                          $this.head_styledef.form.model[col.fieldId] = result[i].value;\n                        }\n                      }\n                    });\n                  }\n                }\n                var length = 0;\n                if (!$this.$data.refdatastore.filter(function (s) {\n                  return result[i].attr == s.attr;\n                }).length) {\n                  length = 1;\n                  $this.$data.refdatastore.push(result[i]);\n                }\n                if (length == 0) {\n                  for (var j = 0; j < $this.$data.refdatastore.length; j++) {\n                    if ($this.$data.refdatastore[j].attr == result[i].attr) {\n                      $this.$data.refdatastore[j].value = result[i].value;\n                    }\n                  }\n                }\n              }\n            }\n          }\n        } else {\n          uni.showModal({\n            title: _this6.translateSys(\"error\") + \"3\",\n            content: success.err_msg,\n            showCancel: false,\n            confirmText: _this6.translateSys(\"cancel\")\n          });\n        }\n      }).catch(function (ex) {\n        // console.log(ex);\n        uni.showModal({\n          title: _this6.translateSys(\"error\") + \"3.1\",\n          content: ex.errMsg,\n          showCancel: false,\n          confirmText: _this6.translateSys(\"cancel\")\n        });\n      });\n    },\n    DataObjRunCustomEvent_Return: function DataObjRunCustomEvent_Return(eventid, data_attr, button_callback, item) {\n      var _this7 = this;\n      var enviroment = {\n        'function': '3000',\n        // 功能点编号\n        cls_id: this.$data.param.DataCls.id,\n        // 功能点主数据类标识\n        'button': 'top',\n        // top/bottom\n        button_name: this.translateSys('add2'),\n        master: {\n          cls_id: this.$data.param.DataCls.id // button=bottom时 master的cls_id\n          //obj_id: ''  // button=bottom时 master的obj_id\n        }\n      };\n\n      var obj_attr = this.head_styledef.form.model;\n      // console.log(obj_attr);\n      var req = Object.keys(obj_attr).map(function (a) {\n        return {\n          attr: a,\n          val: obj_attr[a] || \"\"\n        };\n      });\n      if (this.$data.refdatastore.length > 0) {\n        for (var i = 0; i < this.$data.refdatastore.length; i++) {\n          if (!req.filter(function (s) {\n            return this.$data.refdatastore[i].attr == s.name;\n          }).length) {\n            length = 1;\n            req.push({\n              'attr': this.$data.refdatastore[i].attr,\n              'val': this.$data.refdatastore[i].value\n            });\n          }\n        }\n      }\n      var extinfo = enviroment;\n      extinfo.edit_dlg = {\n        type: 'small',\n        //小窗口\n        class_id: this.$data.param.DataCls.id //当前数据类id\n      };\n      // var dataInfo = {\n      // \tedtype:  \"0\", eventid: eventid, projectid: '',rclsid: '', robjid: '', userlogin: '', \n      // \tclsid: this.$data.param.DataCls.id, objid: '',attr: JSON.stringify(req), \n      // \textinfo: JSON.stringify(extinfo), global_attr: JSON.stringify(this.$data.global_attr)\n      // }\n      extinfo = _base.default.encode(JSON.stringify(extinfo)); //将字符串转换为base64编码\n      var global_attr = _base.default.encode(JSON.stringify(this.$data.global_attr)); //将字符串转换为base64编码\n      var obj_attr = {};\n      req.forEach(function (item) {\n        obj_attr[item.attr] = item.val;\n      });\n      if (!eventid.includes('{')) eventid = '{' + eventid + '}';\n      var dataInfo = {\n        ed_type: \"0\",\n        start_transaction: true,\n        class_id: this.$data.param.DataCls.id,\n        class_name: '',\n        event_id: eventid,\n        event_name: '',\n        data_obj_id: '',\n        obj_attr: obj_attr,\n        prj_id: '',\n        ref_cls_id: '',\n        rel_obj_id: '',\n        user_login: '',\n        data_json: '',\n        compose_info: '',\n        ext_info: extinfo,\n        global_attr: global_attr,\n        input_param: ''\n      };\n      __f__(\"log\", dataInfo, \" at pages/modal/3018_2.vue:1373\");\n      // return;\n      this.$store.dispatch('runCustomEvent', dataInfo).then(function (success) {\n        __f__(\"log\", success, \" at pages/modal/3018_2.vue:1376\");\n        if (success.err_code == 0) {\n          var data = success.result;\n          if (data.ret != 0) {\n            var tip = data.err_info ? typeof data.err_info == 'string' ? data.err_info : data.err_info.join('<br/>') : '';\n            if (data.ret == 801) {\n              if (_this7.param.Only_Script_Error) {\n                var pos = tip.indexOf(\":\");\n                if (pos > -1) tip = tip.substring(pos + 1);\n              }\n              uni.showModal({\n                title: _this7.translateSys(\"tip\"),\n                content: tip,\n                showCancel: false,\n                confirmText: _this7.translateSys(\"cancel\")\n              });\n            } else uni.showModal({\n              title: _this7.translateSys(\"tip\"),\n              content: tip + ',' + _this7.translateSys('tip') + ':' + data.ret,\n              showCancel: false,\n              confirmText: _this7.translateSys(\"cancel\")\n            });\n            return false;\n          } else {\n            var tip = data.info ? typeof data.info == 'string' ? data.info : data.info.join('<br/>') : '';\n            if (tip) uni.showModal({\n              title: _this7.translateSys(\"tip\"),\n              content: tip,\n              showCancel: false,\n              confirmText: _this7.translateSys(\"cancel\")\n            });\n            if (data != \"\") {\n              var actions = data.action;\n              __f__(\"log\", actions, \" at pages/modal/3018_2.vue:1414\");\n              if (actions) {\n                for (var i = 0; i < actions.length; i++) {\n                  var action = actions[i];\n                  var val = action.value;\n                  var enviroment = JSON.stringify(enviroment);\n                  if (action.action_type == 'open_panel') {\n                    var d = dialog({\n                      title: '<i class=\"ace-icon fa fa-info-circle\"></i> ' + _this7.translateSys(\"tip\"),\n                      content: _this7.translateSys(\"quotation_mark_left\") + action.action_type + _this7.translateSys(\"quotation_mark_right\") + _this7.translate(\"tip_action_unprocessed\")\n                    });\n                    d.show();\n                  } else if (action.action_type == 'open_select_userdlg') {\n                    var style = val.style;\n                    // style == 'user' ? '选择人员' : style == 'department' ? '选择部门' : style == 'role' ? '选择角色' : ''\n                    var $this = _this7;\n                    var param = {\n                      item: item,\n                      button_callback: button_callback,\n                      req: req,\n                      data_attr: data_attr\n                    };\n                    uni.navigateTo({\n                      url: '../selpsn/index?mulit=false&param=' + JSON.stringify(param),\n                      events: {\n                        AddPer: function AddPer(data, param) {\n                          // console.log(param);\n                          __f__(\"log\", data, \" at pages/modal/3018_2.vue:1449\");\n                          var callback_eventid = param.button_callback.trim();\n                          var info = {\n                            eventid: callback_eventid,\n                            edtype: \"0\",\n                            projectid: '',\n                            rclsid: '',\n                            robjid: '',\n                            userlogin: '',\n                            clsid: $this.$data.param.DataCls.id,\n                            objid: \"\",\n                            attr: param.req,\n                            inputparameter: data,\n                            dataJson: []\n                          };\n                          $this.DataObjRunCustomEvent(info, param.data_attr);\n                        }\n                      }\n                    });\n                  } else if (action.action_type == 'open_data_query_dlg') {\n                    var d = dialog({\n                      title: '<i class=\"ace-icon fa fa-info-circle\"></i> ' + _this7.translateSys(\"tip\"),\n                      content: _this7.translateSys(\"quotation_mark_left\") + action.action_type + _this7.translateSys(\"quotation_mark_right\") + _this7.translate(\"tip_action_unprocessed\")\n                    });\n                    d.show();\n                  } else if (action.action_type == 'open_common_dlg') {\n                    var $this = _this7;\n                    if (val.common_dlg_id == 'check_list') {\n                      $this.$data.check_list = val.config;\n                      if (val.config.appear_style == 'sideslip')\n                        //判断是否是侧滑\n                        $this.$data.popupType = 'right';else $this.$data.popupType = 'center';\n                      // open 方法传入参数 等同在 uni-popup 组件上绑定 type属性\n                      $this.$refs.popup.open($this.$data.popupType);\n                      var popupParam = {\n                        item: item,\n                        button_callback: button_callback,\n                        req: req,\n                        data_attr: data_attr\n                      };\n                      $this.$data.popupParam = popupParam;\n                    }\n                  } else if (action.action_type == 'open_project_query_dlg') {\n                    //console.log(action.value.select_range);\n                    //console.log(action.value.mulit_select);\n                    var priRel = '-1';\n                    if (action.value.select_range == '全部相关') priRel = '0';else if (action.value.select_range == '我负责的项目') priRel = '1';else if (action.value.select_range == '我创建的') priRel = '2';else if (action.value.select_range == '我参与的' || action.value.select_range == '我参加的') priRel = '3';else if (action.value.select_range == '我关注的') priRel = '4';else if (action.value.select_range == '我下属的项目') priRel = '5';\n                    var $this = _this7;\n                    var param_ = {\n                      item: item,\n                      button_callback: button_callback,\n                      req: req\n                    };\n                    uni.navigateTo({\n                      url: '../selPrj/index?relation=' + priRel + '&param=' + JSON.stringify(param_),\n                      events: {\n                        AddPer: function AddPer(data, param) {\n                          var attr = param.item.fieldId;\n                          $this.head_styledef.form.model[attr] = data[0].ID + ';' + data[0].Name;\n\n                          // $this.$data.classAttrList[param.index].Attr[param.iindex].Value=data[0].Name;\n                          // $this.$data.classAttrList[param.index].Attr[param.iindex].ValID=data[0].ID+';'+data[0].Name;\n                          var callback_eventid = param.button_callback.trim();\n                          if (callback_eventid) {\n                            var info = {\n                              eventid: callback_eventid,\n                              edtype: \"2\",\n                              projectid: data[0].ID,\n                              rclsid: \"\",\n                              robjid: \"\",\n                              userlogin: \"\",\n                              clsid: $this.$data.param.DataCls.id,\n                              objid: \"\",\n                              attr: param.req,\n                              dataJson: []\n                            };\n                            $this.DataObjRunCustomEvent(info);\n                          }\n                        }\n                      }\n                    });\n                  } else {\n                    uni.showModal({\n                      title: _this7.translateSys(\"tip\"),\n                      content: _this7.translateSys(\"quotation_mark_left\") + action.action_type + _this7.translateSys(\"quotation_mark_right\") + _this7.translate(\"tip_action_unprocessed\"),\n                      showCancel: false,\n                      confirmText: _this7.translateSys(\"cancel\")\n                    });\n                  }\n                }\n              }\n            } else {\n              uni.showModal({\n                title: _this7.translateSys('tip') + \"5.2\",\n                content: _this7.translateSys(\"quotation_mark_left\") + \"before_click_button\" + _this7.translateSys(\"quotation_mark_right\") + _this7.translateSys(\"comma\") + 'event_id' + eventid,\n                showCancel: false,\n                confirmText: _this7.translateSys(\"cancel\")\n              });\n            }\n          }\n        } else {\n          uni.showModal({\n            title: _this7.translateSys(\"error\") + \"5\",\n            content: success.err_msg,\n            showCancel: false,\n            confirmText: _this7.translateSys(\"cancel\")\n          });\n        }\n      }).catch(function (ex) {\n        // console.log(ex);\n        uni.showModal({\n          title: _this7.translateSys('tip') + \"5.1\",\n          content: ex.errMsg,\n          showCancel: false,\n          confirmText: _this7.translateSys(\"cancel\")\n        });\n      });\n    },\n    //确定\n    sava: function sava() {\n      var _this$after_ok;\n      if ((_this$after_ok = this.after_ok) !== null && _this$after_ok !== void 0 && _this$after_ok.id) {\n        // 点击确定按钮后\n        this.afterOK();\n      } else {\n        this.add();\n      }\n    },\n    add: function add() {\n      var _this8 = this;\n      uni.showLoading({\n        title: this.translateSys(\"loading\"),\n        mask: true\n      });\n      var obj_attr = this.head_styledef.form.model;\n      __f__(\"log\", obj_attr, \" at pages/modal/3018_2.vue:1620\");\n      // var req = Object.keys(obj_attr).map((a) => ({\n      // \tname: a,\n      // \tvalue: obj_attr[a] || \"\",\n      // }));\n\n      var enviroment = {\n        'function': '3000',\n        // 功能点编号\n        cls_id: this.$data.param.DataCls.id,\n        // 功能点主数据类标识\n        'button': 'top',\n        // top/bottom\n        button_name: this.translateSys('add2'),\n        master: {\n          cls_id: this.$data.param.DataCls.id\n        }\n      };\n      enviroment = _base.default.encode(JSON.stringify(enviroment)); //将字符串转换为base64编码\n\n      // console.log(obj_attr);\n      // var dataInfo={\n      //     class_id: this.$data.param.DataCls.id, data_obj_id: '', masterclsid: '',\n      //     req: JSON.stringify(req), upfile: JSON.stringify([]), post_data: JSON.stringify({}),\n      //     compose: JSON.stringify([]), refdatastore: JSON.stringify([]), extinfo: JSON.stringify(enviroment), \n      // \tnot_trigger_sys_event: ''\n      // };\n      var dataInfo = {\n        class_id: this.$data.param.DataCls.id,\n        class_name: '',\n        master_cls_id: '',\n        master_obj_id: '',\n        creator: '',\n        creator_name: '',\n        not_trigger_event: '',\n        update_exist: '',\n        post_process: '',\n        ext_info: enviroment,\n        obj_attr: obj_attr\n      };\n      __f__(\"log\", dataInfo, \" at pages/modal/3018_2.vue:1657\");\n      // return\n      this.$store.dispatch('createDataObj', dataInfo).then(function (success) {\n        __f__(\"log\", success, \" at pages/modal/3018_2.vue:1660\");\n        uni.hideLoading();\n        if (success.err_code == 0) {\n          var result = success.result;\n          // if(result.result_type == 0){}\n          if (success.result.action) {\n            var action = JSON.parse(success.result.action);\n            __f__(\"log\", action, \" at pages/modal/3018_2.vue:1667\");\n            if (action.ret == '0') {\n              if (action.ret != 0) {\n                uni.showModal({\n                  title: _this8.translateSys(\"tip\"),\n                  content: _this8.translate('execute_script_failed') + _this8.translateSys('comma') + _this8.translate('result') + _this8.translateSys('colon') + action.result,\n                  showCancel: false,\n                  confirmText: _this8.translateSys(\"cancel\")\n                });\n                return;\n              }\n              if (action.info) {\n                uni.showModal({\n                  title: _this8.translateSys(\"tip\"),\n                  content: _this8.translate('execute_script_failed') + _this8.translateSys('comma') + _this8.translateSys('colon') + action.info,\n                  showCancel: false,\n                  confirmText: _this8.translateSys(\"cancel\")\n                });\n                return;\n              }\n              if (action.result_type == '0') {\n                uni.showToast({\n                  title: action.result,\n                  icon: \"success\",\n                  duration: 3000\n                });\n              }\n\n              // \"{\"ret\":0, \"result_type\":0, \"result\":\"创建成功123123123\",\"info\":\"\"}\"\n            }\n          } else uni.showToast({\n            title: _this8.translate('create_success'),\n            icon: \"success\",\n            duration: 3000\n          });\n          if (!_this8.$data.param.After_Btn_Not_Refresh) {\n            //刷新\n            uni.redirectTo({\n              url: '../modal/3018_2?param=' + JSON.stringify(_this8.$data.param) + \"&titlename=\" + _this8.$data.title\n            });\n          }\n\n          // this.class_attr_init();\n        } else {\n          uni.showModal({\n            title: _this8.translateSys(\"error\"),\n            content: success.err_msg,\n            showCancel: false,\n            confirmText: _this8.translateSys(\"cancel\")\n          });\n        }\n      }).catch(function (ex) {\n        __f__(\"log\", ex, \" at pages/modal/3018_2.vue:1726\");\n        uni.hideLoading();\n        uni.showModal({\n          title: _this8.translateSys(\"tip\"),\n          content: ex.errMsg,\n          showCancel: false,\n          confirmText: _this8.translateSys(\"cancel\")\n        });\n      });\n    },\n    afterOK: function afterOK() {\n      var _this9 = this;\n      var obj_attr = this.head_styledef.form.model;\n      // console.log(obj_attr);\n      var input_param = {\n        id: \"\",\n        attrs: Object.keys(obj_attr).map(function (a) {\n          return {\n            attr: a,\n            value: obj_attr[a]\n          };\n        })\n      };\n      if (!this.after_ok.id.includes('{')) this.after_ok.id = '{' + this.after_ok.id + '}';\n      var dataInfo = {\n        ed_type: \"0\",\n        start_transaction: true,\n        class_id: this.$data.param.DataCls.id,\n        class_name: '',\n        event_id: this.after_ok.id,\n        event_name: '',\n        data_obj_id: '',\n        obj_attr: obj_attr,\n        prj_id: '',\n        ref_cls_id: '',\n        rel_obj_id: '',\n        user_login: '',\n        data_json: '',\n        compose_info: '',\n        input_param: ''\n      };\n      __f__(\"log\", dataInfo, \" at pages/modal/3018_2.vue:1764\");\n      // return;\n      this.$store.dispatch('runCustomEvent', dataInfo).then(function (success) {\n        __f__(\"log\", success, \" at pages/modal/3018_2.vue:1767\");\n        if (success.err_code == 0) {\n          var data = success.result;\n          if (data.ret != 0) {\n            var tip = data.err_info ? typeof data.err_info == 'string' ? data.err_info : data.err_info.join('<br/>') : '';\n            if (data.ret == 801) {\n              if (_this9.param.Only_Script_Error) {\n                var pos = tip.indexOf(\":\");\n                if (pos > -1) tip = tip.substring(pos + 1);\n              }\n              uni.showModal({\n                title: _this9.translateSys(\"tip\"),\n                content: tip,\n                showCancel: false,\n                confirmText: _this9.translateSys(\"cancel\")\n              });\n            } else uni.showModal({\n              title: _this9.translateSys(\"tip\"),\n              content: tip + ',' + _this9.translateSys('tip') + ':' + data.ret,\n              showCancel: false,\n              confirmText: _this9.translateSys(\"cancel\")\n            });\n            return false;\n          } else {\n            var tip = data.info ? typeof data.info == 'string' ? data.info : data.info.join('<br/>') : '';\n            if (tip) uni.showModal({\n              title: _this9.translateSys(\"tip\"),\n              content: tip,\n              showCancel: false,\n              confirmText: _this9.translateSys(\"cancel\")\n            });\n            var result = data.result;\n          }\n        } else {\n          uni.showModal({\n            title: _this9.translateSys(\"error\") + \"7\",\n            content: success.err_msg,\n            showCancel: false,\n            confirmText: _this9.translateSys(\"cancel\")\n          });\n        }\n      }).catch(function (ex) {\n        // console.log(ex);\n        uni.showModal({\n          title: _this9.translateSys('tip') + \"7.1\",\n          content: ex.errMsg,\n          showCancel: false,\n          confirmText: _this9.translateSys(\"cancel\")\n        });\n      });\n    },\n    cancel: function cancel(e) {\n      //取消\n      uni.navigateBack({\n        delta: 1 //返回层数,2则上上页\n      });\n    },\n    translate: function translate(t) {\n      if (typeof this.$t == \"function\") return this.$t(\"page.\".concat(t));else return t;\n    },\n    translateSys: function translateSys(t) {\n      if (typeof this.$t == \"function\") return this.$t(\"sys.\".concat(t));else return t;\n    }\n  }\n};\nexports.default = _default;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/vue-cli-plugin-uni/lib/format-log.js */ 18)[\"default\"]))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVuaS1hcHA6Ly8vcGFnZXMvbW9kYWwvMzAxOF8yLnZ1ZSJdLCJuYW1lcyI6WyJtb2R1bGVzIiwiQmFzZTY0IiwiZGF0YSIsInRpdGxlIiwicGFyYW0iLCJlZGl0X2luaXRhbF9ldmVudCIsImVkaXRfb2tfZXZlbnQiLCJlZGl0X3NlbGVjdF9jb21wb3NlX2V2ZW50IiwiZWRpdF9jb21wb3NlX2Nsc19pZCIsImdsb2JhbF9hdHRyIiwicmVmZGF0YXN0b3JlIiwic2NhbkNvZGVWYWwiLCJzdWJDbGFzc0F0dHJMaXN0Iiwic3ViUGFuZWxMaXN0Iiwic3ViQ2xhc3NHcmlkU3R5bGUiLCJwb3B1cFR5cGUiLCJjaGVja19saXN0IiwiZm9jdXNGaWVsZElkIiwiZm9jdXNPbGRGaWVsZElkIiwiaGVhZF9zdHlsZWRlZiIsImZvcm0iLCJpdGVtcyIsImFmdGVyX29rIiwiYWN0aXZpdHkiLCJyZWNlaXZlciIsImludGVudEZpbHRlciIsImNvbnRlbnQiLCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiLCJ1bmkiLCJzY2FuVHlwZSIsInN1Y2Nlc3MiLCIkdGhpcyIsImFyciIsIm5hbWUiLCJ1cmwiLCJvbkxvYWQiLCJ0aXRsZW5hbWUiLCJtZXRob2RzIiwic2V0RGF0YSIsIk9iamVjdCIsImtleXMiLCJ2YWwiLCJ0aGF0IiwibG9hZERhdGEiLCJhdHRycyIsImVsZSIsImluZGV4MiIsImNvbCIsIkhlYWRfVUlTdHlsZUdldEluZm8iLCJkYXRhSW5mbyIsImNsYXNzX2lkIiwidWlfc3R5bGVfaWQiLCJzdHlsZWRlZiIsInJlc3VsdCIsInN0eWxlX2RlZiIsImEiLCJpZCIsInNob3dDYW5jZWwiLCJjb25maXJtVGV4dCIsIkRpY3RHZXRJbmZvIiwiZGljdF9pZCIsImRpY3RfbmFtZSIsImxpc3QiLCJpdGVtTmFtZSIsInRleHQiLCJ2YWx1ZSIsImF0dHIiLCJsb2FkSW5pdEV2ZW50IiwiZWRfdHlwZSIsInN0YXJ0X3RyYW5zYWN0aW9uIiwiZXZlbnRfaWQiLCJlcnJfaW5mbyIsImpvaW4iLCJsZW5ndGgiLCJkaWN0SXRlbUxpc3QiLCJjaG9pY2VfbGlzdCIsInVuZGVmaW5lZCIsImkiLCJmaWVsZElkIiwiZm9yRWFjaCIsInNob3ciLCJhY3Rpb24iLCJhY3Rpb25fdHlwZSIsInRyYW5zbGF0ZSIsImVycl9tc2ciLCJvbnRhcCIsImdldEFwcCIsIm9uU2NhblZhbHVlIiwiaXRlbSIsImZpbmRkIiwiY3VySW5kZXgiLCJldmVudGlkIiwiZWR0eXBlIiwicHJvamVjdGlkIiwicmNsc2lkIiwicm9iamlkIiwidXNlcmxvZ2luIiwiY2xzaWQiLCJvYmppZCIsImRhdGFKc29uIiwib25DbGljayIsIm9uZXZlbnQiLCJvbmNoYW5nZSIsIm9uTW9kZWxWYWx1ZSIsImNsYXNzQXR0cl9leHRCdXR0b24iLCJwb3B1cENoYW5nZSIsImNoZWNrQ2hhbmdlIiwicG9wdXBfY2FuY2VsIiwicG9wdXBfc2F2YSIsIkRhdGFPYmpSdW5DdXN0b21FdmVudCIsImNsc19pZCIsImJ1dHRvbl9uYW1lIiwibWFzdGVyIiwiZW52aXJvbWVudCIsInR5cGUiLCJncm91cF9uYW1lIiwicmVhZG9ubHkiLCJidXR0b25faW1nIiwiYnV0dG9uX3Rvb2x0aXAiLCJpbmZvIiwib2JqX2F0dHIiLCJjbGFzc19uYW1lIiwiZXZlbnRfbmFtZSIsImRhdGFfb2JqX2lkIiwicHJqX2lkIiwicmVmX2Nsc19pZCIsInJlbF9vYmpfaWQiLCJ1c2VyX2xvZ2luIiwiZGF0YV9qc29uIiwiY29tcG9zZV9pbmZvIiwiZXh0X2luZm8iLCJpbnB1dF9wYXJhbSIsImluZGV4IiwiRGF0YU9ialJ1bkN1c3RvbUV2ZW50X1JldHVybiIsInJlcSIsImV4dGluZm8iLCJkIiwiYnV0dG9uX2NhbGxiYWNrIiwiZGF0YV9hdHRyIiwic3RyaW5naWZ5IiwiZXZlbnRzIiwiQWRkUGVyIiwidHJpbSIsImlucHV0cGFyYW1ldGVyIiwicHJpUmVsIiwic2VsZWN0X3JhbmdlIiwiSlNPTiIsIkRhdGFDbHMiLCJzYXZhIiwiYWRkIiwibWFzayIsIm1hc3Rlcl9jbHNfaWQiLCJtYXN0ZXJfb2JqX2lkIiwiY3JlYXRvciIsImNyZWF0b3JfbmFtZSIsIm5vdF90cmlnZ2VyX2V2ZW50IiwidXBkYXRlX2V4aXN0IiwicG9zdF9wcm9jZXNzIiwidHJhbnNsYXRlU3lzIiwiaWNvbiIsImR1cmF0aW9uIiwiYWZ0ZXJPSyIsImNhbmNlbCIsImRlbHRhIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUF3SkE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7ZUFDQTtFQUNBQTtJQUNBQztFQUNBO0VBQ0FDO0lBQ0E7TUFDQUM7TUFDQUM7TUFDQUM7TUFBQTtNQUNBQztNQUFBO01BQ0FDO01BQUE7TUFDQUM7TUFDQUM7TUFDQUM7TUFBQTtNQUNBQztNQUNBQztNQUNBQztNQUNBQztNQUNBQztNQUNBQztNQUVBQztNQUNBQztNQUNBQztRQUNBQztVQUNBQztRQUNBO01BQ0E7TUFDQUM7TUFDQUM7TUFDQUM7TUFDQUM7TUFDQUM7SUFDQTtFQUNBO0VBQ0FDO0lBQ0E7TUFDQTtNQUNBQztRQUNBQztRQUNBQztVQUVBO1lBQ0E7WUFDQTtjQUNBO2NBQ0Esb0VBQ0E7Z0JBQ0E7a0JBQ0FDO2tCQUNBO2dCQUNBO2NBQ0E7Z0JBQ0EsNEVBQ0FDO2tCQUNBLGdFQUNBQyw4QkFDQWhCO2dCQUNBO2dCQUNBO2tCQUNBO2tCQUNBYztrQkFDQTtnQkFDQTtjQUNBO1lBQ0E7VUFDQTtRQUVBO01BQ0E7SUFDQTtNQUNBO01BQ0FIO1FBQ0FNLG1FQUNBO01BQ0E7SUFDQTtFQUNBO0VBQ0FDO0lBQ0E7SUFDQVA7TUFDQXpCO0lBQ0E7SUFDQTtJQUNBLHlGQUNBaUM7SUFDQTtFQUNBO0VBRUFDO0lBQ0FDO01BQ0E7TUFDQTtNQUNBO01BRUFDO1FBQ0FDO1FBQ0FDO1FBQ0F2QztRQUNBc0M7VUFDQTtZQUNBRTtVQUNBO1lBQ0E7Y0FDQUE7WUFDQTtVQUNBO1VBQ0F4QztRQUNBO01BQ0E7SUFDQTtJQUNBeUM7TUFBQTtNQUFBO1FBQUE7UUFBQTtRQUFBO1VBQUE7WUFBQTtjQUFBO2dCQUFBO2dCQUFBLE9BR0E7Y0FBQTtnQkFDQTtnQkFDQTtrQkFDQUM7a0JBQ0E7b0JBQUE7c0JBQUE7d0JBQUE7MEJBQUE7NEJBQUE7OEJBQ0E7Z0NBQ0FBO2tDQUFBO29DQUFBO3NDQUFBO3dDQUFBOzBDQUFBOzRDQUNBOzhDQUNBQzs0Q0FDQTswQ0FBQTswQ0FBQTs0Q0FBQTt3Q0FBQTtzQ0FBQTtvQ0FBQTtrQ0FBQSxDQUNBO2tDQUFBO29DQUFBO2tDQUFBO2dDQUFBOzhCQUNBO2dDQUNBQTtrQ0FBQTtvQ0FBQTtzQ0FBQTt3Q0FBQTswQ0FBQTs0Q0FDQTs4Q0FDQUQ7Z0RBQUEsNEdBQ0FFO2tEQUFBO29EQUFBO3NEQUFBO3dEQUFBOzBEQUNBOzREQUNBQzswREFDQTt3REFBQTt3REFBQTswREFBQTtzREFBQTtvREFBQTtrREFBQTtnREFBQSxDQUNBO2dEQUFBO2tEQUFBO2dEQUFBOzhDQUFBOzRDQUNBOzBDQUFBOzBDQUFBOzRDQUFBO3dDQUFBO3NDQUFBO29DQUFBO2tDQUFBLENBQ0E7a0NBQUE7b0NBQUE7a0NBQUE7Z0NBQUE7OEJBQ0E7NEJBQUE7NEJBQUE7OEJBQUE7MEJBQUE7d0JBQUE7c0JBQUE7b0JBQUEsQ0FDQTtvQkFBQTtzQkFBQTtvQkFBQTtrQkFBQTtnQkFDQTtnQkFFQTtjQUFBO2NBQUE7Z0JBQUE7WUFBQTtVQUFBO1FBQUE7TUFBQTtJQUVBO0lBQ0FDO01BQUE7TUFBQTtRQUFBO1FBQUE7VUFBQTtZQUFBO2NBQUE7Z0JBQUE7Z0JBQ0FqQjtnQkFDQWtCO2tCQUNBQztrQkFDQUM7Z0JBQ0E7Z0JBQ0E7a0JBQ0E7a0JBQ0E7b0JBQUE7b0JBQ0E7b0JBQ0E7c0JBQ0E7c0JBQ0FDO3NCQUNBO3NCQUNBLDZFQUNBQyxPQUNBQztvQkFDQTtvQkFDQXZCO29CQUNBO29CQUNBQTtzQkFBQTt3QkFBQTswQkFBQTs0QkFBQTs4QkFBQTtnQ0FDQWM7Z0NBQUEsTUFDQUE7a0NBQUE7a0NBQUE7Z0NBQUE7Z0NBQUE7Z0NBQUEsT0FDQTs4QkFBQTtnQ0FFQTtrQ0FDQSxvRUFDQTtvQ0FDQWQ7c0NBQ0FkO29DQUNBO2tDQUNBO2dDQUNBOzhCQUFBOzhCQUFBO2dDQUFBOzRCQUFBOzBCQUFBO3dCQUFBO3NCQUFBLENBRUE7c0JBQUE7d0JBQUE7c0JBQUE7b0JBQUE7b0JBQ0E7c0JBQ0FjO3dCQUFBOzBCQUFBOzRCQUFBOzhCQUFBO2dDQUFBO2tDQUFBLE1BQ0F3QjtvQ0FBQTtvQ0FBQTtrQ0FBQTtrQ0FBQTtrQ0FBQSxPQUNBeEI7Z0NBQUE7a0NBQUE7a0NBQUE7Z0NBQUE7a0NBQ0E7b0NBQ0FBO3NDQUNBeUI7c0NBQ0F2QjtvQ0FDQTtrQ0FDQTtnQ0FBQTtnQ0FBQTtrQ0FBQTs4QkFBQTs0QkFBQTswQkFBQTt3QkFBQSxDQUNBO3dCQUFBOzBCQUFBO3dCQUFBO3NCQUFBO29CQUNBO2tCQUVBO29CQUNBTDtzQkFDQXpCO3NCQUNBdUI7c0JBQ0ErQjtzQkFDQUM7b0JBQ0E7a0JBQ0E7Z0JBQ0E7a0JBQ0E7a0JBQ0E5QjtvQkFDQXpCO29CQUNBdUI7b0JBQ0ErQjtvQkFDQUM7a0JBQ0E7Z0JBQ0E7Y0FBQTtjQUFBO2dCQUFBO1lBQUE7VUFBQTtRQUFBO01BQUE7SUFFQTtJQUNBQztNQUFBO01BQUE7UUFBQTtRQUFBO1VBQUE7WUFBQTtjQUFBO2dCQUFBO2dCQUNBO2dCQUNBNUI7Z0JBQ0FrQjtrQkFDQVc7a0JBQ0FDO2dCQUNBLEdBQ0E7Z0JBQ0E7a0JBQUE7b0JBQUE7b0JBQUE7c0JBQUE7d0JBQUE7MEJBQUE7NEJBQ0E7NEJBQ0E7OEJBQ0E7Z0NBQ0FDO2dDQUNBQztnQ0FDQWpDO2tDQUNBLDRCQUNBaUM7a0NBQ0FEO29DQUNBRTtvQ0FDQUM7a0NBQ0E7Z0NBQ0E7Z0NBQ0E7Z0NBQ0E7a0NBQ0FsQztrQ0FDQW1DO2tDQUNBbkM7Z0NBQ0E7Z0NBQ0FBO2dDQUNBO2dDQUNBOzhCQUNBO2dDQUNBO2dDQUNBOzhCQUFBOzRCQUdBOzhCQUNBSDtnQ0FDQXpCO2dDQUNBdUI7Z0NBQ0ErQjtnQ0FDQUM7OEJBQ0E7NEJBQ0E7MEJBQUE7MEJBQUE7NEJBQUE7d0JBQUE7c0JBQUE7b0JBQUE7a0JBQUEsQ0FDQTtrQkFBQTtvQkFBQTtrQkFBQTtnQkFBQTtrQkFDQTtrQkFDQTlCO29CQUNBekI7b0JBQ0F1QjtvQkFDQStCO29CQUNBQztrQkFDQTtnQkFDQTtjQUFBO2NBQUE7Z0JBQUE7WUFBQTtVQUFBO1FBQUE7TUFBQTtJQUNBO0lBQ0FTO01BQUE7TUFBQTtRQUFBO1FBQUE7VUFBQTtZQUFBO2NBQUE7Z0JBQ0FwQztnQkFDQTtnQkFDQWtCO2tCQUNBbUI7a0JBQ0FDO2tCQUNBbkI7a0JBQ0FvQjtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtrQkFDQTtrQkFDQTtvQkFDQTtvQkFDQTtzQkFDQSxrRUFDQUMsZ0JBQ0FBO3NCQUNBO3dCQUNBOzBCQUNBOzBCQUNBO3dCQUNBO3dCQUNBM0M7MEJBQ0F6QjswQkFDQXVCOzBCQUNBK0I7MEJBQ0FDO3dCQUNBO3NCQUNBO3dCQUNBdkQ7d0JBQ0F1Qjt3QkFDQStCO3dCQUNBQztzQkFDQTtzQkFDQTtvQkFDQTtzQkFDQSwyRUFDQWMsS0FDQTtzQkFDQTt3QkFDQXJFO3dCQUNBdUI7d0JBQ0ErQjt3QkFDQUM7c0JBQ0E7c0JBRUE7c0JBQ0E7d0JBQ0E7d0JBQ0E7MEJBQ0E7MEJBQ0E7NEJBQ0E7NEJBQ0E7OEJBQ0E7Z0NBQ0EsbURBQ0FlO2tDQUNBO2tDQUNBO29DQUNBO3NDQUNBO3NDQUNBO3dDQUNBO3dDQUNBQzswQ0FDQTswQ0FDQTswQ0FDQTswQ0FDQTt3Q0FDQTtzQ0FDQTtzQ0FDQVI7b0NBQ0E7a0NBQ0E7b0NBQ0FBO3NDQUNBO3dDQUNBLDZCQUNBQTswQ0FDQTswQ0FDQSx3QkFDQVM7NENBQ0Esb0JBQ0FBOzRDQUNBRDs4Q0FDQTs4Q0FDQTs4Q0FDQTs4Q0FDQTs0Q0FDQTswQ0FDQTswQ0FDQTNCO3dDQUNBO3NDQUNBO29DQUNBO2tDQUNBO2dDQUVBOzhCQUNBOzhCQUNBLHlEQUNBMEI7Z0NBQ0E7Z0NBQ0E7Z0NBQ0E7Z0NBQ0Esc0RBQ0FHO2tDQUNBN0MsaURBQ0FzQixVQUNBWTtnQ0FDQTtnQ0FDQTtnQ0FDQTtrQ0FDQTtvQ0FDQUM7b0NBQ0FBO29DQUNBQTtvQ0FDQUE7b0NBQ0FuQywrQ0FDQXNCLE9BQ0F3QjtrQ0FDQTtnQ0FDQTtrQ0FDQVg7b0NBQ0E7c0NBQ0EsNkJBQ0FBO3dDQUNBbkI7d0NBQ0FBO3dDQUNBQTt3Q0FDQUE7d0NBQ0FoQiwrQkFDQWdCLElBQ0ErQixxQkFDQWI7c0NBQ0E7b0NBQ0E7a0NBQ0E7Z0NBQ0E7OEJBQ0E7OEJBQ0E7OEJBQ0E7Z0NBQ0E7OEJBQ0E7Z0NBQ0FRO2dDQUNBMUM7OEJBQ0E7OEJBQ0E7Z0NBQ0EsNkNBQ0EwQztrQ0FDQSxrREFDQVA7b0NBQ0FuQyw4Q0FDQWtDO2tDQUNBO2dDQUNBOzhCQUNBOzRCQUNBOzBCQUNBOzRCQUNBOzRCQUNBWjs4QkFBQTtnQ0FBQTtrQ0FBQTtvQ0FBQTtzQ0FBQTt3Q0FDQXRCOzBDQUFBLG9GQUNBLG1CQUNBYzs0Q0FBQTs4Q0FBQTtnREFBQTtrREFBQTtvREFDQTtvREFDQTtzREFDQSx3QkFDQXFCO3dEQUNBckI7c0RBQ0E7b0RBQ0EsdUJBQ0E7c0RBQ0FBLG9CQUNBa0MsUUFDQTt3REFDQTswREFDQSxRQUNBRCxXQUNBWixLQUNBQSxNQUNBOzREQUNBbkIsV0FDQW1CLEtBQ0FjOzBEQUNBO3dEQUNBO3NEQUNBO29EQUNBO2tEQUFBO2tEQUFBO29EQUFBO2dEQUFBOzhDQUFBOzRDQUFBOzBDQUFBLENBQ0E7MENBQUE7NENBQUE7MENBQUE7d0NBQUE7c0NBQUE7c0NBQUE7d0NBQUE7b0NBQUE7a0NBQUE7Z0NBQUE7OEJBQUEsQ0FDQTs4QkFBQTtnQ0FBQTs4QkFBQTs0QkFBQTs0QkFDQSwwREFDQTdEOzRCQUNBWTs0QkFDQUE7NEJBQ0E7MEJBQ0E7NEJBQ0FIOzhCQUNBekI7OEJBQ0F1QiwwQkFDQSwrQkFDQSxtQ0FDQSxpREFDQSxXQUNBLDZDQUNBdUQsT0FDQUMsa0NBQ0EsaUNBQ0FDOzhCQUNBMUI7OEJBQ0FDOzRCQUNBOzBCQUNBO3dCQUNBO3NCQUNBO29CQUNBO2tCQUNBO29CQUNBOUI7c0JBQ0F6QjtzQkFDQXVCLHlEQUNBLG1DQUNBLG9FQUNBMEQ7c0JBQ0EzQjtzQkFDQUM7b0JBQ0E7a0JBQ0E7Z0JBQ0E7a0JBQ0E7a0JBQ0E5QjtvQkFDQXpCO29CQUNBdUIseURBQ0EsbUNBQ0E7b0JBQ0ErQjtvQkFDQUM7a0JBQ0E7Z0JBQ0E7Y0FBQTtjQUFBO2dCQUFBO1lBQUE7VUFBQTtRQUFBO01BQUE7SUFDQTtJQUdBMkI7TUFBQTtNQUFBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0FDO1FBQ0E7UUFDQTtRQUNBO01BQ0E7SUFDQTtJQUNBQztNQUNBO01BQ0E7TUFDQTtRQUNBQztRQUNBQTtRQUNBO1FBQ0F6RDtRQUNBO1VBQUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtZQUNBO1lBRUE7Y0FDQTtnQkFDQTtrQkFDQTBEO2dCQUNBO2tCQUNBO29CQUNBMUQ7c0JBQ0FkO29CQUNBO29CQUNBO2tCQUNBO2dCQUVBO2NBRUE7WUFDQTtjQUNBO2dCQUNBO2tCQUNBLHVFQUNBO2dCQUNBO2dCQUNBO2tCQUNBYztvQkFDQWQsNENBQ0E2RDtrQkFDQTtrQkFDQTtnQkFDQTtjQUVBO2dCQUFBO2tCQUNBO29CQUNBO2tCQUNBO2tCQUNBO29CQUNBVztvQkFDQTtzQkFDQSwyQ0FDQSw0Q0FDQTNDLFNBQ0E0QztvQkFDQTtvQkFDQTtzQkFDQTNEO3dCQUNBZCw0Q0FDQTZEO3NCQUNBO3NCQUNBO29CQUNBO2tCQUNBO2dCQUFBO2dCQUFBLHNCQUZBO2NBR0E7WUFFQTtVQUNBO1FBQ0E7UUFFQTtRQUNBO1VBQ0E7VUFDQTtVQUNBO1lBQUE7Y0FDQVo7Y0FDQXpCO1lBQ0E7VUFBQTtVQUVBO1lBQ0FrRDtZQUNBQztZQUNBQztZQUNBQztZQUNBQztZQUNBQztZQUNBQztZQUNBQztZQUNBaEM7WUFDQWlDO1VBQ0E7VUFDQTtRQUNBO01BQ0E7SUFDQTtJQUNBQztNQUNBO0lBQ0E7SUFDQUM7TUFDQTtNQUNBO01BQ0E7UUFDQWI7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1VBQ0E7VUFDQTtVQUNBO1lBQUE7Y0FDQXRCO2NBQ0F6QjtZQUNBO1VBQUE7VUFDQTtZQUNBa0Q7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQWhDO1lBQ0FpQztVQUNBO1VBQ0E7UUFDQTtNQUNBO0lBRUE7SUFDQUc7TUFDQTtNQUNBO1FBQ0FkO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtZQUFBO2NBQ0F0QjtjQUNBekI7WUFDQTtVQUFBO1VBQ0E7WUFDQWtEO1lBQ0FDO1lBQ0FDO1lBQ0FDO1lBQ0FDO1lBQ0FDO1lBQ0FDO1lBQ0FDO1lBQ0FoQztZQUNBaUM7VUFDQTtVQUNBO1FBQ0E7TUFDQTtJQUVBO0lBQ0FJO01BQUE7TUFDQTtNQUNBO0lBQ0E7SUFDQUM7TUFDQTtNQUNBOztNQUVBO1FBQ0E1RTtVQUNBekI7VUFDQXVCO1VBQ0ErQjtVQUNBQztRQUNBO1FBQ0E7TUFDQTtNQUNBO1FBQ0E5QjtVQUNBekI7VUFDQXVCO1VBQ0ErQjtVQUNBQztRQUNBO1FBQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUVBO0lBQ0E7SUFDQStDO01BQ0E7SUFDQTtJQUNBQztNQUFBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO1FBQUE7UUFDQTtVQUNBeEc7UUFDQTtNQUNBO01BQ0FBO01BQ0E7SUFFQTtJQUNBeUc7TUFBQTtNQUNBO0lBQ0E7SUFDQUM7TUFBQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7UUFDQTtVQUNBLFVBQ0EzRTtVQUNBQTtVQUNBL0I7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O1lBQ0EsNkVBQ0FqSSxLQUNBcUU7WUFDQTtjQUNBO2dCQUNBO2dCQUNBO2NBQ0E7Y0FDQTNDO2dCQUNBekI7Z0JBQ0F1QjtnQkFDQStCO2dCQUNBQztjQUNBO1lBQ0E7Y0FDQXZEO2NBQ0F1QjtjQUNBK0I7Y0FDQUM7WUFDQTtZQUNBO1VBQ0E7WUFDQSwyRUFDQWMsS0FDQTtZQUNBO2NBQ0FyRTtjQUNBdUI7Y0FDQStCO2NBQ0FDO1lBQ0E7WUFFQTtVQUVBO1FBQ0E7VUFDQTlCO1lBQ0F6QjtZQUNBdUI7WUFDQStCO1lBQ0FDO1VBQ0E7UUFDQTtNQUNBO1FBQ0E7UUFDQTlCO1VBQ0F6QjtVQUNBdUI7VUFDQStCO1VBQ0FDO1FBQ0E7TUFDQTtJQUNBO0lBRUF3RztNQUFBO01BQ0F0STtRQUNBdUk7TUFDQTtJQUNBO0lBQ0FoRjtNQUNBLHlFQUNBO0lBQ0E7SUFDQTJFO01BQ0Esd0VBQ0E7SUFDQTtFQUNBO0FBQ0E7QUFBQSwyQiIsImZpbGUiOiIxNTkuanMiLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcblx0PHZpZXcgY2xhc3M9XCJ1bmktcGFnZS1tb2RhbC0zMDE4LTJcIj5cclxuXHRcdDwhLS0g6KGo5aS05qC35byPIC0tPlxyXG5cdFx0PHVuaS1mb3JtcyByZWY9XCJiYXNlRm9ybVwiIGxhYmVsLWFsaWduPVwicmlnaHRcIj5cclxuXHRcdFx0PHZpZXcgY2xhc3M9XCJ2LWhlYWRTdHlsZVwiIHYtZm9yPVwiKGl0ZW0saW5kZXgpIGluIGhlYWRfc3R5bGVkZWYuZm9ybS5pdGVtc1wiPlxyXG5cdFx0XHRcdDwhLS0g5pmu6YCa5biD5bGAIC0tPlxyXG5cdFx0XHRcdDx1bmktZm9ybXMtaXRlbSBjbGFzcz1cImhlYWQtZm9ybVwiIHYtaWY9XCJpdGVtLm5hbWUgIT0gJ0xheW91dCcmJiBpdGVtLnNob3c9PXRydWVcIiA6bGFiZWw9XCJpdGVtLmxhYmVsICsn77yaJyBcIlxyXG5cdFx0XHRcdFx0OmxhYmVsLXdpZHRoPVwiaXRlbS5sYWJlbFdpZHRoKydweCdcIj5cclxuXHRcdFx0XHRcdDwhLS0gPHRleHQgY2xhc3M9XCJ0eHRfdGl0bGVcIiA6c3R5bGU9XCJ7J3dpZHRoJzppdGVtLmxhYmVsV2lkdGgrJ3B4J31cIj57e2l0ZW0ubGFiZWx9fe+8mjwvdGV4dD4gLS0+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImZvcm0taXRlbS1zcGFuXCIgdi1pZj1cIml0ZW0uZGlzYWJsZWRcIlxyXG5cdFx0XHRcdFx0XHQ6c3R5bGU9XCInd2lkdGg6IGNhbGMoMTAwJSAtICcraXRlbS5sYWJlbFdpZHRoKydweCk7J1wiPnt7aXRlbS52YWx1ZX19PC9zcGFuPlxyXG5cdFx0XHRcdFx0PCEtLSDkuIvmi4nmoYYt5Y2V6YCJIGl0ZW0udXNlRGljdD9pdGVtLmRpY3Q6aXRlbS5zZWxlY3Rpb25zLS0+XHJcblx0XHRcdFx0XHQ8dW5pLWRhdGEtc2VsZWN0IGlkPVwiZHZfc2VsZWN0XCIgdi1pZj1cIml0ZW0ubmFtZT09J1NlbGVjdCcgJiYgIWl0ZW0uZGlzYWJsZWRcIlxyXG5cdFx0XHRcdFx0XHQ6c3R5bGU9XCInd2lkdGg6IGNhbGMoMTAwJSAtICcraXRlbS5sYWJlbFdpZHRoLTEwKydweCk7J1wiXHJcblx0XHRcdFx0XHRcdDpjbGFzcz1cIml0ZW0uZGlzYWJsZWQ/J2lucHV0LWRpc2FibGVkJzonJ1wiIHYtbW9kZWw9XCJpdGVtLnZhbHVlXCIgOmxvY2FsZGF0YT1cIml0ZW0uZGljdFwiXHJcblx0XHRcdFx0XHRcdEBjaGFuZ2U9XCJvbmNoYW5nZShpdGVtKVwiIDpkaXNhYmxlZD1cIml0ZW0uZGlzYWJsZWRcIiA6Y2xlYXI9XCJmYWxzZVwiPjwvdW5pLWRhdGEtc2VsZWN0PlxyXG5cdFx0XHRcdFx0PCEtLSDmlofmnKzmoYYv5pWw5a2X5qGGIC0tPlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCJcclxuXHRcdFx0XHRcdFx0di1pZj1cIihpdGVtLm5hbWU9PSdJbnB1dCcgfHwgaXRlbS5uYW1lPT0nSW5wdXROdW1iZXInKSAmJiAhaXRlbS5kaXNhYmxlZFwiPlxyXG5cdFx0XHRcdFx0XHQ8dGV4dCB2LWlmPVwiaXRlbS5zZXR0aW5nLnByZWZpeFwiIGNsYXNzPVwidW5pLWljb25cIiA6Y2xhc3M9XCJbaXRlbS5zZXR0aW5nLnByZWZpeF1cIlxyXG5cdFx0XHRcdFx0XHRcdEBjaGFuZ2U9XCJjbGFzc0F0dHJfZXh0QnV0dG9uKGl0ZW0pXCI+JiN4ZTU2ODs8L3RleHQ+XHJcblx0XHRcdFx0XHRcdDxpbnB1dCBjbGFzcz1cInVuaS1pbnB1dFwiIDpjbGFzcz1cIml0ZW0uZGlzYWJsZWQ/J2lucHV0LWRpc2FibGVkJzonJ1wiXHJcblx0XHRcdFx0XHRcdFx0OnR5cGU9XCJpdGVtLm5hbWU9PSdJbnB1dCc/J3RleHQnOml0ZW0ubmFtZT09J0lucHV0TnVtYmVyJz8nbnVtYmVyJzondGV4dCdcIlxyXG5cdFx0XHRcdFx0XHRcdHYtbW9kZWw9XCJpdGVtLnZhbHVlXCIgOmRpc2FibGVkPVwiaXRlbS5kaXNhYmxlZFwiIDpwbGFjZWhvbGRlcj1cIml0ZW0ucGxhY2Vob2xkZXJcIlxyXG5cdFx0XHRcdFx0XHRcdDpzdHlsZT1cInsnd2lkdGgnOml0ZW0uc2V0dGluZy5wcmVmaXggJiYgaXRlbS5zZXR0aW5nLnN1ZmZpeD8nNzglJzppdGVtLnNldHRpbmcucHJlZml4IHx8IGl0ZW0uc2V0dGluZy5zdWZmaXg/Jzg3JSc6Jzk2JSd9XCJcclxuXHRcdFx0XHRcdFx0XHQ6Zm9jdXM9XCJmb2N1c0ZpZWxkSWQgPT0gaXRlbS5maWVsZElkXCIgQGZvY3VzPVwib250YXAoaXRlbSlcIiBAY2xpY2s9XCJvbkNsaWNrKGl0ZW0pXCJcclxuXHRcdFx0XHRcdFx0XHRAYmx1cj1cIm9uZXZlbnQoaXRlbSlcIiAvPlxyXG5cdFx0XHRcdFx0XHQ8dGV4dCB2LWlmPVwiaXRlbS5zZXR0aW5nLnN1ZmZpeFwiIGNsYXNzPVwidW5pLWljb25cIiA6Y2xhc3M9XCJbaXRlbS5zZXR0aW5nLnN1ZmZpeF1cIlxyXG5cdFx0XHRcdFx0XHRcdEBjbGljaz1cImNsYXNzQXR0cl9leHRCdXR0b24oaXRlbSlcIj4mI3hlNTY4OzwvdGV4dD5cclxuXHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHRcdDwhLS0g5aSa6KGM5paH5pysIC0tPlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCIgdi1pZj1cIml0ZW0ubmFtZT09J1RleHRhcmVhJyAmJiAhaXRlbS5kaXNhYmxlZFwiPlxyXG5cdFx0XHRcdFx0XHQ8dGV4dGFyZWEgY2xhc3M9XCJ1bmktaW5wdXRcIiA6Y2xhc3M9XCJpdGVtLmRpc2FibGVkPydpbnB1dC1kaXNhYmxlZCc6JydcIiA6dmFsdWU9XCJpdGVtLnZhbHVlXCJcclxuXHRcdFx0XHRcdFx0XHQ6Zm9jdXM9XCJmb2N1c0ZpZWxkSWQgPT0gaXRlbS5maWVsZElkXCIgOnBsYWNlaG9sZGVyPVwiaXRlbS5wbGFjZWhvbGRlclwiXHJcblx0XHRcdFx0XHRcdFx0QGJsdXI9XCJvbk1vZGVsVmFsdWUoaXRlbSlcIiBAY2xpY2s9XCJvbkNsaWNrKGl0ZW0pXCIgOmRhdGEtaW5kZXg9XCJpbmRleFwiIHN0eWxlPVwiaGVpZ2h0OjYwcHg7XCJcclxuXHRcdFx0XHRcdFx0XHQ6c3R5bGU9XCJ7J3dpZHRoJzonOTYlJ31cIiA6ZGlzYWJsZWQ9XCJpdGVtLmRpc2FibGVkXCI+PC90ZXh0YXJlYT5cclxuXHJcblx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHQ8IS0tIOWkjemAieahhiAtLT5cclxuXHRcdFx0XHRcdDxjaGVja2JveC1ncm91cCBjbGFzcz1cImNoZWNrX3JlbWVtYmVyUHdkXCIgdi1pZj1cIml0ZW0ubmFtZT09J0NoZWNrYm94J1wiXHJcblx0XHRcdFx0XHRcdDpjbGFzcz1cIml0ZW0uZGlzYWJsZWQ/J2lucHV0LWRpc2FibGVkJzonJ1wiIEBjaGFuZ2U9XCJvbk1vZGVsVmFsdWUoaXRlbSlcIlxyXG5cdFx0XHRcdFx0XHQ6ZGlzYWJsZWQ9XCJpdGVtLmRpc2FibGVkXCIgOmRhdGEtaXNjaGVjaz1cIml0ZW0udmFsdWVcIj5cclxuXHRcdFx0XHRcdFx0PGxhYmVsPlxyXG5cdFx0XHRcdFx0XHRcdDxjaGVja2JveCA6dmFsdWU9XCJpdGVtLnZhbHVlXCIgOmNoZWNrZWQ9XCJpdGVtLnZhbHVlXCIgLz5cclxuXHRcdFx0XHRcdFx0XHQ8dGV4dD57e2l0ZW0ubGFiZWx9fTwvdGV4dD5cclxuXHRcdFx0XHRcdFx0PC9sYWJlbD5cclxuXHRcdFx0XHRcdDwvY2hlY2tib3gtZ3JvdXA+XHJcblx0XHRcdFx0XHQ8IS0tIFN3aXRjaOW8gOWFsyAtLT5cclxuXHRcdFx0XHRcdDxzd2l0Y2ggY2xhc3M9XCJpbnB1dC1zd2l0Y2hcIiB2LWlmPVwiaXRlbS5uYW1lPT0nU3dpdGNoJ1wiIDpjbGFzcz1cIml0ZW0uZGlzYWJsZWQ/J2lucHV0LWRpc2FibGVkJzonJ1wiXHJcblx0XHRcdFx0XHRcdDpkaXNhYmxlZD1cIml0ZW0uZGlzYWJsZWRcIiB2LW1vZGVsPVwiaXRlbS52YWx1ZVwiIEBjaGFuZ2U9XCJvbk1vZGVsVmFsdWUoaXRlbSlcIiAvPlxyXG5cdFx0XHRcdFx0PCEtLSDml6XmnJ/ml7bpl7QgLS0+XHJcblx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImlucHV0LXdyYXBwZXJcIlxyXG5cdFx0XHRcdFx0XHR2LWlmPVwiKGl0ZW0ubmFtZT09J1RpbWVQaWNrZXInIHx8IGl0ZW0ubmFtZT09J0RhdGVQaWNrZXInKSAmJiAhaXRlbS5kaXNhYmxlZFwiPlxyXG5cdFx0XHRcdFx0XHQ8cGlja2VyIG1vZGU9XCJkYXRlXCIgY2xhc3M9XCJkYXRlX2lwdXRcIiA6Y2xhc3M9XCJpdGVtLmRpc2FibGVkPydpbnB1dC1kaXNhYmxlZCc6JydcIlxyXG5cdFx0XHRcdFx0XHRcdDpkaXNhYmxlZD1cIml0ZW0uZGlzYWJsZWRcIiA6dmFsdWU9XCJpdGVtLnZhbHVlXCIgQGNoYW5nZT1cIm9uTW9kZWxWYWx1ZShpdGVtKVwiPlxyXG5cdFx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwicGlja2VyXCI+e3tpdGVtLnZhbHVlfX08L3ZpZXc+XHJcblx0XHRcdFx0XHRcdDwvcGlja2VyPlxyXG5cdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdDwvdW5pLWZvcm1zLWl0ZW0+XHJcblx0XHRcdFx0PCEtLSDmoIXmoLzluIPlsYAgLS0+XHJcblx0XHRcdFx0PHVuaS1yb3cgY2xhc3M9XCJkZW1vLXVuaS1yb3dcIiB2LWlmPVwiaXRlbS5uYW1lPT0nTGF5b3V0JyAmJiBpdGVtLnNob3c9PXRydWVcIj5cclxuXHRcdFx0XHRcdDx1bmktY29sIHYtZm9yPVwiKGNvbHMsa2V5KSBpbiBpdGVtLnNldHRpbmcuY29sTGlzdFwiXHJcblx0XHRcdFx0XHRcdDpzcGFuPVwiaXRlbS5zZXR0aW5nLnNwYW5MaXN0P2l0ZW0uc2V0dGluZy5zcGFuTGlzdFtrZXldOjI0IC8gaXRlbS5zZXR0aW5nLmNvbFwiPlxyXG5cdFx0XHRcdFx0XHQ8dW5pLWZvcm1zLWl0ZW0gY2xhc3M9XCJoZWFkLWZvcm1cIiAgdi1pZj1cImNvbHMhPW51bGxcIiA6bGFiZWw9XCJjb2xzLmxhYmVsICsn77yaJ1wiIDpsYWJlbC13aWR0aD1cImNvbHMubGFiZWxXaWR0aCsncHgnXCI+XHJcblx0XHRcdFx0XHRcdFx0PCEtLSA8dGV4dCBjbGFzcz1cInR4dF90aXRsZVwiIDpzdHlsZT1cInsnd2lkdGgnOmNvbHMubGFiZWxXaWR0aCsncHgnfVwiPnt7Y29scy5sYWJlbH1977yaPC90ZXh0PiAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImZvcm0taXRlbS1zcGFuXCIgdi1pZj1cImNvbHMuZGlzYWJsZWRcIj57e2NvbHMudmFsdWV9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImlucHV0LXdyYXBwZXJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0di1pZj1cIihjb2xzLm5hbWU9PSdJbnB1dCcgfHwgY29scy5uYW1lPT0nSW5wdXROdW1iZXInKSAmJiAhY29scy5kaXNhYmxlZFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRleHQgdi1pZj1cImNvbHMuc2V0dGluZy5wcmVmaXhcIiBjbGFzcz1cInVuaS1pY29uXCIgOmNsYXNzPVwiW2NvbHMuc2V0dGluZy5wcmVmaXhdXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0QGNoYW5nZT1cIm9uY2hhbmdlKGNvbHMpXCI+JiN4ZTU2ODs8L3RleHQ+XHJcblx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgY2xhc3M9XCJ1bmktaW5wdXRcIiA6Y2xhc3M9XCJjb2xzLmRpc2FibGVkPydpbnB1dC1kaXNhYmxlZCc6JydcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ6dHlwZT1cImNvbHMubmFtZT09J0lucHV0Jz8ndGV4dCc6Y29scy5uYW1lPT0nSW5wdXROdW1iZXInPydudW1iZXInOid0ZXh0J1wiXHJcblx0XHRcdFx0XHRcdFx0XHRcdHYtbW9kZWw9XCJjb2xzLnZhbHVlXCIgOmRpc2FibGVkPVwiY29scy5kaXNhYmxlZFwiIDpwbGFjZWhvbGRlcj1cImNvbHMucGxhY2Vob2xkZXJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ6c3R5bGU9XCJ7J3dpZHRoJzpjb2xzLnNldHRpbmcucHJlZml4ICYmIGNvbHMuc2V0dGluZy5zdWZmaXg/Jzc4JSc6Y29scy5zZXR0aW5nLnByZWZpeCB8fCBjb2xzLnNldHRpbmcuc3VmZml4Pyc4NyUnOic5NiUnfVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdDpmb2N1cz1cImZvY3VzRmllbGRJZCA9PSBjb2xzLmZpZWxkSWRcIiBAZm9jdXM9XCJvbnRhcChjb2xzKVwiIEBjbGljaz1cIm9uQ2xpY2soY29scylcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRAYmx1cj1cIm9uZXZlbnQoY29scylcIiAvPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHRleHQgdi1pZj1cImNvbHMuc2V0dGluZy5zdWZmaXhcIiBjbGFzcz1cInVuaS1pY29uXCIgOmNsYXNzPVwiW2NvbHMuc2V0dGluZy5zdWZmaXhdXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0QGNsaWNrPVwib25jaGFuZ2UoY29scylcIj4mI3hlNTY4OzwvdGV4dD5cclxuXHRcdFx0XHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdFx0XHRcdFx0PCEtLSDkuIvmi4nmoYYt5Y2V6YCJIGNvbHMudXNlRGljdD9jb2xzLmRpY3Q6Y29scy5zZWxlY3Rpb25zLS0+XHJcblx0XHRcdFx0XHRcdFx0PHVuaS1kYXRhLXNlbGVjdCBpZD1cImR2X3NlbGVjdFwiIHYtaWY9XCJjb2xzLm5hbWU9PSdTZWxlY3QnICYmICFjb2xzLmRpc2FibGVkXCJcclxuXHRcdFx0XHRcdFx0XHRcdDpjbGFzcz1cImNvbHMuZGlzYWJsZWQ/J2lucHV0LWRpc2FibGVkJzonJ1wiIHYtbW9kZWw9XCJjb2xzLnZhbHVlXCIgOmxvY2FsZGF0YT1cImNvbHMuZGljdFwiXHJcblx0XHRcdFx0XHRcdFx0XHRAY2hhbmdlPVwib25jaGFuZ2UoY29scylcIiA6ZGlzYWJsZWQ9XCJjb2xzLmRpc2FibGVkXCIgOmNsZWFyPVwiZmFsc2VcIj48L3VuaS1kYXRhLXNlbGVjdD5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tIOWkmuihjOaWh+acrCAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cImlucHV0LXdyYXBwZXJcIiB2LWlmPVwiY29scy5uYW1lPT0nVGV4dGFyZWEnICYmICFjb2xzLmRpc2FibGVkXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dGV4dGFyZWEgY2xhc3M9XCJ1bmktaW5wdXRcIiA6dmFsdWU9XCJjb2xzLnZhbHVlXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0OmNsYXNzPVwiY29scy5kaXNhYmxlZD8naW5wdXQtZGlzYWJsZWQnOicnXCIgOnBsYWNlaG9sZGVyPVwiY29scy5wbGFjZWhvbGRlclwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdDpmb2N1cz1cImZvY3VzRmllbGRJZCA9PSBjb2xzLmZpZWxkSWRcIiBAYmx1cj1cIm9uTW9kZWxWYWx1ZShjb2xzKVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdEBjbGljaz1cIm9uQ2xpY2soY29scylcIiBzdHlsZT1cImhlaWdodDo2MHB4O1wiIDpzdHlsZT1cInsnd2lkdGgnOic5NiUnfVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdDpkaXNhYmxlZD1cImNvbHMuZGlzYWJsZWRcIj48L3RleHRhcmVhPlxyXG5cdFx0XHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tIOWkjemAieahhiAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8Y2hlY2tib3gtZ3JvdXAgY2xhc3M9XCJjaGVja19yZW1lbWJlclB3ZFwiIHYtaWY9XCJjb2xzLm5hbWU9PSdDaGVja2JveCdcIlxyXG5cdFx0XHRcdFx0XHRcdFx0OmNsYXNzPVwiY29scy5kaXNhYmxlZD8naW5wdXQtZGlzYWJsZWQnOicnXCIgOmRpc2FibGVkPVwiaXRlbS5kaXNhYmxlZFwiXHJcblx0XHRcdFx0XHRcdFx0XHRAY2hhbmdlPVwib25Nb2RlbFZhbHVlKGNvbHMpXCIgOmRhdGEtaXNjaGVjaz1cImNvbHMudmFsdWVcIlxyXG5cdFx0XHRcdFx0XHRcdFx0OnN0eWxlPVwieydtYXJnaW4tbGVmdCc6JzEwcnB4J31cIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxsYWJlbD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PGNoZWNrYm94IDp2YWx1ZT1cImNvbHMudmFsdWVcIiA6Y2hlY2tlZD1cImNvbHMudmFsdWVcIiAvPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8dGV4dD57e2NvbHMubGFiZWx9fTwvdGV4dD5cclxuXHRcdFx0XHRcdFx0XHRcdDwvbGFiZWw+XHJcblx0XHRcdFx0XHRcdFx0PC9jaGVja2JveC1ncm91cD5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tIFN3aXRjaOW8gOWFsyAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8c3dpdGNoIHYtaWY9XCJjb2xzLm5hbWU9PSdTd2l0Y2gnXCIgOmNsYXNzPVwiY29scy5kaXNhYmxlZD8naW5wdXQtZGlzYWJsZWQnOicnXCJcclxuXHRcdFx0XHRcdFx0XHRcdDpkaXNhYmxlZD1cIml0ZW0uZGlzYWJsZWRcIiB2LW1vZGVsPVwiY29scy52YWx1ZVwiIEBjaGFuZ2U9XCJvbk1vZGVsVmFsdWUoY29scylcIlxyXG5cdFx0XHRcdFx0XHRcdFx0OnN0eWxlPVwieydtYXJnaW4tbGVmdCc6JzEwcnB4J31cIiAvPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0g5pel5pyf5pe26Ze0IC0tPlxyXG5cdFx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiXHJcblx0XHRcdFx0XHRcdFx0XHR2LWlmPVwiKGNvbHMubmFtZT09J1RpbWVQaWNrZXInIHx8IGNvbHMubmFtZT09J0RhdGVQaWNrZXInKSAmJiAhY29scy5kaXNhYmxlZFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHBpY2tlciBtb2RlPVwiZGF0ZVwiIGNsYXNzPVwiZGF0ZV9pcHV0XCIgOmNsYXNzPVwiY29scy5kaXNhYmxlZD8naW5wdXQtZGlzYWJsZWQnOicnXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0OmRpc2FibGVkPVwiaXRlbS5kaXNhYmxlZFwiIDp2YWx1ZT1cImNvbHMudmFsdWVcIiBAY2hhbmdlPVwib25Nb2RlbFZhbHVlKGNvbHMpXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDx2aWV3IGNsYXNzPVwicGlja2VyXCI+e3tjb2xzLnZhbHVlfX08L3ZpZXc+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L3BpY2tlcj5cclxuXHRcdFx0XHRcdFx0XHQ8L3ZpZXc+XHJcblxyXG5cdFx0XHRcdFx0XHQ8L3VuaS1mb3Jtcy1pdGVtPlxyXG5cdFx0XHRcdFx0PC91bmktY29sPlxyXG5cdFx0XHRcdDwvdW5pLXJvdz5cclxuXHRcdFx0PC92aWV3PlxyXG5cdFx0PC91bmktZm9ybXM+XHJcblx0XHQ8dmlldyBjbGFzcz1cInZpZXctZmxvb3JcIj5cclxuXHRcdFx0PGJ1dHRvbiB0eXBlPVwiZGVmYXVsdFwiIEB0YXA9XCJzYXZhXCIgY2xhc3M9XCJidG5fYWRkXCI+e3t0aXRsZX19PC9idXR0b24+XHJcblx0XHRcdDxidXR0b24gdHlwZT1cImRlZmF1bHRcIiBAdGFwPVwiY2FuY2VsXCIgY2xhc3M9XCJidG5fY2FuY2VsXCI+e3t0cmFuc2xhdGVTeXMoJ2NhbmNlbCcpfX08L2J1dHRvbj5cclxuXHRcdDwvdmlldz5cclxuXHRcdDwhLS0g5pmu6YCa5by556qXIHRvcCBib3R0b20gY2VudGVyIGxlZnQgcmlnaHQgLS0+XHJcblx0XHQ8dmlldz5cclxuXHRcdFx0PHVuaS1wb3B1cCBjbGFzcz1cInZpZXctcG9wdXBcIiByZWY9XCJwb3B1cFwiIGJhY2tncm91bmQtY29sb3I9XCIjZmZmXCIgQGNoYW5nZT1cInBvcHVwQ2hhbmdlXCI+XHJcblx0XHRcdFx0PHZpZXcgY2xhc3M9XCJwb3B1cC1oZWFkZXJcIj57e2NoZWNrX2xpc3QudGl0bGV9fTwvdmlldz5cclxuXHRcdFx0XHQ8dmlldyBjbGFzcz1cInBvcHVwLWNvbnRlbnRcIiA6Y2xhc3M9XCJ7ICdwb3B1cC1oZWlnaHQnOiBwb3B1cFR5cGUgPT09ICdsZWZ0JyB8fCBwb3B1cFR5cGUgPT09ICdyaWdodCcgfVwiXHJcblx0XHRcdFx0XHQ6c3R5bGU9XCJ7J3dpZHRoJzpjaGVja19saXN0LndpZHRoP2NoZWNrX2xpc3Qud2lkdGgrJ3B4JzonMjAwcHgnLCdoZWlnaHQnOmNoZWNrX2xpc3QuaGVpZ2h0P2NoZWNrX2xpc3QuaGVpZ2h0KydweCc6Jzg4JSd9XCI+XHJcblx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cInBvcHVwLWNvbnRcIiA6c3R5bGU9XCJ7J2hlaWdodCc6Y2hlY2tfbGlzdC5oZWlnaHQ/Y2hlY2tfbGlzdC5oZWlnaHQtNDUrJ3B4JzonNDE1cHgnfVwiPlxyXG5cdFx0XHRcdFx0XHQ8dmlldyBjbGFzcz1cInZpZXdfcG9wdXBfQ2hlY2tMaXN0XCIgdi1mb3I9XCIoaXRlbSxpbmRleCkgaW4gY2hlY2tfbGlzdC5pdGVtc1wiPlxyXG5cdFx0XHRcdFx0XHRcdDxjaGVja2JveC1ncm91cCBjbGFzcz1cImNoZWNrX2xpc3RcIiBAY2hhbmdlPVwiY2hlY2tDaGFuZ2VcIiA6ZGF0YS1pc2NoZWNrPVwiaXRlbS5jaGVja1wiXHJcblx0XHRcdFx0XHRcdFx0XHQ6ZGF0YS1pbmRleD1cImluZGV4XCIgOnN0eWxlPVwieydtYXJnaW4tbGVmdCc6ICcxMHJweCd9XCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWw+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxjaGVja2JveCA6dmFsdWU9XCJpdGVtLmNoZWNrXCIgOmNoZWNrZWQ9XCJpdGVtLmNoZWNrXCIgLz5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PHRleHQ+e3tpdGVtLm5hbWV9fTwvdGV4dD5cclxuXHRcdFx0XHRcdFx0XHRcdDwvbGFiZWw+XHJcblx0XHRcdFx0XHRcdFx0PC9jaGVja2JveC1ncm91cD5cclxuXHRcdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdFx0PC92aWV3PlxyXG5cdFx0XHRcdFx0PHZpZXcgY2xhc3M9XCJwb3B1cC1mb290ZXJcIj5cclxuXHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiZGVmYXVsdFwiIEB0YXA9XCJwb3B1cF9zYXZhXCIgY2xhc3M9XCJidG5fcG9wdXBfYWRkXCI+e3t0cmFuc2xhdGVTeXMoJ29rJyl9fTwvYnV0dG9uPlxyXG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJkZWZhdWx0XCIgQHRhcD1cInBvcHVwX2NhbmNlbFwiXHJcblx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJidG5fcG9wdXBfY2FuY2VsXCI+e3t0cmFuc2xhdGVTeXMoJ2NhbmNlbCcpfX08L2J1dHRvbj5cclxuXHRcdFx0XHRcdDwvdmlldz5cclxuXHRcdFx0XHQ8L3ZpZXc+XHJcblx0XHRcdDwvdW5pLXBvcHVwPlxyXG5cdFx0PC92aWV3PlxyXG5cdDwvdmlldz5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQ+XHJcblx0aW1wb3J0IEJhc2U2NCBmcm9tICcuLi8uLi9jb21wb25lbnRzL2pzLWJhc2U2NC9iYXNlNjQuanMnXHJcblx0aW1wb3J0IHV0aWxzIGZyb20gXCJAL2pzL3V0aWxzLmpzXCJcclxuXHRleHBvcnQgZGVmYXVsdCB7XHJcblx0XHRtb2R1bGVzOiB7XHJcblx0XHRcdEJhc2U2NCxcclxuXHRcdH0sXHJcblx0XHRkYXRhKCkge1xyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cygnYWRkMicpLFxyXG5cdFx0XHRcdHBhcmFtOiB7fSxcclxuXHRcdFx0XHRlZGl0X2luaXRhbF9ldmVudDogXCJcIiwgLy/lvLnnqpfliJ3lp4vljJbkuovku7ZJRFxyXG5cdFx0XHRcdGVkaXRfb2tfZXZlbnQ6IFwiXCIsIC8v5by556qX54K55Ye7T0sg6Kem5Y+R5LqL5Lu2SURcclxuXHRcdFx0XHRlZGl0X3NlbGVjdF9jb21wb3NlX2V2ZW50OiBcIlwiLCAvL+mAieaLqee7hOaIkOWvueixoeaXtuiwg+eUqFxyXG5cdFx0XHRcdGVkaXRfY29tcG9zZV9jbHNfaWQ6IFwiXCIsXHJcblx0XHRcdFx0Z2xvYmFsX2F0dHI6IFtdLFxyXG5cdFx0XHRcdHJlZmRhdGFzdG9yZTogW10sIC8v5byV55So5pWw5o2u5a2Y5YKo5Yy6Ly8ge2F0dHI6J0dfUFJKXycgKyBiaW5kYXR0ciArICdfSUQnLCB2YWx1ZTppbmZvLmlkfVxyXG5cdFx0XHRcdHNjYW5Db2RlVmFsOiBcIlwiLFxyXG5cdFx0XHRcdHN1YkNsYXNzQXR0ckxpc3Q6IFtdLFxyXG5cdFx0XHRcdHN1YlBhbmVsTGlzdDogW10sXHJcblx0XHRcdFx0c3ViQ2xhc3NHcmlkU3R5bGU6IFtdLFxyXG5cdFx0XHRcdHBvcHVwVHlwZTogXCJjZW50ZXJcIixcclxuXHRcdFx0XHRjaGVja19saXN0OiB7fSxcclxuXHJcblx0XHRcdFx0Zm9jdXNGaWVsZElkOiBcIlwiLFxyXG5cdFx0XHRcdGZvY3VzT2xkRmllbGRJZDogXCJcIixcclxuXHRcdFx0XHRoZWFkX3N0eWxlZGVmOiB7XHJcblx0XHRcdFx0XHRmb3JtOiB7XHJcblx0XHRcdFx0XHRcdGl0ZW1zOiBbXVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0YWZ0ZXJfb2s6IHt9LFxyXG5cdFx0XHRcdGFjdGl2aXR5OiBudWxsLFxyXG5cdFx0XHRcdHJlY2VpdmVyOiBudWxsLFxyXG5cdFx0XHRcdGludGVudEZpbHRlcjogbnVsbCxcclxuXHRcdFx0XHRjb250ZW50OiAnJ1xyXG5cdFx0XHR9O1xyXG5cdFx0fSxcclxuXHRcdG9uTmF2aWdhdGlvbkJhckJ1dHRvblRhcChlKSB7XHJcblx0XHRcdGlmIChlLmluZGV4ID09IDApIHtcclxuXHRcdFx0XHRjb25zdCAkdGhpcyA9IHRoaXNcclxuXHRcdFx0XHR1bmkuc2NhbkNvZGUoe1xyXG5cdFx0XHRcdFx0c2NhblR5cGU6IFtcInFyQ29kZVwiXSxcclxuXHRcdFx0XHRcdHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCR0aGlzLmZvY3VzRmllbGRJZCkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGl0ZW1zID0gJHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zIHx8IFtdXHJcblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSBpbiBpdGVtcykge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZWxlID0gaXRlbXNbaV1cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChlbGUubmFtZSA9PSAnSW5wdXQnIHx8IGVsZS5uYW1lID09ICdJbnB1dE51bWJlcicgfHwgZWxlLm5hbWUgPT1cclxuXHRcdFx0XHRcdFx0XHRcdFx0J1RleHRhcmVhJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoJHRoaXMuZm9jdXNGaWVsZElkID09IGVsZS5maWVsZElkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMub25TY2FuVmFsdWUoZWxlLCByZXMucmVzdWx0KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGVsZS5uYW1lID09IFwiTGF5b3RcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgY3VySW5kZXggPSAoZWxlLnNldHRpbmcuY29sTGlzdCB8fCBbXSkuZmluZEluZGV4KChjb2wsIGluZGV4MixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhcnIpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKGNvbC5uYW1lID09ICdJbnB1dCcgfHwgY29sLm5hbWUgPT0gJ0lucHV0TnVtYmVyJyB8fCBjb2xcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Lm5hbWUgPT0gJ1RleHRhcmVhJykgJiYgJHRoaXNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5mb2N1c0ZpZWxkSWQgPT0gY29sLmZpZWxkSWQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjdXJJbmRleCA+IC0xKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGNvbCA9IGVsZS5zZXR0aW5nLmNvbExpc3RbY3VySW5kZXhdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMub25TY2FuVmFsdWUoY29sLCByZXMucmVzdWx0KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrXHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0fSBlbHNlIGlmIChlLmluZGV4ID09IDEpIHtcclxuXHRcdFx0XHQvL+WIt+aWsFxyXG5cdFx0XHRcdHVuaS5yZWRpcmVjdFRvKHtcclxuXHRcdFx0XHRcdHVybDogJy4uL21vZGFsLzMwMThfMj9wYXJhbT0nICsgSlNPTi5zdHJpbmdpZnkodGhpcy4kZGF0YS5wYXJhbSkgK1xyXG5cdFx0XHRcdFx0XHRcIiZ0aXRsZW5hbWU9XCIgKyB0aGlzLiRkYXRhLnRpdGxlXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHRvbkxvYWQob3B0aW9ucykge1xyXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhvcHRpb25zKTtcclxuXHRcdFx0dW5pLnNldE5hdmlnYXRpb25CYXJUaXRsZSh7XHJcblx0XHRcdFx0dGl0bGU6IG9wdGlvbnMudGl0bGVuYW1lXHJcblx0XHRcdH0pOyAvL+iuvue9rumhtumDqOagh+mimCBcclxuXHRcdFx0dGhpcy4kZGF0YS5wYXJhbSA9IEpTT04ucGFyc2Uob3B0aW9ucy5wYXJhbSk7XHJcblx0XHRcdHRoaXMuJGRhdGEudGl0bGUgPSB0aGlzLiRkYXRhLnBhcmFtLkFkZF9CdG5OYW1lID8gdGhpcy4kZGF0YS5wYXJhbS5BZGRfQnRuTmFtZSA6IG9wdGlvbnNcclxuXHRcdFx0XHQudGl0bGVuYW1lOyAvL+iuvue9ruaMiemSruaWh+Wtl1xyXG5cdFx0XHR0aGlzLmxvYWREYXRhKG9wdGlvbnMucGFyYW1WYWx1ZSlcclxuXHRcdH0sXHJcblxyXG5cdFx0bWV0aG9kczoge1xyXG5cdFx0XHRzZXREYXRhOiBmdW5jdGlvbihvYmopIHtcclxuXHRcdFx0XHRsZXQgdGhhdCA9IHRoaXM7XHJcblx0XHRcdFx0bGV0IGtleXMgPSBbXTtcclxuXHRcdFx0XHRsZXQgdmFsLCBkYXRhO1xyXG5cclxuXHRcdFx0XHRPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XHJcblx0XHRcdFx0XHRrZXlzID0ga2V5LnNwbGl0KFwiLlwiKTtcclxuXHRcdFx0XHRcdHZhbCA9IG9ialtrZXldO1xyXG5cdFx0XHRcdFx0ZGF0YSA9IHRoYXQuJGRhdGE7XHJcblx0XHRcdFx0XHRrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5MiwgaW5kZXgpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGluZGV4ICsgMSA9PSBrZXlzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdHRoYXQuJHNldChkYXRhLCBrZXkyLCB2YWwpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGlmICghZGF0YVtrZXkyXSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhhdC4kc2V0KGRhdGEsIGtleTIsIHt9KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0ZGF0YSA9IGRhdGFba2V5Ml07XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSxcclxuXHRcdFx0YXN5bmMgbG9hZERhdGEocGFyYW1WYWx1ZSkge1xyXG5cclxuXHRcdFx0XHQvL+iOt+WPluaVsOaNruexu+eahOiHquWumuS5ieihqOWNleWPguaVsFxyXG5cdFx0XHRcdGF3YWl0IHRoaXMuSGVhZF9VSVN0eWxlR2V0SW5mbyh0aGlzLnBhcmFtLkRhdGFDbHM/LmlkLCB0aGlzLnBhcmFtLlVJX1N0eWxlPy5JRCk7XHJcblx0XHRcdFx0Ly/kvKDlhaXlj4LmlbDlgLxcclxuXHRcdFx0XHRpZiAocGFyYW1WYWx1ZSkge1xyXG5cdFx0XHRcdFx0Y29uc3QgYXR0cnMgPSBwYXJhbVZhbHVlLmF0dHJzIHx8IFtdO1xyXG5cdFx0XHRcdFx0KHRoaXMuJGRhdGEuaGVhZF9zdHlsZWRlZj8uZm9ybT8uaXRlbXMgfHwgW10pLmZvckVhY2goYXN5bmMgKGVsZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRcdFx0aWYgKGVsZS5uYW1lICE9IFwiTGF5b3V0XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRhdHRycy5mb3JFYWNoKGFzeW5jIChlbGUyLCBpbmRleDIpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChlbGUuZmllbGRJZCA9PSBlbGUyLm5hbWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxlLnZhbHVlID0gZWxlMi52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRlbGUuc2V0dGluZy5jb2xMaXN0LmZvckVhY2goYXN5bmMgKGNvbCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNvbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhdHRycy5mb3JFYWNoKGFzeW5jIChlbGUyLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGluZGV4MikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb2wuZmllbGRJZCA9PSBlbGUyLm5hbWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC52YWx1ZSA9IGVsZTIudmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuJGRhdGEucGFyYW0pO1xyXG5cclxuXHRcdFx0fSxcclxuXHRcdFx0YXN5bmMgSGVhZF9VSVN0eWxlR2V0SW5mbyhjbGFzc19pZCwgc3R5bGVfaWQpIHsgLy/ojrflj5boh6rlrprkuYnooajljZXmoLflvI9cclxuXHRcdFx0XHR2YXIgJHRoaXMgPSB0aGlzO1xyXG5cdFx0XHRcdHZhciBkYXRhSW5mbyA9IHtcclxuXHRcdFx0XHRcdGNsYXNzX2lkOiBjbGFzc19pZCxcclxuXHRcdFx0XHRcdHVpX3N0eWxlX2lkOiBzdHlsZV9pZCxcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdVSVN0eWxlR2V0SW5mbycsIGRhdGFJbmZvKS50aGVuKHJldCA9PiB7XHJcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhyZXQpO1xyXG5cdFx0XHRcdFx0aWYgKHJldC5lcnJfY29kZSA9PSAwKSB7XHJcblx0XHRcdFx0XHRcdHZhciBzdHlsZWRlZiA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdGlmIChyZXQucmVzdWx0LnN0eWxlX2RlZikge1xyXG5cdFx0XHRcdFx0XHRcdC8vbW9ib3gy55qEc3R5bGVfZGVm5pivanNvbuWtl+espuS4slxyXG5cdFx0XHRcdFx0XHRcdHN0eWxlZGVmID0gcmV0LnJlc3VsdC5zdHlsZV9kZWYucmVwbGFjZSgvXFxcXC9nLCBcIlwiKTtcclxuXHRcdFx0XHRcdFx0XHQvL21vYm94M+eahHN0eWxlX2RlZuaYr2Jhc2U2NOWtl+espuS4slxyXG5cdFx0XHRcdFx0XHRcdGlmICghcmV0LnJlc3VsdC5zdHlsZV9kZWYuaW5jbHVkZXMoJ1wiJykpIHN0eWxlZGVmID0gQmFzZTY0LmRlY29kZShyZXRcclxuXHRcdFx0XHRcdFx0XHRcdC5yZXN1bHRcclxuXHRcdFx0XHRcdFx0XHRcdC5zdHlsZV9kZWYpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdCR0aGlzLiRkYXRhLmhlYWRfc3R5bGVkZWYgPSByZXQucmVzdWx0LnN0eWxlX2RlZiA/IEpTT04ucGFyc2Uoc3R5bGVkZWYpIDoge307XHJcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCR0aGlzLiRkYXRhLmhlYWRfc3R5bGVkZWYpO1xyXG5cdFx0XHRcdFx0XHQkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXMuZm9yRWFjaChhc3luYyAoZWxlLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGVsZS5zaG93ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoZWxlLnVzZURpY3QgPT0gdHJ1ZSkgeyAvL+WIpOaWrXVzZURpY3TmmK/lkKbkvb/nlKjlrZflhbhcclxuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuRGljdEdldEluZm8oZWxlLmJpbmQuZGljdCwgaW5kZXgsICdtYXN0Jyk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdGlmICgkdGhpcy5mb2N1c0ZpZWxkSWQgPT0gXCJcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGVsZS5uYW1lID09ICdJbnB1dCcgfHwgZWxlLm5hbWUgPT0gJ0lucHV0TnVtYmVyJyB8fCBlbGUubmFtZSA9PVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnVGV4dGFyZWEnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLnNldERhdGEoe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvY3VzRmllbGRJZDogZWxlLmZpZWxkSWRcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0aWYgKCR0aGlzLmhlYWRfc3R5bGVkZWYuZXZlbnQ/Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0XHQkdGhpcy5oZWFkX3N0eWxlZGVmLmV2ZW50LmZvckVhY2goYXN5bmMgKGEpID0+IHsgLy/liKTmlq3mmK/lkKbmmK/liJ3lp4vljJbkuovku7ZcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChhLmV2ZW50X2lkID09IFwiaW5pdGlhbFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0ICR0aGlzLmxvYWRJbml0RXZlbnQoYS5zY3JpcF9pZCk7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGEuZXZlbnRfaWQgPT0gJ2FmdGVyX29rJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5hZnRlcl9vayA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZDogYS5zY3JpcF9pZCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRuYW1lOiBhLnNjcmlwX25hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcImVycm9yXCIpICsgXCIxXCIsXHJcblx0XHRcdFx0XHRcdFx0Y29udGVudDogcmV0LmVycl9tc2csXHJcblx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pLmNhdGNoKGV4ID0+IHtcclxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKGV4KTtcclxuXHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJlcnJvclwiKSArIFwiMS4xXCIsXHJcblx0XHRcdFx0XHRcdGNvbnRlbnQ6IGV4LmVyck1zZyxcclxuXHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHR9LFxyXG5cdFx0XHRhc3luYyBEaWN0R2V0SW5mbyhkaWN0LCBpbmRleCwgdHlwZSkgeyAvL01vYm94M+W+l+WIsOW+l+WIsOWtl+WFuOS/oeaBr+Wtl+WFuOmhueWIl+ihqFxyXG5cdFx0XHRcdHRoaXMuZGF0YSA9IFtdO1xyXG5cdFx0XHRcdHZhciAkdGhpcyA9IHRoaXM7XHJcblx0XHRcdFx0dmFyIGRhdGFJbmZvID0ge1xyXG5cdFx0XHRcdFx0ZGljdF9pZDogZGljdC5pZCxcclxuXHRcdFx0XHRcdGRpY3RfbmFtZTogZGljdC5uYW1lXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhkYXRhSW5mbyk7XHJcblx0XHRcdFx0dGhpcy4kc3RvcmUuZGlzcGF0Y2goJ0RpY3RHZXRJbmZvJywgZGF0YUluZm8pLnRoZW4oYXN5bmMgKHN1Y2Nlc3MpID0+IHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKHN1Y2Nlc3MpO1xyXG5cdFx0XHRcdFx0aWYgKHN1Y2Nlc3MuZXJyX2NvZGUgPT0gMCkge1xyXG5cdFx0XHRcdFx0XHRpZiAodHlwZSA9PSAnbWFzdCcpIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgbGlzdCA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdHZhciBpdGVtTmFtZSA9ICcnO1xyXG5cdFx0XHRcdFx0XHRcdHN1Y2Nlc3MucmVzdWx0LmRpY3RfaXRlbV9saXN0LmZvckVhY2goKGl0ZW0pID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChpdGVtLmlzX2RlZmF1bHQgPT0gJzEnKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpdGVtTmFtZSA9IGl0ZW0ubmFtZTtcclxuXHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRleHQ6IGl0ZW0udmFsdWUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBpdGVtLm5hbWUsXHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHQvL+aciem7mOiupOWAvO+8jOaYvuekuum7mOiupOWAvFxyXG5cdFx0XHRcdFx0XHRcdGlmIChpdGVtTmFtZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zW2luZGV4XS52YWx1ZSA9IGl0ZW1OYW1lO1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIGF0dHIgPSAkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXNbaW5kZXhdLmZpZWxkSWQ7XHJcblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWxbYXR0cl0gPSBpdGVtTmFtZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zW2luZGV4XS5kaWN0ID0gbGlzdDtcclxuXHRcdFx0XHRcdFx0XHQvLyAkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXNbaW5kZXhdLmRpY3RpdGVtPXN1Y2Nlc3MucmVzdWx0O1xyXG5cdFx0XHRcdFx0XHRcdC8vIHRoaXMuJHN0b3JlLmNvbW1pdChcImNsYXNzQXR0ckxpc3RcIiwgJHRoaXMuJGRhdGEuY2xhc3NBdHRyTGlzdCk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gJHRoaXMuJGRhdGEuc3ViQ2xhc3NBdHRyTGlzdFtpbmRleF0uYXR0cl9saXN0W2tleV0uZGljdGl0ZW09c3VjY2Vzcy5yZXN1bHQ7XHJcblx0XHRcdFx0XHRcdFx0Ly8gdGhpcy4kc3RvcmUuY29tbWl0KFwic3ViQ2xhc3NBdHRyTGlzdFwiLCAkdGhpcy4kZGF0YS5zdWJDbGFzc0F0dHJMaXN0KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcImVycm9yXCIpICsgXCIxLjJcIixcclxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBzdWNjZXNzLmVycl9tc2csXHJcblx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pLmNhdGNoKGV4ID0+IHtcclxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKGV4KTtcclxuXHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJlcnJvclwiKSArIFwiMS4zXCIsXHJcblx0XHRcdFx0XHRcdGNvbnRlbnQ6IGV4LmVyck1zZyxcclxuXHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0sXHJcblx0XHRcdGFzeW5jIGxvYWRJbml0RXZlbnQoZXZlbnRpZCkge1xyXG5cdFx0XHRcdHZhciAkdGhpcyA9IHRoaXM7XHJcblx0XHRcdFx0aWYgKCFldmVudGlkLmluY2x1ZGVzKCd7JykpIGV2ZW50aWQgPSAneycgKyBldmVudGlkICsgJ30nO1xyXG5cdFx0XHRcdHZhciBkYXRhSW5mbyA9IHtcclxuXHRcdFx0XHRcdGVkX3R5cGU6IDAsXHJcblx0XHRcdFx0XHRzdGFydF90cmFuc2FjdGlvbjogdHJ1ZSxcclxuXHRcdFx0XHRcdGNsYXNzX2lkOiB0aGlzLnBhcmFtLkRhdGFDbHMuaWQsXHJcblx0XHRcdFx0XHRldmVudF9pZDogZXZlbnRpZCxcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKGRhdGFJbmZvKTtcclxuXHRcdFx0XHQvLyByZXR1cm47XHJcblx0XHRcdFx0dGhpcy4kc3RvcmUuZGlzcGF0Y2goJ3J1bkN1c3RvbUV2ZW50JywgZGF0YUluZm8pLnRoZW4oc3VjY2VzcyA9PiB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhzdWNjZXNzKTtcclxuXHRcdFx0XHRcdGlmIChzdWNjZXNzLmVycl9jb2RlID09IDApIHtcclxuXHRcdFx0XHRcdFx0dmFyIGRhdGEgPSBzdWNjZXNzLnJlc3VsdDtcclxuXHRcdFx0XHRcdFx0aWYgKGRhdGEucmV0ICE9IDApIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgdGlwID0gZGF0YS5lcnJfaW5mbyA/IHR5cGVvZiBkYXRhLmVycl9pbmZvID09ICdzdHJpbmcnID8gZGF0YVxyXG5cdFx0XHRcdFx0XHRcdFx0LmVycl9pbmZvIDogZGF0YVxyXG5cdFx0XHRcdFx0XHRcdFx0LmVycl9pbmZvLmpvaW4oJzxici8+JykgOiAnJztcclxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0YS5yZXQgPT0gODAxKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5wYXJhbS5Pbmx5X1NjcmlwdF9FcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgcG9zID0gdGlwLmluZGV4T2YoXCLvvJpcIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChwb3MgPiAtMSkgdGlwID0gdGlwLnN1YnN0cmluZyhwb3MgKyAxKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRpcCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudDogdGlwICsgJywnICsgdGhpcy50cmFuc2xhdGVTeXMoJ3RpcCcpICsgJzonICsgZGF0YS5yZXQsXHJcblx0XHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHZhciB0aXAgPSBkYXRhLmluZm8gPyB0eXBlb2YgZGF0YS5pbmZvID09ICdzdHJpbmcnID8gZGF0YS5pbmZvIDogZGF0YS5pbmZvXHJcblx0XHRcdFx0XHRcdFx0XHQuam9pbihcclxuXHRcdFx0XHRcdFx0XHRcdFx0Jzxici8+JykgOiAnJztcclxuXHRcdFx0XHRcdFx0XHRpZiAodGlwKSB1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRpcCxcclxuXHRcdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHZhciBhY3Rpb25saXN0ID0gZGF0YS5hY3Rpb247XHJcblx0XHRcdFx0XHRcdFx0aWYgKGFjdGlvbmxpc3QpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGFjdGlvbmxpc3QpO1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhY3Rpb25saXN0Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25saXN0W2ldO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYWN0aW9uLmFjdGlvbl90eXBlID09ICdzZXRfZGxnX2F0dHInKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIHJlc3VsdCA9IGFjdGlvbi52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJlc3VsdFtpXS5jaG9pY2VfbGlzdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBjID0gMDsgYyA8ICR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5pdGVtc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5sZW5ndGg7IGMrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBhdHRyID0gJHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zW2NdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhdHRyLm5hbWUgIT0gJ0xheW91dCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhdHRyLmZpZWxkSWQgPT0gcmVzdWx0W2ldLmF0dHIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGRpY3RJdGVtTGlzdCA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBkIGluIHJlc3VsdFtpXS5jaG9pY2VfbGlzdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciB2YWwgPSByZXN1bHRbaV0uY2hvaWNlX2xpc3RbZF07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGljdEl0ZW1MaXN0LnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDTl9TX05BTUVcIjogdmFsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDTl9TX1ZBTFVFXCI6IHZhbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwidGV4dFwiOiB2YWwsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInZhbHVlXCI6IHZhbFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIuZGljdCA9IGRpY3RJdGVtTGlzdDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGF0dHIubmFtZSA9PSAnTGF5b3V0Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXR0ci5zZXR0aW5nLmNvbExpc3QuZm9yRWFjaChjb2wgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29sKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbC5maWVsZElkID09IHJlc3VsdFtpXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmF0dHIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBkaWN0SXRlbUxpc3QgPSBbXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAodmFyIGQgaW4gcmVzdWx0W2ldXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNob2ljZV9saXN0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciB2YWwgPSByZXN1bHRbaV1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuY2hvaWNlX2xpc3RbZF07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRpY3RJdGVtTGlzdC5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNOX1NfTkFNRVwiOiB2YWwsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDTl9TX1ZBTFVFXCI6IHZhbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogdmFsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwidmFsdWVcIjogdmFsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sLmRpY3QgPSBkaWN0SXRlbUxpc3Q7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBjID0gMDsgYyA8ICR0aGlzLiRkYXRhLmhlYWRfc3R5bGVkZWYuZm9ybS5pdGVtc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQubGVuZ3RoOyBjKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGF0dHIgPSAkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXNbY107XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKGF0dHJbal0uTmFtZSsnPT0nK3Jlc3VsdFtpXS5hdHRyKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly/liKTmlq3ooajljZXph4zmmK/lkKbmnInov5Tlm57lrZfmrrXvvIzmsqHmnInlsLHoo4Xovb3liLBtb2RlbOmHjO+8jOeCueWHu+ehruWumuaPkOS6pOeahOaXtuWAmeW4puS4iui/meS6m+aVsOaNrlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoJHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW3Jlc3VsdFtpXS5hdHRyXSA9PVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5tb2RlbFtyZXN1bHRbaV0uYXR0cl0gPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0W2ldXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly/liKTmlq3mmK/lkKbmmK/moIXmoLzooajljZVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGF0dHIubmFtZSAhPSAnTGF5b3V0Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhdHRyLmZpZWxkSWQgPT0gcmVzdWx0W2ldLmF0dHIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIudmFsdWUgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIub2xkdmFsdWUgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIudmFsdWUgPSByZXN1bHRbaV0udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLm9sZHZhbHVlID0gcmVzdWx0W2ldLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW2F0dHIuZmllbGRJZF0gPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHRbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aV0udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGF0dHIubmFtZSA9PSAnTGF5b3V0Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIuc2V0dGluZy5jb2xMaXN0LmZvckVhY2goY29sID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb2wpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbC5maWVsZElkID09IHJlc3VsdFtpXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sLnZhbHVlID0gJyc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sLm9sZHZhbHVlID0gJyc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sLnZhbHVlID0gcmVzdWx0W2ldLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC5vbGR2YWx1ZSA9IHJlc3VsdFtpXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWxbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZmllbGRJZF0gPSByZXN1bHRbaV1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgbGVuZ3RoID0gMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghJHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlLmZpbHRlcihmdW5jdGlvbihzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdFtpXS5hdHRyID09IHMuYXR0clxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGVuZ3RoID0gMTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlLnB1c2gocmVzdWx0W2ldKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChsZW5ndGggPT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8ICR0aGlzLiRkYXRhLnJlZmRhdGFzdG9yZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICgkdGhpcy4kZGF0YS5yZWZkYXRhc3RvcmVbal0uYXR0ciA9PSByZXN1bHRbaV1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy4kZGF0YS5yZWZkYXRhc3RvcmVbal0udmFsdWUgPSByZXN1bHRbaV1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChkYXRhLmFjdGlvbltpXS5hY3Rpb25fdHlwZSA9PSAnc2V0X2RsZ19hdHRyX3Nob3cnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIHJlc3VsdCA9IGFjdGlvbi52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHQuZm9yRWFjaChhc3luYyAoYXR0ciwga2V5KSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXMuZm9yRWFjaChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXN5bmMgKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL+WIpOaWreaYr+WQpuaYr+agheagvOihqOWNlVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbGUubmFtZSAhPSAnTGF5b3V0Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVsZS5maWVsZElkID09IGF0dHJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmF0dHIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWxlLnNob3cgPSBhdHRyLnNob3c7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChlbGUubmFtZSA9PVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J0xheW91dCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsZS5zZXR0aW5nLmNvbExpc3RcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmZvckVhY2goXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb2wpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5maWVsZElkID09XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXR0clxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5hdHRyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC5zaG93ID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5zaG93O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgaGVhZF9zdHlsZWRlZiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoJHRoaXMuJGRhdGFcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5oZWFkX3N0eWxlZGVmKSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJGRhdGEuaGVhZF9zdHlsZWRlZiA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLiRkYXRhLmhlYWRfc3R5bGVkZWYgPSBoZWFkX3N0eWxlZGVmO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCR0aGlzLiRkYXRhLmhlYWRfc3R5bGVkZWYpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudDogdGhpcy50cmFuc2xhdGUoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2V4ZWN1dGVfaW5pdF9ldmVudF9mYWlsZWQnKSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNsYXRlU3lzKFwiZnVsbF9zdG9wXCIpICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2xhdGUoJ3JlYXNvbicpICsgdGhpcy50cmFuc2xhdGVTeXMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJjb2xvblwiKSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNsYXRlU3lzKFwicXVvdGF0aW9uX21hcmtfbGVmdFwiKSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGlvblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuYWN0aW9uX3R5cGUgKyB0aGlzLnRyYW5zbGF0ZVN5cyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInF1b3RhdGlvbl9tYXJrX3JpZ2h0XCIpICsgdGhpc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudHJhbnNsYXRlKCd0aXBfYWN0aW9uX3VucHJvY2Vzc2VkJyksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJlcnJvclwiKSArIFwiM1wiLFxyXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlKCdleGVjdXRlX2luaXRfZXZlbnRfZmFpbGVkJykgK1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2xhdGVTeXMoXCJmdWxsX3N0b3BcIikgK1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2xhdGUoJ3JlYXNvbicpICsgdGhpcy50cmFuc2xhdGVTeXMoXCJjb2xvblwiKSArIHN1Y2Nlc3NcclxuXHRcdFx0XHRcdFx0XHRcdC5lcnJfbXNnLFxyXG5cdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KS5jYXRjaChleCA9PiB7XHJcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhleCk7XHJcblx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwiZXJyb3JcIikgKyBcIjMuMVwiLFxyXG5cdFx0XHRcdFx0XHRjb250ZW50OiB0aGlzLnRyYW5zbGF0ZSgnZXhlY3V0ZV9pbml0X2V2ZW50X2ZhaWxlZCcpICtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zbGF0ZVN5cyhcImZ1bGxfc3RvcFwiKSArXHJcblx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2xhdGUoJ3JlYXNvbicpICsgdGhpcy50cmFuc2xhdGVTeXMoXCJjb2xvblwiKSArIGV4LmVyck1zZyxcclxuXHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0sXHJcblxyXG5cclxuXHRcdFx0b250YXAoaXRlbSkgeyAvL+aJq+eggeWKn+iDvVxyXG5cdFx0XHRcdC8vIOaJk+W8gOiTneeJmemAgumFjeWZqFxyXG5cdFx0XHRcdC8vIHVuaS5vcGVuQmx1ZXRvb3RoQWRhcHRlcih7XHJcblx0XHRcdFx0Ly8gICBzdWNjZXNzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHQvLyBcdC8vIOW8gOWni+aQnOe0ouiTneeJmeiuvuWkh1xyXG5cdFx0XHRcdC8vIFx0dW5pLnN0YXJ0Qmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeSh7XHJcblx0XHRcdFx0Ly8gXHQgIHN1Y2Nlc3M6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdC8vIFx0XHQvLyDnm5HlkKzmib7liLDmlrDorr7lpIfnmoTkuovku7ZcclxuXHRcdFx0XHQvLyBcdFx0dW5pLm9uQmx1ZXRvb3RoRGV2aWNlRm91bmQoZnVuY3Rpb24oZGV2aWNlcykge1xyXG5cdFx0XHRcdC8vIFx0XHQgIC8vIOi/memHjOWPr+S7pei/h+a7pOWHulJGSUToiq/niYfvvIzov57mjqXlubbor7vlj5bmlbDmja5cclxuXHRcdFx0XHQvLyBcdFx0ICBjb25zb2xlLmxvZyhkZXZpY2VzWzBdLmRldmljZUlkKTtcclxuXHRcdFx0XHQvLyBcdFx0fSlcclxuXHRcdFx0XHQvLyBcdCAgfVxyXG5cdFx0XHRcdC8vIFx0fSlcclxuXHRcdFx0XHQvLyAgIH1cclxuXHRcdFx0XHQvLyB9KTtcclxuXHRcdFx0XHQvLyDnm5HlkKxORkPlip/og73mmK/lkKblj6/nlKhcclxuXHRcdFx0XHQvLyB1bmkuZ2V0TkZDQWRhcHRlclN0YXRlKHtcclxuXHRcdFx0XHQvLyAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykge1xyXG5cdFx0XHRcdC8vIFx0Y29uc29sZS5sb2cocmVzKTtcclxuXHRcdFx0XHQvLyAgICAgaWYgKHJlcy5lcnJDb2RlID09PSAwKSB7XHJcblx0XHRcdFx0Ly8gICAgICAgLy8gTkZD5Yqf6IO95Y+v55So77yM5byA5aeL55uR5ZCsXHJcblx0XHRcdFx0Ly8gICAgICAgdW5pLm9uTkZDU3RhcnQoKHJlcykgPT4ge1xyXG5cdFx0XHRcdC8vICAgICAgICAgaWYgKHJlcy5lcnJDb2RlID09PSAwKSB7XHJcblx0XHRcdFx0Ly8gICAgICAgICAgIC8vIOW8gOWni05GQ+agh+etvuajgOa1i1xyXG5cdFx0XHRcdC8vICAgICAgICAgICB1bmkubWFrZU5GQ1JlYWRlclN0YXJ0KHtcclxuXHRcdFx0XHQvLyAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHQvLyAgICAgICAgICAgICAgIC8vIOebkeWQrE5GQ+agh+etvlxyXG5cdFx0XHRcdC8vICAgICAgICAgICAgICAgdW5pLm9uTkZDVGFnRGlzY292ZXJlZChmdW5jdGlvbihyZXMpIHtcclxuXHRcdFx0XHQvLyBcdFx0XHRcdFx0XHRcdFx0XHRcdCAgY29uc29sZS5sb2cocmVzKTtcclxuXHRcdFx0XHQvLyAgICAgICAgICAgICAgICAgLy8g6L+Z6YeM5Y+v5Lul5aSE55CGTkZD5qCH562+5pWw5o2uXHJcblx0XHRcdFx0Ly8gICAgICAgICAgICAgICB9KVxyXG5cdFx0XHRcdC8vICAgICAgICAgICAgIH1cclxuXHRcdFx0XHQvLyAgICAgICAgICAgfSlcclxuXHRcdFx0XHQvLyAgICAgICAgIH1cclxuXHRcdFx0XHQvLyAgICAgICB9KVxyXG5cdFx0XHRcdC8vICAgICB9XHJcblx0XHRcdFx0Ly8gICB9XHJcblx0XHRcdFx0Ly8gfSlcclxuXHRcdFx0XHR0aGlzLmZvY3VzT2xkRmllbGRJZCA9IGl0ZW0uZmllbGRJZFxyXG5cdFx0XHRcdGdldEFwcCgpLm9uU2NhbigocmVzdWx0KSA9PiB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhyZXN1bHQpO1xyXG5cdFx0XHRcdFx0Ly8gdW5pLmhpZGVLZXlib2FyZCgpO1xyXG5cdFx0XHRcdFx0dGhpcy5vblNjYW5WYWx1ZShpdGVtLCByZXN1bHQuZGVjb2RlZGF0YSlcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRvblNjYW5WYWx1ZShpdGVtLCB2YWx1ZSkge1xyXG5cdFx0XHRcdGNvbnN0ICR0aGlzID0gdGhpcztcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhcIm9uU2NhblZhbHVlXCIsIGl0ZW0pO1xyXG5cdFx0XHRcdGlmIChpdGVtLm9sZHZhbHVlICE9IHZhbHVlKSB7XHJcblx0XHRcdFx0XHRpdGVtLm9sZHZhbHVlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRpdGVtLnZhbHVlID0gdmFsdWU7XHJcblx0XHRcdFx0XHR2YXIgYXR0ciA9IHZhbHVlXHJcblx0XHRcdFx0XHQkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWxbYXR0cl0gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGlmIChpdGVtLnZhbHVlKSB7IC8v56ys5LiA5Liq6L6T5YWl5qGG5LiN5Li656m6XHJcblx0XHRcdFx0XHRcdC8v5Yid5aeL5YyW77yM5LiL5Liq6L6T5YWl5qGGZm9jdXPlsZ7mgKdcclxuXHRcdFx0XHRcdFx0dmFyIGZpbmRkID0gZmFsc2VcclxuXHRcdFx0XHRcdFx0Y29uc3QgaXRlbXMgPSAkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXMgfHwgW11cclxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSBpbiBpdGVtcykge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGVsZSA9IGl0ZW1zW2ldXHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChlbGUubmFtZSAhPSBcIkxheW91dFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZWxlLm5hbWUgPT0gJ0lucHV0JyB8fCBlbGUubmFtZSA9PSAnSW5wdXROdW1iZXInIHx8IGVsZS5uYW1lID09ICdUZXh0YXJlYScpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGF0dHIgPT0gZWxlLmZpZWxkSWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaW5kZCA9IHRydWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZmluZGQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLnNldERhdGEoe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb2N1c0ZpZWxkSWQ6IGVsZS5maWVsZElkXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZmluZGQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGN1ckluZGV4ID0gZWxlLnNldHRpbmcuY29sTGlzdC5maW5kSW5kZXgoKGNvbCwgaW5kZXgyLCBhcnIpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKGNvbC5uYW1lID09ICdJbnB1dCcgfHwgY29sLm5hbWUgPT0gJ0lucHV0TnVtYmVyJyB8fCBjb2wubmFtZSA9PVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J1RleHRhcmVhJyk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjdXJJbmRleCA+IC0xKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuc2V0RGF0YSh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb2N1c0ZpZWxkSWQ6IGVsZS5zZXR0aW5nLmNvbExpc3RbY3VySW5kZXhdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5maWVsZElkXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVha1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGN1ckluZGV4ID0gZWxlLnNldHRpbmcuY29sTGlzdC5maW5kSW5kZXgoKGNvbCwgaW5kZXgyLCBhcnIpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYXR0ciA9PSBjb2wuZmllbGRJZDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGN1ckluZGV4ID4gLTEpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaW5kZCA9IHRydWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgY3VySW5kZXgyID0gZWxlLnNldHRpbmcuY29sTGlzdC5maW5kSW5kZXgoKGNvbCwgaW5kZXgyLCBhcnIpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAoY29sLm5hbWUgPT0gJ0lucHV0JyB8fCBjb2wubmFtZSA9PVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdJbnB1dE51bWJlcicgfHwgY29sLm5hbWUgPT0gJ1RleHRhcmVhJykgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5kZXgyID5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y3VySW5kZXg7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY3VySW5kZXgyID4gLTEpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLnNldERhdGEoe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb2N1c0ZpZWxkSWQ6IGVsZS5zZXR0aW5nLmNvbExpc3RbY3VySW5kZXhdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmZpZWxkSWRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVha1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR2YXIgZXZlbnRpZCA9IGl0ZW0uYmluZC5vbkNoYW5nZUV2ZW50LmlkOyAvL+WGheWuueWPmOWMluWQjuS6i+S7tlxyXG5cdFx0XHRcdFx0aWYgKGV2ZW50aWQpIHtcclxuXHRcdFx0XHRcdFx0dmFyIG9ial9hdHRyID0gdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWw7XHJcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKG9ial9hdHRyKTtcclxuXHRcdFx0XHRcdFx0dmFyIHJlcSA9IE9iamVjdC5rZXlzKG9ial9hdHRyKS5tYXAoKGEpID0+ICh7XHJcblx0XHRcdFx0XHRcdFx0YXR0cjogYSxcclxuXHRcdFx0XHRcdFx0XHR2YWw6IG9ial9hdHRyW2FdIHx8IFwiXCIsXHJcblx0XHRcdFx0XHRcdH0pKTtcclxuXHJcblx0XHRcdFx0XHRcdHZhciBpbmZvID0ge1xyXG5cdFx0XHRcdFx0XHRcdGV2ZW50aWQ6IGV2ZW50aWQsXHJcblx0XHRcdFx0XHRcdFx0ZWR0eXBlOiBcIjBcIixcclxuXHRcdFx0XHRcdFx0XHRwcm9qZWN0aWQ6ICcnLFxyXG5cdFx0XHRcdFx0XHRcdHJjbHNpZDogJycsXHJcblx0XHRcdFx0XHRcdFx0cm9iamlkOiAnJyxcclxuXHRcdFx0XHRcdFx0XHR1c2VybG9naW46ICcnLFxyXG5cdFx0XHRcdFx0XHRcdGNsc2lkOiB0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHMuaWQsXHJcblx0XHRcdFx0XHRcdFx0b2JqaWQ6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0YXR0cjogcmVxLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGFKc29uOiBbXSxcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR0aGlzLkRhdGFPYmpSdW5DdXN0b21FdmVudChpbmZvLCAnJyk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRvbkNsaWNrKGl0ZW0pIHtcclxuXHRcdFx0XHR0aGlzLmZvY3VzRmllbGRJZCA9IGl0ZW0uZmllbGRJZFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRvbmV2ZW50KGl0ZW0pIHtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhlLnRhcmdldCk7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coaXRlbSk7XHJcblx0XHRcdFx0aWYgKGl0ZW0ub2xkdmFsdWUgIT0gaXRlbS52YWx1ZSkge1xyXG5cdFx0XHRcdFx0aXRlbS5vbGR2YWx1ZSA9IGl0ZW0udmFsdWU7XHJcblx0XHRcdFx0XHR2YXIgYXR0ciA9IGl0ZW0uZmllbGRJZDtcclxuXHRcdFx0XHRcdHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW2F0dHJdID0gaXRlbS52YWx1ZTtcclxuXHRcdFx0XHRcdC8v5a2Q5pWw5o2u57G75omr56CB5Yy65LqL5Lu26ISa5pysXHJcblx0XHRcdFx0XHR2YXIgZXZlbnRpZCA9IGl0ZW0uYmluZC5vbkNoYW5nZUV2ZW50LmlkOyAvL+WGheWuueWPmOWMluWQjuS6i+S7tlxyXG5cdFx0XHRcdFx0aWYgKGV2ZW50aWQpIHtcclxuXHRcdFx0XHRcdFx0dmFyIG9ial9hdHRyID0gdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWw7XHJcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKG9ial9hdHRyKTtcclxuXHRcdFx0XHRcdFx0dmFyIHJlcSA9IE9iamVjdC5rZXlzKG9ial9hdHRyKS5tYXAoKGEpID0+ICh7XHJcblx0XHRcdFx0XHRcdFx0YXR0cjogYSxcclxuXHRcdFx0XHRcdFx0XHR2YWw6IG9ial9hdHRyW2FdIHx8IFwiXCIsXHJcblx0XHRcdFx0XHRcdH0pKTtcclxuXHRcdFx0XHRcdFx0dmFyIGluZm8gPSB7XHJcblx0XHRcdFx0XHRcdFx0ZXZlbnRpZDogZXZlbnRpZCxcclxuXHRcdFx0XHRcdFx0XHRlZHR5cGU6IFwiMFwiLFxyXG5cdFx0XHRcdFx0XHRcdHByb2plY3RpZDogJycsXHJcblx0XHRcdFx0XHRcdFx0cmNsc2lkOiAnJyxcclxuXHRcdFx0XHRcdFx0XHRyb2JqaWQ6ICcnLFxyXG5cdFx0XHRcdFx0XHRcdHVzZXJsb2dpbjogJycsXHJcblx0XHRcdFx0XHRcdFx0Y2xzaWQ6IHRoaXMuJGRhdGEucGFyYW0uRGF0YUNscy5pZCxcclxuXHRcdFx0XHRcdFx0XHRvYmppZDogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRhdHRyOiByZXEsXHJcblx0XHRcdFx0XHRcdFx0ZGF0YUpzb246IFtdLFxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHRoaXMuRGF0YU9ialJ1bkN1c3RvbUV2ZW50KGluZm8sIFwiXCIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblx0XHRcdG9uY2hhbmdlKGl0ZW0pIHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhpdGVtKTtcclxuXHRcdFx0XHRpZiAoaXRlbS5vbGR2YWx1ZSAhPSBpdGVtLnZhbHVlKSB7XHJcblx0XHRcdFx0XHRpdGVtLm9sZHZhbHVlID0gaXRlbS52YWx1ZTtcclxuXHRcdFx0XHRcdHZhciBhdHRyID0gaXRlbS5maWVsZElkO1xyXG5cdFx0XHRcdFx0dGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWxbYXR0cl0gPSBpdGVtLnZhbHVlO1xyXG5cdFx0XHRcdFx0dmFyIGV2ZW50aWQgPSBpdGVtLmJpbmQub25DaGFuZ2VFdmVudC5pZDsgLy/lhoXlrrnlj5jljJblkI7kuovku7ZcclxuXHRcdFx0XHRcdGlmIChldmVudGlkKSB7XHJcblx0XHRcdFx0XHRcdC8vIHNlbGYuZXZlbnRfbm9fc3ViID0gMTtcclxuXHRcdFx0XHRcdFx0dmFyIG9ial9hdHRyID0gdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWw7XHJcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKG9ial9hdHRyKTtcclxuXHRcdFx0XHRcdFx0dmFyIHJlcSA9IE9iamVjdC5rZXlzKG9ial9hdHRyKS5tYXAoKGEpID0+ICh7XHJcblx0XHRcdFx0XHRcdFx0YXR0cjogYSxcclxuXHRcdFx0XHRcdFx0XHR2YWw6IG9ial9hdHRyW2FdIHx8IFwiXCIsXHJcblx0XHRcdFx0XHRcdH0pKTtcclxuXHRcdFx0XHRcdFx0dmFyIGluZm8gPSB7XHJcblx0XHRcdFx0XHRcdFx0ZXZlbnRpZDogZXZlbnRpZCxcclxuXHRcdFx0XHRcdFx0XHRlZHR5cGU6IFwiMFwiLFxyXG5cdFx0XHRcdFx0XHRcdHByb2plY3RpZDogJycsXHJcblx0XHRcdFx0XHRcdFx0cmNsc2lkOiAnJyxcclxuXHRcdFx0XHRcdFx0XHRyb2JqaWQ6ICcnLFxyXG5cdFx0XHRcdFx0XHRcdHVzZXJsb2dpbjogJycsXHJcblx0XHRcdFx0XHRcdFx0Y2xzaWQ6IHRoaXMuJGRhdGEucGFyYW0uRGF0YUNscy5pZCxcclxuXHRcdFx0XHRcdFx0XHRvYmppZDogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRhdHRyOiByZXEsXHJcblx0XHRcdFx0XHRcdFx0ZGF0YUpzb246IFtdXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0dGhpcy5EYXRhT2JqUnVuQ3VzdG9tRXZlbnQoaW5mbyk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHRcdFx0b25Nb2RlbFZhbHVlKGl0ZW0pIHsgLy/nu5HlrppNb2RlbOWAvFxyXG5cdFx0XHRcdHZhciBhdHRyID0gaXRlbS5maWVsZElkO1xyXG5cdFx0XHRcdHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW2F0dHJdID0gaXRlbS52YWx1ZTtcclxuXHRcdFx0fSxcclxuXHRcdFx0Y2xhc3NBdHRyX2V4dEJ1dHRvbihpdGVtKSB7XHJcblx0XHRcdFx0dmFyIG9uU3VmZml4Q2xpY2tDYWxsYmFja0V2ZW50ID0gaXRlbS5iaW5kLm9uU3VmZml4Q2xpY2tDYWxsYmFja0V2ZW50OyAvL+WQjuWbvuagh+eCueWHu+S6i+S7tlxyXG5cdFx0XHRcdHZhciBvblN1ZmZpeENsaWNrRXZlbnQgPSBpdGVtLmJpbmQub25TdWZmaXhDbGlja0V2ZW50OyAvL+WQjuWbvuagh+eCueWHu+Wbnuiwg1xyXG5cclxuXHRcdFx0XHRpZiAoIW9uU3VmZml4Q2xpY2tDYWxsYmFja0V2ZW50LmlkKSB7XHJcblx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRjb250ZW50OiB0aGlzLnRyYW5zbGF0ZSgnaWNvbl9jbGlja19ldmVudF9lbXB0eScpLFxyXG5cdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKCFvblN1ZmZpeENsaWNrRXZlbnQuaWQpIHtcclxuXHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlKCdpY29uX2NsaWNrX2V2ZW50X2VtcHR5JyksXHJcblx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLiRkYXRhLnBvcHVwVHlwZSA9ICdyaWdodCdcclxuXHRcdFx0XHQvLyBvcGVuIOaWueazleS8oOWFpeWPguaVsCDnrYnlkIzlnKggdW5pLXBvcHVwIOe7hOS7tuS4iue7keWumiB0eXBl5bGe5oCnXHJcblx0XHRcdFx0dGhpcy4kcmVmcy5wb3B1cC5vcGVuKCR0aGlzLnBvcHVwVHlwZSk7XHJcblxyXG5cdFx0XHRcdHRoaXMuRGF0YU9ialJ1bkN1c3RvbUV2ZW50X1JldHVybihvblN1ZmZpeENsaWNrQ2FsbGJhY2tFdmVudC5pZCwgJycsIG9uU3VmZml4Q2xpY2tFdmVudC5pZCwgaXRlbSk7XHJcblx0XHRcdH0sXHJcblx0XHRcdHBvcHVwQ2hhbmdlKGUpIHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygn5b2T5YmN5qih5byP77yaJyArIGUudHlwZSArICcs54q25oCB77yaJyArIGUuc2hvdyk7XHJcblx0XHRcdH0sXHJcblx0XHRcdGNoZWNrQ2hhbmdlKGUpIHsgLy/lvLnmoYZjaGVja+mAieaLqVxyXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKGUudGFyZ2V0LmRhdGFzZXQpO1xyXG5cdFx0XHRcdHZhciBpbmRleCA9IGUudGFyZ2V0LmRhdGFzZXQuaW5kZXg7XHJcblx0XHRcdFx0dmFyIGlzY2hlY2sgPSBlLnRhcmdldC5kYXRhc2V0LmlzY2hlY2s7XHJcblx0XHRcdFx0dmFyIGRhdGEgPSB0aGlzLiRkYXRhLmNoZWNrX2xpc3QuaXRlbXM7XHJcblx0XHRcdFx0Ly8gdGhpcy4kZGF0YS5jaGVja19saXN0Lml0ZW1zPVtdO1xyXG5cdFx0XHRcdGlmICh0aGlzLiRkYXRhLmNoZWNrX2xpc3QubXVsdGlwbGVfY2hvaWNlID09IFwiMFwiKSB7IC8v5Yik5pat5pe25Y2V6YCJ6L+Y5piv5aSa6YCJXHJcblx0XHRcdFx0XHRmb3IgKHZhciBpIGluIGRhdGEpIHtcclxuXHRcdFx0XHRcdFx0ZGF0YVtpXS5jaGVjayA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRkYXRhW2luZGV4XS5jaGVjayA9IGlzY2hlY2sgPyBmYWxzZSA6IHRydWU7XHJcblx0XHRcdFx0dGhpcy4kZGF0YS5jaGVja19saXN0Lml0ZW1zID0gZGF0YTtcclxuXHJcblx0XHRcdH0sXHJcblx0XHRcdHBvcHVwX2NhbmNlbChlKSB7IC8v5by55qGG5Y+W5raIXHJcblx0XHRcdFx0dGhpcy4kcmVmcy5wb3B1cC5jbG9zZSgpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRwb3B1cF9zYXZhKGUpIHsgLy/lvLnmoYbnoa7lrppcclxuXHRcdFx0XHR2YXIgJHRoaXMgPSB0aGlzO1xyXG5cdFx0XHRcdHZhciBpdGVtcyA9ICR0aGlzLiRkYXRhLmNoZWNrX2xpc3QuaXRlbXM7XHJcblx0XHRcdFx0dmFyIGRhdGEgPSBbXTtcclxuXHRcdFx0XHR2YXIgbmFtZSA9IFwiXCI7XHJcblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0aWYgKGl0ZW1zW2ldLmNoZWNrID09IHRydWUpIHtcclxuXHRcdFx0XHRcdFx0aWYgKG5hbWUpXHJcblx0XHRcdFx0XHRcdFx0bmFtZSArPSAnOyc7XHJcblx0XHRcdFx0XHRcdG5hbWUgKz0gaXRlbXNbaV0ubmFtZTtcclxuXHRcdFx0XHRcdFx0ZGF0YS5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRpZDogaXRlbXNbaV0uaWQsXHJcblx0XHRcdFx0XHRcdFx0bmFtZTogaXRlbXNbaV0ubmFtZVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gaWYgKCEkdGhpcy4kZGF0YS5wb3B1cFBhcmFtKSB7XHJcblx0XHRcdFx0Ly8gXHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHQvLyBcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdC8vIFx0XHRjb250ZW50OiBcInBvcHVwUGFyYW3kuLrnqbrvvIFcIixcclxuXHRcdFx0XHQvLyBcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0Ly8gXHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdC8vIFx0fSk7XHJcblx0XHRcdFx0Ly8gXHRyZXR1cm47XHJcblx0XHRcdFx0Ly8gfVxyXG5cclxuXHRcdFx0XHR2YXIgZmllbGRJZCA9ICR0aGlzLiRkYXRhLnBvcHVwUGFyYW0uaXRlbS5maWVsZElkO1xyXG5cdFx0XHRcdCR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5tb2RlbFthdHRyXSA9IG5hbWU7XHJcblx0XHRcdFx0Zm9yICh2YXIgYyA9IDA7IGMgPCAkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXMubGVuZ3RoOyBjKyspIHtcclxuXHRcdFx0XHRcdHZhciBhdHRyID0gJHRoaXMuJGRhdGEuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zW2NdO1xyXG5cdFx0XHRcdFx0aWYgKGF0dHIuZmllbGRJZCA9PSBmaWVsZElkKSB7XHJcblx0XHRcdFx0XHRcdGF0dHIudmFsdWUgPSBuYW1lO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zb2xlLmxvZyhkYXRhKTtcclxuXHRcdFx0XHR2YXIgY2FsbGJhY2tfZXZlbnRpZCA9ICR0aGlzLiRkYXRhLnBvcHVwUGFyYW0uYnV0dG9uX2NhbGxiYWNrLnRyaW0oKTtcclxuXHRcdFx0XHR2YXIgaW5mbyA9IHtcclxuXHRcdFx0XHRcdGV2ZW50aWQ6IGNhbGxiYWNrX2V2ZW50aWQsXHJcblx0XHRcdFx0XHRlZHR5cGU6IFwiMFwiLFxyXG5cdFx0XHRcdFx0cHJvamVjdGlkOiAnJyxcclxuXHRcdFx0XHRcdHJjbHNpZDogJycsXHJcblx0XHRcdFx0XHRyb2JqaWQ6ICcnLFxyXG5cdFx0XHRcdFx0dXNlcmxvZ2luOiAnJyxcclxuXHRcdFx0XHRcdGNsc2lkOiAkdGhpcy4kZGF0YS5wYXJhbS5EYXRhQ2xzLmlkLFxyXG5cdFx0XHRcdFx0b2JqaWQ6IFwiXCIsXHJcblx0XHRcdFx0XHRhdHRyOiAkdGhpcy4kZGF0YS5wb3B1cFBhcmFtLnJlcSxcclxuXHRcdFx0XHRcdGRhdGFKc29uOiBkYXRhXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdCR0aGlzLkRhdGFPYmpSdW5DdXN0b21FdmVudChpbmZvLCAkdGhpcy4kZGF0YS5wb3B1cFBhcmFtLmRhdGFfYXR0cik7XHJcblx0XHRcdFx0dGhpcy4kcmVmcy5wb3B1cC5jbG9zZSgpO1xyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0RGF0YU9ialJ1bkN1c3RvbUV2ZW50KGluZm8sIGRhdGFfYXR0cikge1xyXG5cdFx0XHRcdHZhciAkdGhpcyA9IHRoaXM7XHJcblx0XHRcdFx0dmFyIGVudmlyb21lbnQgPSB7XHJcblx0XHRcdFx0XHQnZnVuY3Rpb24nOiAnMzAwMCcsIC8vIOWKn+iDveeCuee8luWPt1xyXG5cdFx0XHRcdFx0Y2xzX2lkOiB0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHMuaWQsIC8vIOWKn+iDveeCueS4u+aVsOaNruexu+agh+ivhlxyXG5cdFx0XHRcdFx0J2J1dHRvbic6ICd0b3AnLCAvLyB0b3AvYm90dG9tXHJcblx0XHRcdFx0XHRidXR0b25fbmFtZTogdGhpcy50cmFuc2xhdGVTeXMoJ2FkZDInKSxcclxuXHRcdFx0XHRcdG1hc3Rlcjoge1xyXG5cdFx0XHRcdFx0XHRjbHNfaWQ6IHRoaXMuJGRhdGEucGFyYW0uRGF0YUNscy5pZCwgLy8gYnV0dG9uPWJvdHRvbeaXtiBtYXN0ZXLnmoRjbHNfaWRcclxuXHRcdFx0XHRcdFx0Ly9vYmpfaWQ6ICcnICAvLyBidXR0b249Ym90dG9t5pe2IG1hc3RlcueahG9ial9pZFxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0aWYgKGRhdGFfYXR0cikge1xyXG5cdFx0XHRcdFx0ZW52aXJvbWVudC5lZGl0X2RsZyA9IHtcclxuXHRcdFx0XHRcdFx0dHlwZTogJ3NtYWxsJywgLy/lsI/nqpflj6NcclxuXHRcdFx0XHRcdFx0Y2xhc3NfaWQ6IHRoaXMuJGRhdGEucGFyYW0uRGF0YUNscy5pZCwgLy/lvZPliY3mlbDmja7nsbtpZFxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKGRhdGFfYXR0cikge1xyXG5cdFx0XHRcdFx0XHRlbnZpcm9tZW50LmVkaXRfZGxnLmZvcm1fY29udHJvbCA9IHsgLy/miYDlsZ7nmoTooajljZXmjqfku7ZcclxuXHRcdFx0XHRcdFx0XHRuYW1lOiBkYXRhX2F0dHIuTmFtZSwgLy/lrZfmrrXlsZ7mgKdcclxuXHRcdFx0XHRcdFx0XHR0ZXh0OiBkYXRhX2F0dHIuRGlzcE5hbWUsIC8v5pi+56S65paH5pysXHJcblx0XHRcdFx0XHRcdFx0Z3JvdXBfbmFtZTogZGF0YV9hdHRyLkdyb3VwTmFtZSwgLy/lsZ7mgKfnu4RcclxuXHRcdFx0XHRcdFx0XHR0eXBlOiBkYXRhX2F0dHIuVHlwZSwgLy/lrZfmrrXnsbvlnotcclxuXHRcdFx0XHRcdFx0XHRyZWFkb25seTogZGF0YV9hdHRyLlJlYWRPbmx5LCAvL+aYr+WQpuWPquivu1xyXG5cdFx0XHRcdFx0XHRcdGJ1dHRvbl9pbWc6IGRhdGFfYXR0ci5idXR0b25faW1nLCAvL+W8leeUqOaMiemSrueahOWbvuagh1xyXG5cdFx0XHRcdFx0XHRcdGJ1dHRvbl90b29sdGlwOiBkYXRhX2F0dHIuYnV0dG9uX3Rvb2x0aXAgLy/lvJXnlKjmjInpkq7nmoR0b29sdGlwXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIHZhciBkYXRhSW5mbyA9IHtcclxuXHRcdFx0XHQvLyAgICAgZWR0eXBlOiBpbmZvLmVkdHlwZSwgZXZlbnRpZDogaW5mby5ldmVudGlkLCBwcm9qZWN0aWQ6IGluZm8ucHJvamVjdGlkLnJlcGxhY2UoJ3snLCcnKS5yZXBsYWNlKCd9JywnJyksXHJcblx0XHRcdFx0Ly8gICAgIHJjbHNpZDogaW5mby5yY2xzaWQsIHJvYmppZDogaW5mby5yb2JqaWQsIHVzZXJsb2dpbjogaW5mby51c2VybG9naW4sIGNsc2lkOiBpbmZvLmNsc2lkLCBvYmppZDogaW5mby5vYmppZCxcclxuXHRcdFx0XHQvLyAgICAgYXR0cjogSlNPTi5zdHJpbmdpZnkoaW5mby5hdHRyKSwgZXh0aW5mbzogSlNPTi5zdHJpbmdpZnkoZW52aXJvbWVudCksIGlucHV0cGFyYW1ldGVyOiBcIlwiLFxyXG5cdFx0XHRcdC8vIFx0Z2xvYmFsX2F0dHI6IEpTT04uc3RyaW5naWZ5KHRoaXMuJGRhdGEuZ2xvYmFsX2F0dHIpLCBkYXRhSnNvbjpKU09OLnN0cmluZ2lmeShpbmZvLmRhdGFKc29uKVxyXG5cdFx0XHRcdC8vIH1cclxuXHRcdFx0XHRlbnZpcm9tZW50ID0gQmFzZTY0LmVuY29kZShKU09OLnN0cmluZ2lmeShlbnZpcm9tZW50KSk7IC8v5bCG5a2X56ym5Liy6L2s5o2i5Li6YmFzZTY057yW56CBXHJcblx0XHRcdFx0dmFyIGlucHV0X3BhcmFtID0gQmFzZTY0LmVuY29kZShKU09OLnN0cmluZ2lmeShpbmZvLmF0dHIpKTsgLy/lsIblrZfnrKbkuLLovazmjaLkuLpiYXNlNjTnvJbnoIFcclxuXHRcdFx0XHR2YXIgZ2xvYmFsX2F0dHIgPSBCYXNlNjQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHRoaXMuJGRhdGEuZ2xvYmFsX2F0dHIpKTsgLy/lsIblrZfnrKbkuLLovazmjaLkuLpiYXNlNjTnvJbnoIFcclxuXHRcdFx0XHRpZiAoaW5mby5kYXRhSnNvbilcclxuXHRcdFx0XHRcdGluZm8uZGF0YUpzb24gPSBCYXNlNjQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGluZm8uZGF0YUpzb24pKTsgLy/lsIblrZfnrKbkuLLovazmjaLkuLpiYXNlNjTnvJbnoIFcclxuXHRcdFx0XHR2YXIgb2JqX2F0dHIgPSB7fTtcclxuXHRcdFx0XHRpbmZvLmF0dHIuZm9yRWFjaChpdGVtID0+IHtcclxuXHRcdFx0XHRcdG9ial9hdHRyW2l0ZW0uYXR0cl0gPSBpdGVtLnZhbDtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRpZiAoIWluZm8uZXZlbnRpZC5pbmNsdWRlcygneycpKSBpbmZvLmV2ZW50aWQgPSAneycgKyBpbmZvLmV2ZW50aWQgKyAnfSc7XHJcblx0XHRcdFx0dmFyIGRhdGFJbmZvID0ge1xyXG5cdFx0XHRcdFx0ZWRfdHlwZTogaW5mby5lZHR5cGUsXHJcblx0XHRcdFx0XHRzdGFydF90cmFuc2FjdGlvbjogdHJ1ZSxcclxuXHRcdFx0XHRcdGNsYXNzX2lkOiBpbmZvLmNsc2lkLFxyXG5cdFx0XHRcdFx0Y2xhc3NfbmFtZTogJycsXHJcblx0XHRcdFx0XHRldmVudF9pZDogaW5mby5ldmVudGlkLFxyXG5cdFx0XHRcdFx0ZXZlbnRfbmFtZTogJycsXHJcblx0XHRcdFx0XHRkYXRhX29ial9pZDogaW5mby5vYmppZCxcclxuXHRcdFx0XHRcdG9ial9hdHRyOiBvYmpfYXR0cixcclxuXHRcdFx0XHRcdHByal9pZDogaW5mby5wcm9qZWN0aWQsXHJcblx0XHRcdFx0XHRyZWZfY2xzX2lkOiBpbmZvLnJjbHNpZCxcclxuXHRcdFx0XHRcdHJlbF9vYmpfaWQ6IGluZm8ucm9iamlkLFxyXG5cdFx0XHRcdFx0dXNlcl9sb2dpbjogaW5mby51c2VybG9naW4sXHJcblx0XHRcdFx0XHRkYXRhX2pzb246IGluZm8uZGF0YUpzb24sXHJcblx0XHRcdFx0XHRjb21wb3NlX2luZm86ICcnLFxyXG5cdFx0XHRcdFx0ZXh0X2luZm86IGVudmlyb21lbnQsXHJcblx0XHRcdFx0XHRnbG9iYWxfYXR0cjogZ2xvYmFsX2F0dHIsXHJcblx0XHRcdFx0XHRpbnB1dF9wYXJhbTogaW5wdXRfcGFyYW0sXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhkYXRhSW5mbyk7XHJcblx0XHRcdFx0Ly8gcmV0dXJuO1xyXG5cdFx0XHRcdHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdydW5DdXN0b21FdmVudCcsIGRhdGFJbmZvKS50aGVuKHN1Y2Nlc3MgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coc3VjY2Vzcyk7XHJcblx0XHRcdFx0XHRpZiAoc3VjY2Vzcy5lcnJfY29kZSA9PSAwKSB7XHJcblx0XHRcdFx0XHRcdHZhciBkYXRhID0gc3VjY2Vzcy5yZXN1bHQ7XHJcblx0XHRcdFx0XHRcdGlmIChkYXRhLnJldCAhPSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIHRpcCA9IGRhdGEuZXJyX2luZm8gPyB0eXBlb2YgZGF0YS5lcnJfaW5mbyA9PSAnc3RyaW5nJyA/IGRhdGEuZXJyX2luZm8gOlxyXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YVxyXG5cdFx0XHRcdFx0XHRcdFx0LmVycl9pbmZvLmpvaW4oJzxici8+JykgOiAnJztcclxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0YS5yZXQgPT0gODAxKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5wYXJhbS5Pbmx5X1NjcmlwdF9FcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgcG9zID0gdGlwLmluZGV4T2YoXCLvvJpcIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChwb3MgPiAtMSkgdGlwID0gdGlwLnN1YnN0cmluZyhwb3MgKyAxKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRpcCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudDogdGlwICsgJywnICsgdGhpcy50cmFuc2xhdGVTeXMoJ3RpcCcpICsgJzonICsgZGF0YS5yZXQsXHJcblx0XHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHZhciB0aXAgPSBkYXRhLmluZm8gPyB0eXBlb2YgZGF0YS5pbmZvID09ICdzdHJpbmcnID8gZGF0YS5pbmZvIDogZGF0YS5pbmZvXHJcblx0XHRcdFx0XHRcdFx0XHQuam9pbihcclxuXHRcdFx0XHRcdFx0XHRcdFx0Jzxici8+JykgOiAnJztcclxuXHRcdFx0XHRcdFx0XHRpZiAodGlwKSB1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRpcCxcclxuXHRcdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHZhciBhY3Rpb25saXN0ID0gZGF0YS5hY3Rpb247XHJcblx0XHRcdFx0XHRcdFx0aWYgKGFjdGlvbmxpc3QpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGFjdGlvbmxpc3QpO1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhY3Rpb25saXN0Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25saXN0W2ldO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYWN0aW9uLmFjdGlvbl90eXBlID09ICdzZXRfZGxnX2F0dHInKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIHJlc3VsdCA9IGFjdGlvbi52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJlc3VsdFtpXS5jaG9pY2VfbGlzdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBjID0gMDsgYyA8ICR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5pdGVtc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5sZW5ndGg7IGMrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBhdHRyID0gJHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLml0ZW1zW2NdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhdHRyLm5hbWUgIT0gJ0xheW91dCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhdHRyLmZpZWxkSWQgPT0gcmVzdWx0W2ldLmF0dHIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGRpY3RJdGVtTGlzdCA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBkIGluIHJlc3VsdFtpXS5jaG9pY2VfbGlzdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciB2YWwgPSByZXN1bHRbaV0uY2hvaWNlX2xpc3RbZF07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGljdEl0ZW1MaXN0LnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDTl9TX05BTUVcIjogdmFsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDTl9TX1ZBTFVFXCI6IHZhbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwidGV4dFwiOiB2YWwsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInZhbHVlXCI6IHZhbFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIuZGljdCA9IGRpY3RJdGVtTGlzdDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGF0dHIubmFtZSA9PSAnTGF5b3V0Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXR0ci5zZXR0aW5nLmNvbExpc3QuZm9yRWFjaChjb2wgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29sKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbC5maWVsZElkID09IHJlc3VsdFtpXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmF0dHIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBkaWN0SXRlbUxpc3QgPSBbXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAodmFyIGQgaW4gcmVzdWx0W2ldXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNob2ljZV9saXN0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciB2YWwgPSByZXN1bHRbaV1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuY2hvaWNlX2xpc3RbZF07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRpY3RJdGVtTGlzdC5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNOX1NfTkFNRVwiOiB2YWwsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDTl9TX1ZBTFVFXCI6IHZhbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInRleHRcIjogdmFsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwidmFsdWVcIjogdmFsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sLmRpY3QgPSBkaWN0SXRlbUxpc3Q7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKHZhciBjID0gMDsgYyA8ICR0aGlzLiRkYXRhLmhlYWRfc3R5bGVkZWYuZm9ybS5pdGVtc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQubGVuZ3RoOyBjKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGF0dHIgPSAkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXNbY107XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKGF0dHJbal0uTmFtZSsnPT0nK3Jlc3VsdFtpXS5hdHRyKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly/liKTmlq3ooajljZXph4zmmK/lkKbmnInov5Tlm57lrZfmrrXvvIzmsqHmnInlsLHoo4Xovb3liLBtb2RlbOmHjO+8jOeCueWHu+ehruWumuaPkOS6pOeahOaXtuWAmeW4puS4iui/meS6m+aVsOaNrlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoJHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW3Jlc3VsdFtpXS5hdHRyXSA9PVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5tb2RlbFtyZXN1bHRbaV0uYXR0cl0gPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0W2ldXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly/liKTmlq3mmK/lkKbmmK/moIXmoLzooajljZVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGF0dHIubmFtZSAhPSAnTGF5b3V0Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhdHRyLmZpZWxkSWQgPT0gcmVzdWx0W2ldLmF0dHIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIudmFsdWUgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIub2xkdmFsdWUgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIudmFsdWUgPSByZXN1bHRbaV0udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLm9sZHZhbHVlID0gcmVzdWx0W2ldLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW2F0dHIuZmllbGRJZF0gPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHRbaV1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhdHRyLm5hbWUgPT0gJ0xheW91dCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLnNldHRpbmcuY29sTGlzdC5mb3JFYWNoKGNvbCA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29sKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb2wuZmllbGRJZCA9PSByZXN1bHRbaV0uYXR0cikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC52YWx1ZSA9ICcnO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC5vbGR2YWx1ZSA9ICcnO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC52YWx1ZSA9IHJlc3VsdFtpXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb2wub2xkdmFsdWUgPSByZXN1bHRbaV0udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW2NvbFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmZpZWxkSWRdID0gcmVzdWx0W2ldLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBsZW5ndGggPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCEkdGhpcy4kZGF0YS5yZWZkYXRhc3RvcmUuZmlsdGVyKGZ1bmN0aW9uKHMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0W2ldLmF0dHIgPT0gcy5hdHRyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsZW5ndGggPSAxO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy4kZGF0YS5yZWZkYXRhc3RvcmUucHVzaChyZXN1bHRbaV0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGxlbmd0aCA9PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgJHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCR0aGlzLiRkYXRhLnJlZmRhdGFzdG9yZVtqXS5hdHRyID09IHJlc3VsdFtpXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmF0dHIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLiRkYXRhLnJlZmRhdGFzdG9yZVtqXS52YWx1ZSA9IHJlc3VsdFtpXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGFjdGlvbi5hY3Rpb25fdHlwZSA9PSAnc2V0X2RsZ19hdHRyX3Nob3cnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIHJlc3VsdCA9IGFjdGlvbi52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHQuZm9yRWFjaChhc3luYyAoYXR0ciwga2V5KSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXMuZm9yRWFjaChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXN5bmMgKGVsZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpbmRleCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8v5Yik5pat5piv5ZCm5piv5qCF5qC86KGo5Y2VXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVsZS5uYW1lICE9ICdMYXlvdXQnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZWxlLmZpZWxkSWQgPT0gYXR0ci5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsZS5zaG93ID0gYXR0ci5zaG93O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZWxlLm5hbWUgPT0gJ0xheW91dCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsZS5zZXR0aW5nLmNvbExpc3QuZm9yRWFjaChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29sKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5maWVsZElkID09XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmF0dHIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sLnNob3cgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuc2hvdztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGhlYWRfc3R5bGVkZWYgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KCR0aGlzLiRkYXRhXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuaGVhZF9zdHlsZWRlZikpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLiRkYXRhLmhlYWRfc3R5bGVkZWYgPSBbXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmID0gaGVhZF9zdHlsZWRlZjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb24uYWN0aW9uX3R5cGUgPT0gJ3NldF9nbG9iYWxfYXR0cicpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy4kZGF0YS5nbG9iYWxfYXR0ciA9IGFjdGlvbi52YWx1ZSB8fCBbXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU3lzKFwicXVvdGF0aW9uX21hcmtfbGVmdFwiKSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGlvblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuYWN0aW9uX3R5cGUgKyB0aGlzLnRyYW5zbGF0ZVN5cyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInF1b3RhdGlvbl9tYXJrX3JpZ2h0XCIpICsgdGhpcy50cmFuc2xhdGUoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJ0aXBfYWN0aW9uX3VucHJvY2Vzc2VkXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHQvLyB2YXIgaGVhZF9zdHlsZWRlZiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoJHRoaXMuaGVhZF9zdHlsZWRlZikpO1xyXG5cdFx0XHRcdFx0XHRcdC8vICR0aGlzLmhlYWRfc3R5bGVkZWY9W107XHJcblx0XHRcdFx0XHRcdFx0Ly8gJHRoaXMuaGVhZF9zdHlsZWRlZiA9IGhlYWRfc3R5bGVkZWY7XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJHRoaXMuaGVhZF9zdHlsZWRlZik7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChkYXRhLnJlc3VsdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlc3VsdCA9IGRhdGEucmVzdWx0O1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgYyA9IDA7IGMgPCAkdGhpcy4kZGF0YS5oZWFkX3N0eWxlZGVmLmZvcm0uaXRlbXMubGVuZ3RoOyBjKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgYXR0ciA9ICR0aGlzLiRkYXRhLmhlYWRfc3R5bGVkZWYuZm9ybS5pdGVtc1tjXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvL+WIpOaWreihqOWNlemHjOaYr+WQpuaciei/lOWbnuWtl+aute+8jOayoeacieWwseijhei9veWIsG1vZGVs6YeM77yM54K55Ye756Gu5a6a5o+Q5Lqk55qE5pe25YCZ5bim5LiK6L+Z5Lqb5pWw5o2uXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCR0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5tb2RlbFtyZXN1bHRbaV0uYXR0cl0gPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWxbcmVzdWx0W2ldLmF0dHJdID0gcmVzdWx0W2ldXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly/liKTmlq3mmK/lkKbmmK/moIXmoLzooajljZVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYXR0ci5uYW1lICE9ICdMYXlvdXQnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYXR0ci5maWVsZElkID09IHJlc3VsdFtpXS5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHIudmFsdWUgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXR0ci5vbGR2YWx1ZSA9ICcnO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLnZhbHVlID0gcmVzdWx0W2ldLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhdHRyLm9sZHZhbHVlID0gcmVzdWx0W2ldLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWxbYXR0ci5maWVsZElkXSA9IHJlc3VsdFtpXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGF0dHIubmFtZSA9PSAnTGF5b3V0Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXR0ci5zZXR0aW5nLmNvbExpc3QuZm9yRWFjaChjb2wgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY29sKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbC5maWVsZElkID09IHJlc3VsdFtpXS5hdHRyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb2wudmFsdWUgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbC5vbGR2YWx1ZSA9ICcnO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sLnZhbHVlID0gcmVzdWx0W2ldLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sLm9sZHZhbHVlID0gcmVzdWx0W2ldLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuaGVhZF9zdHlsZWRlZi5mb3JtLm1vZGVsW2NvbFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5maWVsZElkXSA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdFtpXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGxlbmd0aCA9IDA7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghJHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlLmZpbHRlcihmdW5jdGlvbihzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0W2ldLmF0dHIgPT0gcy5hdHRyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSkubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGVuZ3RoID0gMTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy4kZGF0YS5yZWZkYXRhc3RvcmUucHVzaChyZXN1bHRbaV0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChsZW5ndGggPT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgJHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoJHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlW2pdLmF0dHIgPT0gcmVzdWx0W2ldLmF0dHIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlW2pdLnZhbHVlID0gcmVzdWx0W2ldLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwiZXJyb3JcIikgKyBcIjNcIixcclxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBzdWNjZXNzLmVycl9tc2csXHJcblx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pLmNhdGNoKGV4ID0+IHtcclxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKGV4KTtcclxuXHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJlcnJvclwiKSArIFwiMy4xXCIsXHJcblx0XHRcdFx0XHRcdGNvbnRlbnQ6IGV4LmVyck1zZyxcclxuXHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0sXHJcblx0XHRcdERhdGFPYmpSdW5DdXN0b21FdmVudF9SZXR1cm4oZXZlbnRpZCwgZGF0YV9hdHRyLCBidXR0b25fY2FsbGJhY2ssIGl0ZW0pIHtcclxuXHRcdFx0XHR2YXIgZW52aXJvbWVudCA9IHtcclxuXHRcdFx0XHRcdCdmdW5jdGlvbic6ICczMDAwJywgLy8g5Yqf6IO954K557yW5Y+3XHJcblx0XHRcdFx0XHRjbHNfaWQ6IHRoaXMuJGRhdGEucGFyYW0uRGF0YUNscy5pZCwgLy8g5Yqf6IO954K55Li75pWw5o2u57G75qCH6K+GXHJcblx0XHRcdFx0XHQnYnV0dG9uJzogJ3RvcCcsIC8vIHRvcC9ib3R0b21cclxuXHRcdFx0XHRcdGJ1dHRvbl9uYW1lOiB0aGlzLnRyYW5zbGF0ZVN5cygnYWRkMicpLFxyXG5cdFx0XHRcdFx0bWFzdGVyOiB7XHJcblx0XHRcdFx0XHRcdGNsc19pZDogdGhpcy4kZGF0YS5wYXJhbS5EYXRhQ2xzLmlkLCAvLyBidXR0b249Ym90dG9t5pe2IG1hc3RlcueahGNsc19pZFxyXG5cdFx0XHRcdFx0XHQvL29ial9pZDogJycgIC8vIGJ1dHRvbj1ib3R0b23ml7YgbWFzdGVy55qEb2JqX2lkXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHR2YXIgb2JqX2F0dHIgPSB0aGlzLmhlYWRfc3R5bGVkZWYuZm9ybS5tb2RlbDtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhvYmpfYXR0cik7XHJcblx0XHRcdFx0dmFyIHJlcSA9IE9iamVjdC5rZXlzKG9ial9hdHRyKS5tYXAoKGEpID0+ICh7XHJcblx0XHRcdFx0XHRhdHRyOiBhLFxyXG5cdFx0XHRcdFx0dmFsOiBvYmpfYXR0clthXSB8fCBcIlwiLFxyXG5cdFx0XHRcdH0pKTtcclxuXHRcdFx0XHRpZiAodGhpcy4kZGF0YS5yZWZkYXRhc3RvcmUubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLiRkYXRhLnJlZmRhdGFzdG9yZS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRpZiAoIXJlcS5maWx0ZXIoZnVuY3Rpb24ocykge1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlW2ldLmF0dHIgPT0gcy5uYW1lXHJcblx0XHRcdFx0XHRcdFx0fSkubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0bGVuZ3RoID0gMTtcclxuXHRcdFx0XHRcdFx0XHRyZXEucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0XHQnYXR0cic6IHRoaXMuJGRhdGEucmVmZGF0YXN0b3JlW2ldLmF0dHIsXHJcblx0XHRcdFx0XHRcdFx0XHQndmFsJzogdGhpcy4kZGF0YS5yZWZkYXRhc3RvcmVbaV0udmFsdWVcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR2YXIgZXh0aW5mbyA9IGVudmlyb21lbnQ7XHJcblx0XHRcdFx0ZXh0aW5mby5lZGl0X2RsZyA9IHtcclxuXHRcdFx0XHRcdHR5cGU6ICdzbWFsbCcsIC8v5bCP56qX5Y+jXHJcblx0XHRcdFx0XHRjbGFzc19pZDogdGhpcy4kZGF0YS5wYXJhbS5EYXRhQ2xzLmlkLCAvL+W9k+WJjeaVsOaNruexu2lkXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIHZhciBkYXRhSW5mbyA9IHtcclxuXHRcdFx0XHQvLyBcdGVkdHlwZTogIFwiMFwiLCBldmVudGlkOiBldmVudGlkLCBwcm9qZWN0aWQ6ICcnLHJjbHNpZDogJycsIHJvYmppZDogJycsIHVzZXJsb2dpbjogJycsIFxyXG5cdFx0XHRcdC8vIFx0Y2xzaWQ6IHRoaXMuJGRhdGEucGFyYW0uRGF0YUNscy5pZCwgb2JqaWQ6ICcnLGF0dHI6IEpTT04uc3RyaW5naWZ5KHJlcSksIFxyXG5cdFx0XHRcdC8vIFx0ZXh0aW5mbzogSlNPTi5zdHJpbmdpZnkoZXh0aW5mbyksIGdsb2JhbF9hdHRyOiBKU09OLnN0cmluZ2lmeSh0aGlzLiRkYXRhLmdsb2JhbF9hdHRyKVxyXG5cdFx0XHRcdC8vIH1cclxuXHRcdFx0XHRleHRpbmZvID0gQmFzZTY0LmVuY29kZShKU09OLnN0cmluZ2lmeShleHRpbmZvKSk7IC8v5bCG5a2X56ym5Liy6L2s5o2i5Li6YmFzZTY057yW56CBXHJcblx0XHRcdFx0dmFyIGdsb2JhbF9hdHRyID0gQmFzZTY0LmVuY29kZShKU09OLnN0cmluZ2lmeSh0aGlzLiRkYXRhLmdsb2JhbF9hdHRyKSk7IC8v5bCG5a2X56ym5Liy6L2s5o2i5Li6YmFzZTY057yW56CBXHJcblx0XHRcdFx0dmFyIG9ial9hdHRyID0ge307XHJcblx0XHRcdFx0cmVxLmZvckVhY2goaXRlbSA9PiB7XHJcblx0XHRcdFx0XHRvYmpfYXR0cltpdGVtLmF0dHJdID0gaXRlbS52YWw7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0aWYgKCFldmVudGlkLmluY2x1ZGVzKCd7JykpIGV2ZW50aWQgPSAneycgKyBldmVudGlkICsgJ30nO1xyXG5cdFx0XHRcdHZhciBkYXRhSW5mbyA9IHtcclxuXHRcdFx0XHRcdGVkX3R5cGU6IFwiMFwiLFxyXG5cdFx0XHRcdFx0c3RhcnRfdHJhbnNhY3Rpb246IHRydWUsXHJcblx0XHRcdFx0XHRjbGFzc19pZDogdGhpcy4kZGF0YS5wYXJhbS5EYXRhQ2xzLmlkLFxyXG5cdFx0XHRcdFx0Y2xhc3NfbmFtZTogJycsXHJcblx0XHRcdFx0XHRldmVudF9pZDogZXZlbnRpZCxcclxuXHRcdFx0XHRcdGV2ZW50X25hbWU6ICcnLFxyXG5cdFx0XHRcdFx0ZGF0YV9vYmpfaWQ6ICcnLFxyXG5cdFx0XHRcdFx0b2JqX2F0dHI6IG9ial9hdHRyLFxyXG5cdFx0XHRcdFx0cHJqX2lkOiAnJyxcclxuXHRcdFx0XHRcdHJlZl9jbHNfaWQ6ICcnLFxyXG5cdFx0XHRcdFx0cmVsX29ial9pZDogJycsXHJcblx0XHRcdFx0XHR1c2VyX2xvZ2luOiAnJyxcclxuXHRcdFx0XHRcdGRhdGFfanNvbjogJycsXHJcblx0XHRcdFx0XHRjb21wb3NlX2luZm86ICcnLFxyXG5cdFx0XHRcdFx0ZXh0X2luZm86IGV4dGluZm8sXHJcblx0XHRcdFx0XHRnbG9iYWxfYXR0cjogZ2xvYmFsX2F0dHIsXHJcblx0XHRcdFx0XHRpbnB1dF9wYXJhbTogJycsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhkYXRhSW5mbyk7XHJcblx0XHRcdFx0Ly8gcmV0dXJuO1xyXG5cdFx0XHRcdHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdydW5DdXN0b21FdmVudCcsIGRhdGFJbmZvKS50aGVuKHN1Y2Nlc3MgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coc3VjY2Vzcyk7XHJcblx0XHRcdFx0XHRpZiAoc3VjY2Vzcy5lcnJfY29kZSA9PSAwKSB7XHJcblx0XHRcdFx0XHRcdHZhciBkYXRhID0gc3VjY2Vzcy5yZXN1bHQ7XHJcblx0XHRcdFx0XHRcdGlmIChkYXRhLnJldCAhPSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIHRpcCA9IGRhdGEuZXJyX2luZm8gPyB0eXBlb2YgZGF0YS5lcnJfaW5mbyA9PSAnc3RyaW5nJyA/IGRhdGEuZXJyX2luZm8gOlxyXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YVxyXG5cdFx0XHRcdFx0XHRcdFx0LmVycl9pbmZvLmpvaW4oJzxici8+JykgOiAnJztcclxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0YS5yZXQgPT0gODAxKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5wYXJhbS5Pbmx5X1NjcmlwdF9FcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgcG9zID0gdGlwLmluZGV4T2YoXCLvvJpcIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChwb3MgPiAtMSkgdGlwID0gdGlwLnN1YnN0cmluZyhwb3MgKyAxKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRpcCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudDogdGlwICsgJywnICsgdGhpcy50cmFuc2xhdGVTeXMoJ3RpcCcpICsgJzonICsgZGF0YS5yZXQsXHJcblx0XHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHZhciB0aXAgPSBkYXRhLmluZm8gPyB0eXBlb2YgZGF0YS5pbmZvID09ICdzdHJpbmcnID8gZGF0YS5pbmZvIDogZGF0YS5pbmZvXHJcblx0XHRcdFx0XHRcdFx0XHQuam9pbihcclxuXHRcdFx0XHRcdFx0XHRcdFx0Jzxici8+JykgOiAnJztcclxuXHRcdFx0XHRcdFx0XHRpZiAodGlwKSB1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRpcCxcclxuXHRcdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChkYXRhICE9IFwiXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhciBhY3Rpb25zID0gZGF0YS5hY3Rpb247XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhhY3Rpb25zKTtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChhY3Rpb25zKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25zW2ldO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciB2YWwgPSBhY3Rpb24udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGVudmlyb21lbnQgPSBKU09OLnN0cmluZ2lmeShlbnZpcm9tZW50KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFjdGlvbi5hY3Rpb25fdHlwZSA9PSAnb3Blbl9wYW5lbCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBkID0gZGlhbG9nKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6ICc8aSBjbGFzcz1cImFjZS1pY29uIGZhIGZhLWluZm8tY2lyY2xlXCI+PC9pPiAnICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudDogdGhpcy50cmFuc2xhdGVTeXMoXCJxdW90YXRpb25fbWFya19sZWZ0XCIpICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhY3Rpb25cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuYWN0aW9uX3R5cGUgKyB0aGlzLnRyYW5zbGF0ZVN5cyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwicXVvdGF0aW9uX21hcmtfcmlnaHRcIikgKyB0aGlzLnRyYW5zbGF0ZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwidGlwX2FjdGlvbl91bnByb2Nlc3NlZFwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkLnNob3coKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGFjdGlvbi5hY3Rpb25fdHlwZSA9PSAnb3Blbl9zZWxlY3RfdXNlcmRsZycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBzdHlsZSA9IHZhbC5zdHlsZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHN0eWxlID09ICd1c2VyJyA/ICfpgInmi6nkurrlkZgnIDogc3R5bGUgPT0gJ2RlcGFydG1lbnQnID8gJ+mAieaLqemDqOmXqCcgOiBzdHlsZSA9PSAncm9sZScgPyAn6YCJ5oup6KeS6ImyJyA6ICcnXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgJHRoaXMgPSB0aGlzO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIHBhcmFtID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtOiBpdGVtLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRidXR0b25fY2FsbGJhY2s6IGJ1dHRvbl9jYWxsYmFjayxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVxOiByZXEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGFfYXR0cjogZGF0YV9hdHRyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmkubmF2aWdhdGVUbyh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVybDogJy4uL3NlbHBzbi9pbmRleD9tdWxpdD1mYWxzZSZwYXJhbT0nICsgSlNPTlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5zdHJpbmdpZnkoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXJhbSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50czoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdEFkZFBlcihkYXRhLCBwYXJhbSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2cocGFyYW0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coZGF0YSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgY2FsbGJhY2tfZXZlbnRpZCA9IHBhcmFtXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5idXR0b25fY2FsbGJhY2tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnRyaW0oKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBpbmZvID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRldmVudGlkOiBjYWxsYmFja19ldmVudGlkLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlZHR5cGU6IFwiMFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9qZWN0aWQ6ICcnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyY2xzaWQ6ICcnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyb2JqaWQ6ICcnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1c2VybG9naW46ICcnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjbHNpZDogJHRoaXMuJGRhdGEucGFyYW0uRGF0YUNsc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5pZCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b2JqaWQ6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF0dHI6IHBhcmFtLnJlcSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5wdXRwYXJhbWV0ZXI6IGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGFKc29uOiBbXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLkRhdGFPYmpSdW5DdXN0b21FdmVudChpbmZvLCBwYXJhbVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZGF0YV9hdHRyKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uLmFjdGlvbl90eXBlID09ICdvcGVuX2RhdGFfcXVlcnlfZGxnJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGQgPSBkaWFsb2coe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogJzxpIGNsYXNzPVwiYWNlLWljb24gZmEgZmEtaW5mby1jaXJjbGVcIj48L2k+ICcgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVN5cyhcInF1b3RhdGlvbl9tYXJrX2xlZnRcIikgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGlvblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5hY3Rpb25fdHlwZSArIHRoaXMudHJhbnNsYXRlU3lzKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJxdW90YXRpb25fbWFya19yaWdodFwiKSArIHRoaXMudHJhbnNsYXRlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJ0aXBfYWN0aW9uX3VucHJvY2Vzc2VkXCIpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGQuc2hvdygpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uLmFjdGlvbl90eXBlID09ICdvcGVuX2NvbW1vbl9kbGcnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgJHRoaXMgPSB0aGlzO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHZhbC5jb21tb25fZGxnX2lkID09ICdjaGVja19saXN0Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy4kZGF0YS5jaGVja19saXN0ID0gdmFsLmNvbmZpZztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHZhbC5jb25maWcuYXBwZWFyX3N0eWxlID09ICdzaWRlc2xpcCcpIC8v5Yik5pat5piv5ZCm5piv5L6n5ruRXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJGRhdGEucG9wdXBUeXBlID0gJ3JpZ2h0JztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWxzZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLiRkYXRhLnBvcHVwVHlwZSA9ICdjZW50ZXInXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIG9wZW4g5pa55rOV5Lyg5YWl5Y+C5pWwIOetieWQjOWcqCB1bmktcG9wdXAg57uE5Lu25LiK57uR5a6aIHR5cGXlsZ7mgKdcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJHJlZnMucG9wdXAub3BlbigkdGhpcy4kZGF0YS5wb3B1cFR5cGUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgcG9wdXBQYXJhbSA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtOiBpdGVtLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJ1dHRvbl9jYWxsYmFjazogYnV0dG9uX2NhbGxiYWNrLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlcTogcmVxLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGFfYXR0cjogZGF0YV9hdHRyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuJGRhdGEucG9wdXBQYXJhbSA9IHBvcHVwUGFyYW07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhY3Rpb24uYWN0aW9uX3R5cGUgPT0gJ29wZW5fcHJvamVjdF9xdWVyeV9kbGcnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL2NvbnNvbGUubG9nKGFjdGlvbi52YWx1ZS5zZWxlY3RfcmFuZ2UpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9jb25zb2xlLmxvZyhhY3Rpb24udmFsdWUubXVsaXRfc2VsZWN0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBwcmlSZWwgPSAnLTEnO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFjdGlvbi52YWx1ZS5zZWxlY3RfcmFuZ2UgPT0gJ+WFqOmDqOebuOWFsycpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByaVJlbCA9ICcwJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsc2UgaWYgKGFjdGlvbi52YWx1ZS5zZWxlY3RfcmFuZ2UgPT0gJ+aIkei0n+i0o+eahOmhueebricpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByaVJlbCA9ICcxJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsc2UgaWYgKGFjdGlvbi52YWx1ZS5zZWxlY3RfcmFuZ2UgPT0gJ+aIkeWIm+W7uueahCcpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByaVJlbCA9ICcyJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsc2UgaWYgKGFjdGlvbi52YWx1ZS5zZWxlY3RfcmFuZ2UgPT0gJ+aIkeWPguS4jueahCcgfHwgYWN0aW9uLnZhbHVlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5zZWxlY3RfcmFuZ2UgPT0gJ+aIkeWPguWKoOeahCcpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByaVJlbCA9ICczJztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsc2UgaWYgKGFjdGlvbi52YWx1ZS5zZWxlY3RfcmFuZ2UgPT0gJ+aIkeWFs+azqOeahCcpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByaVJlbCA9ICc0JztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsc2UgaWYgKGFjdGlvbi52YWx1ZS5zZWxlY3RfcmFuZ2UgPT0gJ+aIkeS4i+WxnueahOmhueebricpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByaVJlbCA9ICc1JztcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgJHRoaXMgPSB0aGlzO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIHBhcmFtXyA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aXRlbTogaXRlbSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnV0dG9uX2NhbGxiYWNrOiBidXR0b25fY2FsbGJhY2ssXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlcTogcmVxXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmkubmF2aWdhdGVUbyh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVybDogJy4uL3NlbFByai9pbmRleD9yZWxhdGlvbj0nICsgcHJpUmVsICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnJnBhcmFtPScgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdEpTT04uc3RyaW5naWZ5KHBhcmFtXyksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50czoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdEFkZFBlcihkYXRhLCBwYXJhbSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGF0dHIgPSBwYXJhbS5pdGVtLmZpZWxkSWQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWxbYXR0cl0gPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhWzBdLklEICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JzsnICsgZGF0YVswXS5OYW1lO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vICR0aGlzLiRkYXRhLmNsYXNzQXR0ckxpc3RbcGFyYW0uaW5kZXhdLkF0dHJbcGFyYW0uaWluZGV4XS5WYWx1ZT1kYXRhWzBdLk5hbWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAkdGhpcy4kZGF0YS5jbGFzc0F0dHJMaXN0W3BhcmFtLmluZGV4XS5BdHRyW3BhcmFtLmlpbmRleF0uVmFsSUQ9ZGF0YVswXS5JRCsnOycrZGF0YVswXS5OYW1lO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGNhbGxiYWNrX2V2ZW50aWQgPSBwYXJhbVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuYnV0dG9uX2NhbGxiYWNrXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC50cmltKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY2FsbGJhY2tfZXZlbnRpZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgaW5mbyA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRldmVudGlkOiBjYWxsYmFja19ldmVudGlkLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVkdHlwZTogXCIyXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvamVjdGlkOiBkYXRhWzBdLklELFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJjbHNpZDogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyb2JqaWQ6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dXNlcmxvZ2luOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNsc2lkOiAkdGhpcy4kZGF0YS5wYXJhbVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LkRhdGFDbHMuaWQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b2JqaWQ6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXR0cjogcGFyYW0ucmVxLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGFKc29uOiBbXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuRGF0YU9ialJ1bkN1c3RvbUV2ZW50KGluZm8pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU3lzKFwicXVvdGF0aW9uX21hcmtfbGVmdFwiKSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YWN0aW9uLmFjdGlvbl90eXBlICsgdGhpcy50cmFuc2xhdGVTeXMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInF1b3RhdGlvbl9tYXJrX3JpZ2h0XCIpICsgdGhpcy50cmFuc2xhdGUoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInRpcF9hY3Rpb25fdW5wcm9jZXNzZWRcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKCd0aXAnKSArIFwiNS4yXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU3lzKFwicXVvdGF0aW9uX21hcmtfbGVmdFwiKSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJiZWZvcmVfY2xpY2tfYnV0dG9uXCIgKyB0aGlzLnRyYW5zbGF0ZVN5cyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwicXVvdGF0aW9uX21hcmtfcmlnaHRcIikgKyB0aGlzLnRyYW5zbGF0ZVN5cyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiY29tbWFcIikgKyAnZXZlbnRfaWQnICsgZXZlbnRpZCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJlcnJvclwiKSArIFwiNVwiLFxyXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IHN1Y2Nlc3MuZXJyX21zZyxcclxuXHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSkuY2F0Y2goZXggPT4ge1xyXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coZXgpO1xyXG5cdFx0XHRcdFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cygndGlwJykgKyBcIjUuMVwiLFxyXG5cdFx0XHRcdFx0XHRjb250ZW50OiBleC5lcnJNc2csXHJcblx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0Ly/noa7lrppcclxuXHRcdFx0c2F2YSgpIHtcclxuXHRcdFx0XHRpZiAodGhpcy5hZnRlcl9vaz8uaWQpIHsgLy8g54K55Ye756Gu5a6a5oyJ6ZKu5ZCOXHJcblx0XHRcdFx0XHR0aGlzLmFmdGVyT0soKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5hZGQoKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9LFxyXG5cdFx0XHRhZGQoKSB7XHJcblx0XHRcdFx0dW5pLnNob3dMb2FkaW5nKHtcclxuXHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcImxvYWRpbmdcIiksXHJcblx0XHRcdFx0XHRtYXNrOiB0cnVlXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0dmFyIG9ial9hdHRyID0gdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWw7XHJcblx0XHRcdFx0Y29uc29sZS5sb2cob2JqX2F0dHIpO1xyXG5cdFx0XHRcdC8vIHZhciByZXEgPSBPYmplY3Qua2V5cyhvYmpfYXR0cikubWFwKChhKSA9PiAoe1xyXG5cdFx0XHRcdC8vIFx0bmFtZTogYSxcclxuXHRcdFx0XHQvLyBcdHZhbHVlOiBvYmpfYXR0clthXSB8fCBcIlwiLFxyXG5cdFx0XHRcdC8vIH0pKTtcclxuXHJcblx0XHRcdFx0dmFyIGVudmlyb21lbnQgPSB7XHJcblx0XHRcdFx0XHQnZnVuY3Rpb24nOiAnMzAwMCcsIC8vIOWKn+iDveeCuee8luWPt1xyXG5cdFx0XHRcdFx0Y2xzX2lkOiB0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHMuaWQsIC8vIOWKn+iDveeCueS4u+aVsOaNruexu+agh+ivhlxyXG5cdFx0XHRcdFx0J2J1dHRvbic6ICd0b3AnLCAvLyB0b3AvYm90dG9tXHJcblx0XHRcdFx0XHRidXR0b25fbmFtZTogdGhpcy50cmFuc2xhdGVTeXMoJ2FkZDInKSxcclxuXHRcdFx0XHRcdG1hc3Rlcjoge1xyXG5cdFx0XHRcdFx0XHRjbHNfaWQ6IHRoaXMuJGRhdGEucGFyYW0uRGF0YUNscy5pZCxcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGVudmlyb21lbnQgPSBCYXNlNjQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGVudmlyb21lbnQpKTsgLy/lsIblrZfnrKbkuLLovazmjaLkuLpiYXNlNjTnvJbnoIFcclxuXHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2cob2JqX2F0dHIpO1xyXG5cdFx0XHRcdC8vIHZhciBkYXRhSW5mbz17XHJcblx0XHRcdFx0Ly8gICAgIGNsYXNzX2lkOiB0aGlzLiRkYXRhLnBhcmFtLkRhdGFDbHMuaWQsIGRhdGFfb2JqX2lkOiAnJywgbWFzdGVyY2xzaWQ6ICcnLFxyXG5cdFx0XHRcdC8vICAgICByZXE6IEpTT04uc3RyaW5naWZ5KHJlcSksIHVwZmlsZTogSlNPTi5zdHJpbmdpZnkoW10pLCBwb3N0X2RhdGE6IEpTT04uc3RyaW5naWZ5KHt9KSxcclxuXHRcdFx0XHQvLyAgICAgY29tcG9zZTogSlNPTi5zdHJpbmdpZnkoW10pLCByZWZkYXRhc3RvcmU6IEpTT04uc3RyaW5naWZ5KFtdKSwgZXh0aW5mbzogSlNPTi5zdHJpbmdpZnkoZW52aXJvbWVudCksIFxyXG5cdFx0XHRcdC8vIFx0bm90X3RyaWdnZXJfc3lzX2V2ZW50OiAnJ1xyXG5cdFx0XHRcdC8vIH07XHJcblx0XHRcdFx0dmFyIGRhdGFJbmZvID0ge1xyXG5cdFx0XHRcdFx0Y2xhc3NfaWQ6IHRoaXMuJGRhdGEucGFyYW0uRGF0YUNscy5pZCxcclxuXHRcdFx0XHRcdGNsYXNzX25hbWU6ICcnLFxyXG5cdFx0XHRcdFx0bWFzdGVyX2Nsc19pZDogJycsXHJcblx0XHRcdFx0XHRtYXN0ZXJfb2JqX2lkOiAnJyxcclxuXHRcdFx0XHRcdGNyZWF0b3I6ICcnLFxyXG5cdFx0XHRcdFx0Y3JlYXRvcl9uYW1lOiAnJyxcclxuXHRcdFx0XHRcdG5vdF90cmlnZ2VyX2V2ZW50OiAnJyxcclxuXHRcdFx0XHRcdHVwZGF0ZV9leGlzdDogJycsXHJcblx0XHRcdFx0XHRwb3N0X3Byb2Nlc3M6ICcnLFxyXG5cdFx0XHRcdFx0ZXh0X2luZm86IGVudmlyb21lbnQsXHJcblx0XHRcdFx0XHRvYmpfYXR0cjogb2JqX2F0dHJcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKGRhdGFJbmZvKTtcclxuXHRcdFx0XHQvLyByZXR1cm5cclxuXHRcdFx0XHR0aGlzLiRzdG9yZS5kaXNwYXRjaCgnY3JlYXRlRGF0YU9iaicsIGRhdGFJbmZvKS50aGVuKHN1Y2Nlc3MgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coc3VjY2Vzcyk7XHJcblx0XHRcdFx0XHR1bmkuaGlkZUxvYWRpbmcoKTtcclxuXHRcdFx0XHRcdGlmIChzdWNjZXNzLmVycl9jb2RlID09IDApIHtcclxuXHRcdFx0XHRcdFx0dmFyIHJlc3VsdCA9IHN1Y2Nlc3MucmVzdWx0O1xyXG5cdFx0XHRcdFx0XHQvLyBpZihyZXN1bHQucmVzdWx0X3R5cGUgPT0gMCl7fVxyXG5cdFx0XHRcdFx0XHRpZiAoc3VjY2Vzcy5yZXN1bHQuYWN0aW9uKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIGFjdGlvbiA9IEpTT04ucGFyc2Uoc3VjY2Vzcy5yZXN1bHQuYWN0aW9uKTtcclxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhhY3Rpb24pO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChhY3Rpb24ucmV0ID09ICcwJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFjdGlvbi5yZXQgIT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudDogdGhpcy50cmFuc2xhdGUoJ2V4ZWN1dGVfc2NyaXB0X2ZhaWxlZCcpICsgdGhpc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnRyYW5zbGF0ZVN5cygnY29tbWEnKSArIHRoaXMudHJhbnNsYXRlKCdyZXN1bHQnKSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudHJhbnNsYXRlU3lzKCdjb2xvbicpICsgYWN0aW9uLnJlc3VsdCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChhY3Rpb24uaW5mbykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR1bmkuc2hvd01vZGFsKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudDogdGhpcy50cmFuc2xhdGUoJ2V4ZWN1dGVfc2NyaXB0X2ZhaWxlZCcpICsgdGhpc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnRyYW5zbGF0ZVN5cygnY29tbWEnKSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zbGF0ZVN5cygnY29sb24nKSArIGFjdGlvbi5pbmZvLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFjdGlvbi5yZXN1bHRfdHlwZSA9PSAnMCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dW5pLnNob3dUb2FzdCh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IGFjdGlvbi5yZXN1bHQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWNvbjogXCJzdWNjZXNzXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZHVyYXRpb246IDMwMDBcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gXCJ7XCJyZXRcIjowLCBcInJlc3VsdF90eXBlXCI6MCwgXCJyZXN1bHRcIjpcIuWIm+W7uuaIkOWKnzEyMzEyMzEyM1wiLFwiaW5mb1wiOlwiXCJ9XCJcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZVxyXG5cdFx0XHRcdFx0XHRcdHVuaS5zaG93VG9hc3Qoe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlKCdjcmVhdGVfc3VjY2VzcycpLFxyXG5cdFx0XHRcdFx0XHRcdFx0aWNvbjogXCJzdWNjZXNzXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRkdXJhdGlvbjogMzAwMFxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRpZiAoIXRoaXMuJGRhdGEucGFyYW0uQWZ0ZXJfQnRuX05vdF9SZWZyZXNoKSB7XHJcblx0XHRcdFx0XHRcdFx0Ly/liLfmlrBcclxuXHRcdFx0XHRcdFx0XHR1bmkucmVkaXJlY3RUbyh7XHJcblx0XHRcdFx0XHRcdFx0XHR1cmw6ICcuLi9tb2RhbC8zMDE4XzI/cGFyYW09JyArIEpTT04uc3RyaW5naWZ5KHRoaXMuJGRhdGEucGFyYW0pICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XCImdGl0bGVuYW1lPVwiICsgdGhpcy4kZGF0YS50aXRsZVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyB0aGlzLmNsYXNzX2F0dHJfaW5pdCgpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwiZXJyb3JcIiksXHJcblx0XHRcdFx0XHRcdFx0Y29udGVudDogc3VjY2Vzcy5lcnJfbXNnLFxyXG5cdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KS5jYXRjaChleCA9PiB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhleCk7XHJcblx0XHRcdFx0XHR1bmkuaGlkZUxvYWRpbmcoKTtcclxuXHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdGNvbnRlbnQ6IGV4LmVyck1zZyxcclxuXHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZVN5cyhcImNhbmNlbFwiKVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0sXHJcblx0XHRcdGFmdGVyT0soKSB7XHJcblx0XHRcdFx0dmFyIG9ial9hdHRyID0gdGhpcy5oZWFkX3N0eWxlZGVmLmZvcm0ubW9kZWw7XHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2cob2JqX2F0dHIpO1xyXG5cdFx0XHRcdHZhciBpbnB1dF9wYXJhbSA9IHtcclxuXHRcdFx0XHRcdGlkOiBcIlwiLFxyXG5cdFx0XHRcdFx0YXR0cnM6IE9iamVjdC5rZXlzKG9ial9hdHRyKS5tYXAoKGEpID0+ICh7XHJcblx0XHRcdFx0XHRcdGF0dHI6IGEsXHJcblx0XHRcdFx0XHRcdHZhbHVlOiBvYmpfYXR0clthXSxcclxuXHRcdFx0XHRcdH0pKSxcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGlmICghdGhpcy5hZnRlcl9vay5pZC5pbmNsdWRlcygneycpKSB0aGlzLmFmdGVyX29rLmlkID0gJ3snICsgdGhpcy5hZnRlcl9vay5pZCArICd9JztcclxuXHRcdFx0XHR2YXIgZGF0YUluZm8gPSB7XHJcblx0XHRcdFx0XHRlZF90eXBlOiBcIjBcIixcclxuXHRcdFx0XHRcdHN0YXJ0X3RyYW5zYWN0aW9uOiB0cnVlLFxyXG5cdFx0XHRcdFx0Y2xhc3NfaWQ6IHRoaXMuJGRhdGEucGFyYW0uRGF0YUNscy5pZCxcclxuXHRcdFx0XHRcdGNsYXNzX25hbWU6ICcnLFxyXG5cdFx0XHRcdFx0ZXZlbnRfaWQ6IHRoaXMuYWZ0ZXJfb2suaWQsXHJcblx0XHRcdFx0XHRldmVudF9uYW1lOiAnJyxcclxuXHRcdFx0XHRcdGRhdGFfb2JqX2lkOiAnJyxcclxuXHRcdFx0XHRcdG9ial9hdHRyOiBvYmpfYXR0cixcclxuXHRcdFx0XHRcdHByal9pZDogJycsXHJcblx0XHRcdFx0XHRyZWZfY2xzX2lkOiAnJyxcclxuXHRcdFx0XHRcdHJlbF9vYmpfaWQ6ICcnLFxyXG5cdFx0XHRcdFx0dXNlcl9sb2dpbjogJycsXHJcblx0XHRcdFx0XHRkYXRhX2pzb246ICcnLFxyXG5cdFx0XHRcdFx0Y29tcG9zZV9pbmZvOiAnJyxcclxuXHRcdFx0XHRcdGlucHV0X3BhcmFtOiAnJyxcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKGRhdGFJbmZvKTtcclxuXHRcdFx0XHQvLyByZXR1cm47XHJcblx0XHRcdFx0dGhpcy4kc3RvcmUuZGlzcGF0Y2goJ3J1bkN1c3RvbUV2ZW50JywgZGF0YUluZm8pLnRoZW4oc3VjY2VzcyA9PiB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhzdWNjZXNzKTtcclxuXHRcdFx0XHRcdGlmIChzdWNjZXNzLmVycl9jb2RlID09IDApIHtcclxuXHRcdFx0XHRcdFx0dmFyIGRhdGEgPSBzdWNjZXNzLnJlc3VsdDtcclxuXHRcdFx0XHRcdFx0aWYgKGRhdGEucmV0ICE9IDApIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgdGlwID0gZGF0YS5lcnJfaW5mbyA/IHR5cGVvZiBkYXRhLmVycl9pbmZvID09ICdzdHJpbmcnID8gZGF0YS5lcnJfaW5mbyA6XHJcblx0XHRcdFx0XHRcdFx0XHRkYXRhXHJcblx0XHRcdFx0XHRcdFx0XHQuZXJyX2luZm8uam9pbignPGJyLz4nKSA6ICcnO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChkYXRhLnJldCA9PSA4MDEpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLnBhcmFtLk9ubHlfU2NyaXB0X0Vycm9yKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBwb3MgPSB0aXAuaW5kZXhPZihcIu+8mlwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHBvcyA+IC0xKSB0aXAgPSB0aXAuc3Vic3RyaW5nKHBvcyArIDEpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVN5cyhcInRpcFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudDogdGlwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgdW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoXCJ0aXBcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiB0aXAgKyAnLCcgKyB0aGlzLnRyYW5zbGF0ZVN5cygndGlwJykgKyAnOicgKyBkYXRhLnJldCxcclxuXHRcdFx0XHRcdFx0XHRcdHNob3dDYW5jZWw6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIHRpcCA9IGRhdGEuaW5mbyA/IHR5cGVvZiBkYXRhLmluZm8gPT0gJ3N0cmluZycgPyBkYXRhLmluZm8gOiBkYXRhLmluZm9cclxuXHRcdFx0XHRcdFx0XHRcdC5qb2luKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnPGJyLz4nKSA6ICcnO1xyXG5cdFx0XHRcdFx0XHRcdGlmICh0aXApIHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwidGlwXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudDogdGlwLFxyXG5cdFx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRjb25maXJtVGV4dDogdGhpcy50cmFuc2xhdGVTeXMoXCJjYW5jZWxcIilcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0dmFyIHJlc3VsdCA9IGRhdGEucmVzdWx0O1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0dW5pLnNob3dNb2RhbCh7XHJcblx0XHRcdFx0XHRcdFx0dGl0bGU6IHRoaXMudHJhbnNsYXRlU3lzKFwiZXJyb3JcIikgKyBcIjdcIixcclxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBzdWNjZXNzLmVycl9tc2csXHJcblx0XHRcdFx0XHRcdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pLmNhdGNoKGV4ID0+IHtcclxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKGV4KTtcclxuXHRcdFx0XHRcdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0XHRcdFx0XHR0aXRsZTogdGhpcy50cmFuc2xhdGVTeXMoJ3RpcCcpICsgXCI3LjFcIixcclxuXHRcdFx0XHRcdFx0Y29udGVudDogZXguZXJyTXNnLFxyXG5cdFx0XHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0Y29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlU3lzKFwiY2FuY2VsXCIpXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGNhbmNlbChlKSB7IC8v5Y+W5raIXHJcblx0XHRcdFx0dW5pLm5hdmlnYXRlQmFjayh7XHJcblx0XHRcdFx0XHRkZWx0YTogMSAvL+i/lOWbnuWxguaVsO+8jDLliJnkuIrkuIrpobVcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSxcclxuXHRcdFx0dHJhbnNsYXRlKHQpIHtcclxuXHRcdFx0XHRpZiAodHlwZW9mIHRoaXMuJHQgPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdGhpcy4kdChgcGFnZS4ke3R9YClcclxuXHRcdFx0XHRlbHNlIHJldHVybiB0O1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR0cmFuc2xhdGVTeXModCkge1xyXG5cdFx0XHRcdGlmICh0eXBlb2YgdGhpcy4kdCA9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0aGlzLiR0KGBzeXMuJHt0fWApXHJcblx0XHRcdFx0ZWxzZSByZXR1cm4gdDtcclxuXHRcdFx0fSxcclxuXHRcdH0sXHJcblx0fTtcclxuPC9zY3JpcHQ+XHJcbjxzdHlsZT5cclxuXHQucG9wdXAtY29udGVudCB7XHJcblx0XHRAaW5jbHVkZSBmbGV4O1xyXG5cclxuXHR9XHJcblxyXG5cdC5wb3B1cC1oZWlnaHQge1xyXG5cdFx0QGluY2x1ZGUgaGVpZ2h0O1xyXG5cdFx0Lyogd2lkdGg6IDIwMHB4OyAqL1xyXG5cdH1cclxuPC9zdHlsZT5cclxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XHJcblx0LnVuaS1wYWdlLW1vZGFsLTMwMTgtMiB7XHJcblx0XHRkaXNwbGF5OiBmbGV4O1xyXG5cdFx0aGVpZ2h0OiBjYWxjKDEwMHZoIC0gMzBycHgpO1xyXG5cdFx0d2lkdGg6IDcyMHJweDtcclxuXHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4gIWltcG9ydGFudDtcclxuXHRcdHBhZGRpbmc6IDE1cnB4O1xyXG5cclxuXHRcdC52LWhlYWRTdHlsZSB7XHJcblx0XHRcdC8qIGJvcmRlcjogMC4xcnB4IHNvbGlkIHJlZDsgKi9cclxuXHRcdFx0LyogbGluZS1oZWlnaHQ6IDMwcnB4OyAqL1xyXG5cdFx0XHQvLyBwYWRkaW5nOiA1cnB4IDA7XHJcblx0XHRcdHdpZHRoOiA5OCU7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gLnYtaGVhZFN0eWxlOmZpcnN0LWNoaWxkIHtcclxuXHRcdC8vIFx0bWFyZ2luLXRvcDogMTVycHg7XHJcblx0XHQvLyB9XHJcblxyXG5cdFx0Ly8gLnYtaGVhZFN0eWxlIC50eHRfdGl0bGUge1xyXG5cdFx0Ly8gXHRmb250LXNpemU6IDM0cnB4O1xyXG5cdFx0Ly8gXHR0ZXh0LWFsaWduOiByaWdodDtcclxuXHRcdC8vIFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG5cdFx0Ly8gXHQvKiB2ZXJ0aWNhbC1hbGlnbjogMjRycHg7ICovXHJcblxyXG5cdFx0Ly8gXHQvKiBib3JkZXI6IDAuMXJweCBzb2xpZCByZWQ7ICovXHJcblx0XHQvLyB9XHJcblxyXG5cdFx0Ly8gLnYtaGVhZFN0eWxlIGlucHV0IHtcclxuXHRcdC8vIFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuXHRcdC8vIFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG5cdFx0Ly8gXHQvKiBib3JkZXI6IDFweCBzb2xpZCAjZDVkNWQ1OyAqL1xyXG5cdFx0Ly8gXHQvKiB3aWR0aDogNjUlOyAqL1xyXG5cdFx0Ly8gXHR3aWR0aDogODUlO1xyXG5cdFx0Ly8gXHRoZWlnaHQ6IDUycnB4O1xyXG5cdFx0Ly8gXHRsaW5lLWhlaWdodDogMzRycHg7XHJcblx0XHQvLyBcdGJhY2tncm91bmQ6ICNGRkY7XHJcblx0XHQvLyBcdGJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDtcclxuXHRcdC8vIFx0Y29sb3I6ICMyZDhjZjA7XHJcblx0XHQvLyBcdHBhZGRpbmc6IDEwcnB4IDhycHggMTJycHg7XHJcblx0XHQvLyBcdGZvbnQtc2l6ZTogMzRycHg7XHJcblx0XHQvLyBcdGZvbnQtZmFtaWx5OiBpbmhlcml0O1xyXG5cdFx0Ly8gXHRib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XHJcblx0XHQvLyBcdHRyYW5zaXRpb24tZHVyYXRpb246IDAuMXM7XHJcblx0XHQvLyBcdG1hcmdpbi10b3A6IDRycHg7XHJcblx0XHQvLyB9XHJcblxyXG5cdFx0Ly8gLnYtaGVhZFN0eWxlIGlucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHtcclxuXHRcdC8vIFx0Zm9udC1zaXplOiAxMnJweDtcclxuXHRcdC8vIH1cclxuXHJcblx0XHQudi1oZWFkU3R5bGUgLmhlYWQtZm9ybSB7XHJcblx0XHRcdC8vIGJvcmRlcjogMC41cHggc29saWQgcmVkO1xyXG5cdFx0XHRtYXJnaW4tYm90dG9tOiA1cHg7XHJcblx0XHR9XHJcblx0XHQudi1oZWFkU3R5bGUgLmZvcm0taXRlbS1zcGFuIHtcclxuXHRcdFx0Ly8gYm9yZGVyOiAwLjVweCBzb2xpZCByZWQ7XHJcblx0XHRcdHBhZGRpbmc6MTRycHggMDtcclxuXHRcdFx0Y29sb3I6ICMyZDhjZjA7XHJcblx0XHRcdHdoaXRlLXNwYWNlOiBub3JtYWw7XHJcblx0XHRcdHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcclxuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG5cdFx0XHQvLyB3aWR0aDogY2FsYygxMDAlIC0gMTAwcHgpO1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHQvLyAuaW5wdXQtd3JhcHBlciB7XHJcblx0XHQvLyBcdGJvcmRlcjogMXB4IHNvbGlkICNkNWQ1ZDU7XHJcblx0XHQvLyBcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuXHRcdC8vIFx0d2lkdGg6IDEwMCU7XHJcblx0XHQvLyBcdGxpbmUtaGVpZ2h0OiAyMnJweDtcclxuXHRcdC8vIFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuXHRcdC8vIH1cclxuXHRcdC5pbnB1dC13cmFwcGVyIHtcblx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNkNWQ1ZDU7XG5cdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRmbGV4LWRpcmVjdGlvbjogcm93O1xuXHRcdFx0XG5cdFx0XHQudW5pLWlucHV0IHtcclxuXHRcdFx0XHRjb2xvcjogIzJkOGNmMDtcblx0XHRcdFx0ZmxleDogMTtcblx0XHRcdFx0cGFkZGluZzogMTBycHggOHJweDtcblx0XHRcdFx0Ly8gaGVpZ2h0OiA0MHJweDtcblx0XHRcdFx0Ly8gbGluZS1oZWlnaHQ6IDQwcnB4O1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHQudW5pLWljb24ge1xuXHRcdFx0XHRwYWRkaW5nOiA4cnB4O1xuXHRcdFx0XHRmb250LXNpemU6IDMycnB4O1xuXHRcdFx0XHRjb2xvcjogcmdiKDE5MiwgMTk2LCAyMDQpO1xuXHRcdFx0fVxuXHRcdH1cclxuXHJcblx0XHQuY2hlY2tfcmVtZW1iZXJQd2QsXHJcblx0XHQuaW5wdXQtc3dpdGNoIHtcclxuXHRcdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuXHRcdFx0bWFyZ2luLWxlZnQ6IDEwcnB4XHJcblx0XHR9XHJcblxyXG5cdFx0W252dWVdIHVuaS12aWV3IHtcclxuXHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xyXG5cdFx0XHRib3JkZXI6IDAgc29saWQgIzAwMDtcclxuXHRcdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcclxuXHRcdH1cclxuXHJcblx0XHQudW5pLWlucHV0IHtcclxuXHRcdFx0LyogYm9yZGVyOiBub25lOyAqL1xyXG5cdFx0fVxyXG5cclxuXHRcdC51bmktaWNvbiB7XHJcblx0XHRcdC8qIGJvcmRlcjogMXB4IHNvbGlkIHJlZDsgKi9cclxuXHRcdFx0d2lkdGg6IDglO1xyXG5cdFx0XHRmb250LWZhbWlseTogdW5paWNvbnM7XHJcblx0XHRcdGZvbnQtc2l6ZTogNDBycHg7XHJcblx0XHRcdGZvbnQtd2VpZ2h0OiA0MDA7XHJcblx0XHRcdGZvbnQtc3R5bGU6IG5vcm1hbDtcclxuXHRcdFx0Lyogd2lkdGg6IDQ4cnB4OyAqL1xyXG5cdFx0XHQvKiBoZWlnaHQ6IDQ4cnB4OyAqL1xyXG5cdFx0XHQvKiBsaW5lLWhlaWdodDogNDRycHg7ICovXHJcblx0XHRcdGNvbG9yOiAjMmQ4Y2YwO1xyXG5cdFx0XHRjdXJzb3I6IHBvaW50ZXI7XHJcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuXHRcdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0LnZpZXctY29udGVudCB7XHJcblx0XHRcdG1pbi1oZWlnaHQ6IDcwMHJweDtcclxuXHRcdFx0LyogYm9yZGVyOjFweCBzb2xpZCByZWQ7ICovXHJcblx0XHR9XHJcblxyXG5cdFx0LmlucHV0LWRpc2FibGVkIHtcclxuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMyAhaW1wb3J0YW50O1xyXG5cdFx0fVxyXG5cclxuXHRcdGJ1dHRvbi5idG5fYWRkIHtcclxuXHRcdFx0d2lkdGg6IDQ5LjUlO1xyXG5cdFx0XHRtYXJnaW4tdG9wOiA1MHJweDtcclxuXHRcdFx0cGFkZGluZzogMjBycHg7XHJcblx0XHRcdGxpbmUtaGVpZ2h0OiAxLjU7XHJcblx0XHRcdGJhY2tncm91bmQ6ICM0RDZBRjQ7XHJcblx0XHRcdGJvcmRlcjogbm9uZTtcclxuXHRcdFx0Y29sb3I6ICNmZmY7XHJcblx0XHRcdGZvbnQtc2l6ZTogMzhycHg7XHJcblx0XHRcdGZvbnQtd2VpZ2h0OiBib2xkO1xyXG5cdFx0XHRmbG9hdDogcmlnaHQ7XHJcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuXHRcdH1cclxuXHJcblx0XHRidXR0b24uYnRuX2NhbmNlbCB7XHJcblx0XHRcdHdpZHRoOiA0OS41JTtcclxuXHRcdFx0bWFyZ2luLXRvcDogNTBycHg7XHJcblx0XHRcdHBhZGRpbmc6IDIwcnB4O1xyXG5cdFx0XHRsaW5lLWhlaWdodDogMS41O1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xyXG5cdFx0XHRib3JkZXI6IG5vbmU7XHJcblx0XHRcdGNvbG9yOiAjMDAwO1xyXG5cdFx0XHRmb250LXNpemU6IDM4cnB4O1xyXG5cdFx0XHRmb250LXdlaWdodDogYm9sZDtcclxuXHRcdFx0ZmxvYXQ6IGxlZnQ7XHJcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuXHRcdH1cclxuXHJcblx0XHQudmlldy1wb3B1cCB7XHJcblx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuXHRcdH1cclxuXHJcblx0XHQucG9wdXAtY29udGVudCB7XHJcblx0XHRcdC8vIEBpbmNsdWRlIGZsZXg7XHJcblx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcblx0XHRcdGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG5cdFx0XHRwYWRkaW5nOiAzMHJweDtcclxuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcclxuXHRcdFx0LyogaGVpZ2h0OiAxNTBweDsgKi9cclxuXHRcdFx0LyogYm9yZGVyOiAxcHggc29saWQgcmVkOyAqL1xyXG5cdFx0fVxyXG5cclxuXHRcdC5wb3B1cC1jb250IHtcclxuXHRcdFx0b3ZlcmZsb3cteTogYXV0bztcclxuXHRcdFx0LyogYm9yZGVyOiAxcHggc29saWQgcmVkOyAqL1xyXG5cdFx0fVxyXG5cclxuXHRcdC5wb3B1cC1oZWlnaHQge1xyXG5cdFx0XHQvLyBAaW5jbHVkZSBoZWlnaHQ7XHJcblx0XHRcdC8qIHdpZHRoOiAyMDBweDsgKi9cclxuXHRcdH1cclxuXHJcblx0XHQucG9wdXAtaGVhZGVyIHtcclxuXHRcdFx0Zm9udC1zaXplOiA0MnJweDtcclxuXHRcdFx0Zm9udC13ZWlnaHQ6IGJvbGQ7XHJcblx0XHRcdG1hcmdpbjogMjBycHggMjBycHggMHB4IDIwcnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC52aWV3X3BvcHVwX0NoZWNrTGlzdCB7XHJcblx0XHRcdG1hcmdpbi1ib3R0b206IDIwcnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5wb3B1cC1mb290ZXIge1xyXG5cdFx0XHRmbG9hdDogcmlnaHQ7XHJcblx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuXHRcdFx0Ym90dG9tOiAwO1xyXG5cdFx0XHRyaWdodDogMjBycHg7XHJcblx0XHR9XHJcblxyXG5cdFx0YnV0dG9uLmJ0bl9wb3B1cF9hZGQge1xyXG5cdFx0XHR3aWR0aDogMTgwcnB4O1xyXG5cdFx0XHRtYXJnaW4tdG9wOiA1MHJweDtcclxuXHRcdFx0bWFyZ2luLXJpZ2h0OiAyMHJweDtcclxuXHRcdFx0cGFkZGluZzogMTVycHg7XHJcblx0XHRcdGxpbmUtaGVpZ2h0OiAxLjU7XHJcblx0XHRcdGJhY2tncm91bmQ6ICMyN0E2RTE7XHJcblx0XHRcdGJvcmRlcjogbm9uZTtcclxuXHRcdFx0Y29sb3I6ICNmZmY7XHJcblx0XHRcdGZvbnQtc2l6ZTogMzhycHg7XHJcblx0XHRcdGZvbnQtd2VpZ2h0OiBib2xkO1xyXG5cdFx0XHQvKiBmbG9hdDogbGVmdDsgKi9cclxuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG5cdFx0fVxyXG5cclxuXHRcdGJ1dHRvbi5idG5fcG9wdXBfY2FuY2VsIHtcclxuXHRcdFx0d2lkdGg6IDE4MHJweDtcclxuXHRcdFx0bWFyZ2luLXRvcDogNTBycHg7XHJcblx0XHRcdHBhZGRpbmc6IDE1cnB4O1xyXG5cdFx0XHRsaW5lLWhlaWdodDogMS41O1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjMjdBNkUxO1xyXG5cdFx0XHRib3JkZXI6IG5vbmU7XHJcblx0XHRcdGNvbG9yOiAjZmZmO1xyXG5cdFx0XHRmb250LXNpemU6IDM4cnB4O1xyXG5cdFx0XHRmb250LXdlaWdodDogYm9sZDtcclxuXHRcdFx0LyogZmxvYXQ6IHJpZ2h0OyAqL1xyXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcblx0XHR9XHJcblxyXG5cdFx0I2R2X3NlbGVjdCB7XHJcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuXHRcdFx0Ly8gd2lkdGg6IDY2JTtcclxuXHRcdFx0YmFja2dyb3VuZDogI0ZGRjtcclxuXHRcdFx0Ym9yZGVyLXJhZGl1czogMCAhaW1wb3J0YW50O1xyXG5cdFx0XHRjb2xvcjogIzJkOGNmMDtcclxuXHRcdFx0LyogcGFkZGluZzogMTBycHggOHJweCAxMnJweDsgKi9cclxuXHRcdFx0Zm9udC1zaXplOiAzNHJweDtcclxuXHRcdFx0Zm9udC1mYW1pbHk6IGluaGVyaXQ7XHJcblx0XHRcdGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcclxuXHRcdFx0dHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xcztcclxuXHRcdFx0bWFyZ2luLXRvcDogMHJweDtcclxuXHRcdFx0LyogdmVydGljYWwtYWxpZ246IDEwcHg7ICovXHJcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcblx0XHR9XHJcblxyXG5cdFx0I2R2X3NlbGVjdCAudW5pLXNlbGVjdCB7XHJcblx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XHJcblx0XHRcdGJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDtcclxuXHRcdFx0Y29sb3I6ICMyZDhjZjA7XHJcblx0XHR9XHJcblxyXG5cdFx0I2R2X3NlbGVjdCAudW5pLXNlbGVjdF9faW5wdXQtdGV4dCB7XHJcblx0XHRcdGNvbG9yOiAjMmQ4Y2YwO1xyXG5cdFx0fVxyXG5cclxuXHRcdC5wYW5lbF90aXRsZSB7XHJcblx0XHRcdGZvbnQtc2l6ZTogMzhycHg7XHJcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICMyN0E2RTE7XHJcblx0XHRcdGxpbmUtaGVpZ2h0OiA4MHJweDtcclxuXHRcdFx0Y29sb3I6ICNmZmY7XHJcblx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcclxuXHRcdFx0Zm9udC13ZWlnaHQ6IGJvbGQ7XHJcblx0XHR9XHJcblxyXG5cdFx0LnYtcGFuZWwge1xyXG5cdFx0XHRtaW4taGVpZ2h0OiA3ODhycHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LnYtcGFuZWxsaXN0IHtcclxuXHRcdFx0Ym9yZGVyOiA0cnB4IHNvbGlkICNhYWE7XHJcblx0XHRcdGJvcmRlci1yYWRpdXM6IDEwcnB4O1xyXG5cdFx0XHRtYXJnaW46IDEwcnB4IDIwcnB4IDBycHggMjBycHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LnYtcGFuZWxkZWwge1xyXG5cdFx0XHR0ZXh0LWFsaWduOiByaWdodDtcclxuXHRcdH1cclxuXHJcblx0XHQucGFuZWxfZGVsIHtcclxuXHRcdFx0Zm9udC1zaXplOiA0NHJweDtcclxuXHRcdFx0dGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xyXG5cdFx0XHRtYXJnaW4tdG9wOiAxMHJweDtcclxuXHRcdFx0bWFyZ2luLXJpZ2h0OiAyMHJweDtcclxuXHRcdH1cclxuXHJcblx0XHQuY2xhc3NfYXR0cl9ib2R5IC5mb3JtLWdyb3VwIHtcclxuXHRcdFx0bWFyZ2luOiAyMHJweCAzMHJweDtcclxuXHRcdFx0LyogbWFyZ2luLWxlZnQ6IC0xMnB4O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAtMTJweDsgKi9cclxuXHRcdH1cclxuXHJcblx0XHQuc3ViY2xhc3NfYXR0cl9ib2R5IC5mb3JtLWdyb3VwIHtcclxuXHRcdFx0bWFyZ2luOiAyMHJweCAxMHJweDtcclxuXHRcdFx0LyogbWFyZ2luLWxlZnQ6IC0xMnB4O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAtMTJweDsgKi9cclxuXHRcdH1cclxuXHJcblx0XHQuZm9ybS1ncm91cD5sYWJlbFtjbGFzcyo9XCJjb2wtXCJdIHtcclxuXHRcdFx0bWFyZ2luLWJvdHRvbTogOHJweDtcclxuXHRcdFx0Zm9udC1zaXplOiAzMnJweDtcclxuXHRcdH1cclxuXHJcblx0XHQuZm9ybS1ncm91cCBsYWJlbCB7XHJcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcblx0XHRcdGxpbmUtaGVpZ2h0OiA2MHJweDtcclxuXHRcdH1cclxuXHJcblx0XHQudHhfdGl0bGUyIHtcclxuXHRcdFx0Zm9udC1zaXplOiAzMnJweDtcclxuXHRcdFx0dGV4dC1hbGlnbjogcmlnaHQ7XHJcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuXHRcdFx0dmVydGljYWwtYWxpZ246IC0ycHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LmF0dHJfZmllbGQge1xyXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcblx0XHRcdG1hcmdpbi1sZWZ0OiA4cHg7XHJcblx0XHRcdC8qIHdpZHRoOiA3MSU7ICovXHJcblx0XHR9XHJcblxyXG5cdFx0LnRleHQtcmlnaHQyIHtcclxuXHRcdFx0bWFyZ2luOiAwO1xyXG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogLTRweDtcclxuXHRcdFx0bWFyZ2luLWxlZnQ6IDlweDtcclxuXHRcdFx0ZmxvYXQ6IG5vbmU7XHJcblx0XHRcdGZvbnQtc2l6ZTogNDRycHg7XHJcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuXHRcdH1cclxuXHJcblx0XHRpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XHJcblx0XHRcdGZvbnQtc2l6ZTogMTJycHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LnYtcGFuZWwgaW5wdXQge1xyXG5cdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjZDVkNWQ1O1xyXG5cdFx0XHR3aWR0aDogOTglO1xyXG5cdFx0XHRoZWlnaHQ6IDUycnB4O1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjRkZGO1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAwICFpbXBvcnRhbnQ7XHJcblx0XHRcdGNvbG9yOiAjMDQ2ZGIzO1xyXG5cdFx0XHRwYWRkaW5nOiAxMHJweCA4cnB4IDEycnB4O1xyXG5cdFx0XHRmb250LXNpemU6IDM0cnB4O1xyXG5cdFx0XHRmb250LWZhbWlseTogaW5oZXJpdDtcclxuXHRcdFx0Ym94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xyXG5cdFx0XHR0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjFzO1xyXG5cdFx0XHRtYXJnaW4tdG9wOiA0cnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5kYXRlX2lwdXQge1xyXG5cdFx0XHQvKiBib3JkZXI6IDFweCBzb2xpZCAjZDVkNWQ1OyAqL1xyXG5cdFx0XHQvKiB3aWR0aDogOTglOyAqL1xyXG5cdFx0XHRoZWlnaHQ6IDYycnB4O1xyXG5cdFx0XHRiYWNrZ3JvdW5kOiAjRkZGO1xyXG5cdFx0XHRib3JkZXItcmFkaXVzOiAwICFpbXBvcnRhbnQ7XHJcblx0XHRcdGNvbG9yOiAjMDQ2ZGIzO1xyXG5cdFx0XHRwYWRkaW5nOiAxMHJweCA4cnB4IDRycHg7XHJcblx0XHRcdGZvbnQtc2l6ZTogMzRycHg7XHJcblx0XHRcdGZvbnQtZmFtaWx5OiBpbmhlcml0O1xyXG5cdFx0XHRib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XHJcblx0XHRcdHRyYW5zaXRpb24tZHVyYXRpb246IDAuMXM7XHJcblx0XHR9XHJcblxyXG5cdFx0LmR2X2lucHV0IHtcclxuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG5cdFx0XHR3aWR0aDogNjUlO1xyXG5cdFx0XHQvKiBsaW5lLWhlaWdodDogMjJycHg7ICovXHJcblx0XHR9XHJcblxyXG5cdFx0LnZpZXctZmxvb3Ige1xyXG5cdFx0XHRwYWRkaW5nOiAwIDIwcnB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5kZW1vLXVuaS1yb3cge1xyXG5cdFx0XHRtYXJnaW4tYm90dG9tOiAwcHg7XHJcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xyXG5cdFx0fVxyXG5cclxuXHRcdDo6di1kZWVwIC51bmktcm93IHtcclxuXHRcdFx0bWFyZ2luLWJvdHRvbTogMHB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC52aWV3LXRhYnBhZ2UgOjp2LWRlZXAgLnVuaS1yb3cge1xyXG5cdFx0XHRtYXJnaW4tYm90dG9tOiA1cHg7XHJcblx0XHR9XHJcblxyXG5cdFx0LmRlbW8tdW5pLWNvbCB7XHJcblx0XHRcdGhlaWdodDogMzZweDtcclxuXHRcdFx0Ym9yZGVyLXJhZGl1czogNXB4O1xyXG5cdFx0fVxyXG5cclxuXHRcdC5kZW1vLXVuaS1yb3cgLnVuaS1pbnB1dCB7XHJcblx0XHRcdHdpZHRoOiBjYWxjKDEwMCUgLSAxMjBweCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LnRleHQge1xyXG5cdFx0XHRmb250LXNpemU6IDEycHg7XHJcblx0XHRcdGNvbG9yOiAjNjY2O1xyXG5cdFx0XHRtYXJnaW4tdG9wOiA1cHg7XHJcblx0XHR9XHJcblx0fVxyXG48L3N0eWxlPiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///159\n");
/***/ }),
/* 160 */