diff --git a/.gitignore b/.gitignore index 88a3611..09cddb9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules dist +build out .history .DS_Store diff --git a/.vscode/settings.json b/.vscode/settings.json index 90ff31b..23c39da 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "vscode.typescript-language-features" }, "[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" @@ -13,4 +13,4 @@ "src/renderer/src/assets/i18n/lang" ], "liveServer.settings.port": 5501 -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 59e8964..6a6dc25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "axios": "^1.11.0", "electron-updater": "^6.3.9", "element-plus": "^2.10.4", + "js-md5": "^0.8.3", "mitt": "^3.0.1", "pinia": "^3.0.3", "pinia-plugin-persistedstate": "^4.4.1", @@ -8452,6 +8453,11 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/js-md5": { + "version": "0.8.3", + "resolved": "https://registry.npmmirror.com/js-md5/-/js-md5-0.8.3.tgz", + "integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", diff --git a/src/renderer/index.html b/src/renderer/index.html index ec9ba4f..6bcd376 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -5,8 +5,7 @@ Electron - + diff --git a/src/renderer/public/sdk/YJEarth.min.js b/src/renderer/public/sdk/YJEarth.min.js index 1266e31..d210731 100644 --- a/src/renderer/public/sdk/YJEarth.min.js +++ b/src/renderer/public/sdk/YJEarth.min.js @@ -1,4 +1,4 @@ -/*! update time: 2025/9/4 20:01:23*/ +/*! update time: 2025/9/4 21:13:53*/ /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; @@ -1895,7 +1895,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _bab /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/CurvelineObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _eventBinding__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./eventBinding */ \"./src/Obj/Base/CurvelineObject/eventBinding.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Controller_index__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../Controller/index */ \"./src/Controller/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * @description 线\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar CurvelineObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 曲线\r\n * @param options {object} 线属性\r\n * @param options.name{string} 名称\r\n * @param options.width=3{number} 线宽\r\n * @param options.color=#ff0000 {string} 颜色\r\n * @param options.type=0 {number} 材质类型 0-实线 1-虚线 2-泛光...\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对高度;2:依附模式)\r\n * @param options.noseToTail=false {boolean} 首尾相连\r\n * @param options.extend=false {boolean} 线缓冲\r\n * @param options.extendWidth=10 {number} 线缓冲宽度\r\n * @param options.extendColor=rgba(255,255,80,0.3) {number} 线缓冲颜色\r\n * @param options.show=true {boolean} 显隐\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {string} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * \r\n * \r\n * @param _Dialog {object} 弹框事件\r\n * @param _Dialog.confirmCallBack {function} 弹框确认时的回调\r\n * */\n function CurvelineObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, CurvelineObject);\n _this2 = _callSuper(this, CurvelineObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.width = options.width || options.width === 0 ? options.width : 3;\n _this2.options.color = options.color || '#ff0000';\n _this2.options.type = options.type ? Number(options.type) : 0;\n _this2.options.noseToTail = options.noseToTail || false;\n _this2.options.extend = options.extend || false;\n _this2.options.rotate = options.rotate || options.rotate === false ? options.rotate : true;\n _this2.options.space = options.space || 1;\n _this2.options.speed = options.speed || 10;\n // this.options.dashSize = options.dashSize || 0.03\n _this2.options.wordsName = options.wordsName || '空间长度';\n _this2.options.extendWidth = options.extendWidth || options.extendWidth === 0 ? options.extendWidth : 10;\n _this2.options.extendColor = options.extendColor || 'rgba(255,255,80,0.3)';\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2._elms = [];\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n // this.options.attribute.camera = this.options.attribute.camera || {}\n // this.options.attribute.camera.content =\n // this.options.attribute.camera.content || []\n // this.options.attribute.vr = this.options.attribute.vr || {}\n // this.options.attribute.vr.content =\n // this.options.attribute.vr.content || []\n // this.options.attribute.goods = this.options.attribute.goods || {}\n // this.options.attribute.goods.content =\n // this.options.attribute.goods.content || []\n\n delete _this2.options.attribute.camera;\n delete _this2.options.attribute.vr;\n delete _this2.options.attribute.goods;\n _this2.operate = {};\n _this2.nodePoints = [];\n _this2.unitNum = 0;\n _this2.inputSpeed = options.speed && Math.pow(options.speed, -1) * 100 || 10;\n _this2.Dialog = _Dialog;\n if (!_this2.options.positions || _this2.options.positions.length < 2) {\n _this2._error = '线段最少需要两个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n for (var i = 0; i < _this2.options.positions.length; i++) {\n _this2.options.positions[i].lng = Number(Number(_this2.options.positions[i].lng).toFixed(8));\n _this2.options.positions[i].lat = Number(Number(_this2.options.positions[i].lat).toFixed(8));\n _this2.options.positions[i].alt = Number(Number(_this2.options.positions[i].alt).toFixed(2));\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n CurvelineObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(CurvelineObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(CurvelineObject, [{\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || '#ff0000';\n // this.entity.polyline.material = this.getMaterial(v, this.options.type)\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,1)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"speed\",\n get: function get() {\n return this.options.speed;\n },\n set: function set(v) {\n this.options.speed = v;\n // this.options.speed = v !== 0 ? Math.pow(v, -1) * 100 : 0\n this.inputSpeed = v !== 0 ? Math.pow(v, -1) * 100 : 0;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n // get dashSize() {\n // return this.options.dashSize\n // }\n\n // set dashSize(v) {\n // this.options.dashSize = v\n // let params = { ...this.options }\n // params.speed = this.inputSpeed\n // // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params)\n // }\n }, {\n key: \"rotate\",\n get: function get() {\n return this.options.rotate;\n },\n set: function set(v) {\n this.options.rotate = v;\n this.closeNodeEdit();\n this._elms.rotate && this._elms.rotate.forEach(function (item) {\n item.checked = v;\n });\n this.options.rotate = v;\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options);\n }\n }, {\n key: \"space\",\n get: function get() {\n return this.options.space;\n },\n set: function set(v) {\n this.options.space = v;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n }, {\n key: \"length\",\n get: function get() {\n return this.options.length;\n },\n set: function set(v) {\n this.options.length = v;\n //判断数值是否大于1000m\n\n this._elms.length && this._elms.length.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"fitLength\",\n get: function get() {\n return this.options.fitLength;\n },\n set: function set(v) {\n this.options.fitLength = v;\n this._elms.fitLength && this._elms.fitLength.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"wordsName\",\n get: function get() {\n return this.options.wordsName;\n },\n set: function set(v) {\n this.options.wordsName = v;\n this._elms.wordsName && this._elms.wordsName.forEach(function (item) {\n item.value = v;\n });\n var _this = this;\n if (!this.noseToTail) {\n this.computeDistance(this.smoothHandle(this.options.positions), 2, v).then(function (res) {\n _this.lengthByMeter = res;\n });\n } else {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n }\n }\n\n // get fitLengthUnit() {\n // return this.options['fit-length-unit']\n // }\n // set fitLengthUnit(v) {\n // this.options['fit-length-unit'] = v\n // this._elms.fitLengthUnit &&\n // this._elms.fitLengthUnit.forEach(item => {\n // item.value = v\n // })\n // if (this.options.fitLengthByMeter) {\n // switch (v) {\n // case '米':\n // this.fitLength = this.options.fitLengthByMeter\n // break\n // case '千米':\n // this.fitLength = Number(\n // (this.options.fitLengthByMeter / 1000).toFixed(5)\n // )\n // break\n // default:\n // this.fitLength = this.options.fitLengthByMeter\n // }\n // }\n // }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.width;\n },\n set: function set(v) {\n var _this4 = this;\n this.options.width = v || v == 0 ? v : 3;\n this._elms.lineWidth && this._elms.lineWidth.forEach(function (item) {\n item.value = _this4.options.width;\n });\n if (this.entity && this.entity.polyline) {\n this.entity.polyline.width = this.entity.polyline.width + v - this.entity.polyline.oriWidth;\n this.entity.polyline.oriWidth = this.options.width;\n }\n // this.entity &&\n // this.entity.polyline &&\n // (this.entity.polyline.width = this.options.width) && (this.entity.polyline.oriWidth = this.options.width)\n }\n }, {\n key: \"lineType\",\n get: function get() {\n return this.options.type;\n },\n set: function set(v) {\n var _this5 = this;\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n this.options.type = Number(v);\n var _loop = function _loop(i) {\n if (lineTypeData[i].key === Number(v)) {\n _this5._elms.lineType && _this5._elms.lineType.forEach(function (item) {\n item.value = lineTypeData[i].value;\n if (2 < item.value && item.value < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < item.value && item.value < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n });\n return 1; // break\n }\n };\n for (var i = 0; i < lineTypeData.length; i++) {\n if (_loop(i)) break;\n }\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n this.entity && this.entity.polyline && (this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params));\n }\n }, {\n key: \"noseToTail\",\n get: function get() {\n return this.options.noseToTail;\n },\n set: function set(v) {\n this.options.noseToTail = v;\n this.closeNodeEdit();\n this._elms.noseToTail && this._elms.noseToTail.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n }\n // if (v) {\n // if (this.options.fitLengthByMeter > 1000 || this.options.fitLengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n\n // } else {\n // if (this.options.lengthByMeter > 1000 || this.options.lengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n // }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this6 = this;\n this.positionEditing = false;\n this.options.heightMode = v || v == 0 ? v : 2;\n var heightModeName = '';\n this.closeNodeEdit();\n var ground = false;\n var disabled = false;\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n this.entity.polyline.clampToGround = ground;\n heightModeName = '依附模型';\n break;\n }\n\n // this.options.lengthByMeter = this.computeDistance2(\n // this.smoothHandle(this.options.positions),\n // 2,\n // ground\n // )\n this.lengthUnit = this.lengthUnit;\n this._elms.heightMode && (this._elms.heightMode.value = heightModeName);\n this._elms.heightModeObject && this._elms.heightModeObject.legp_searchActive(heightModeName);\n if (disabled) {\n this._elms.heightBox && (this._elms.heightBox.className = 'input-number input-number-unit-1 height-box disabled');\n this._elms.heightConfirm && this._elms.heightConfirm.setAttribute('disabled', 'disabled');\n } else {\n this._elms.heightBox && (this._elms.heightBox.className = 'input-number input-number-unit-1 height-box');\n this._elms.heightConfirm && this._elms.heightConfirm.removeAttribute('disabled');\n }\n setTimeout(function () {\n if (ground) {\n _this6.label.ground = ground;\n _this6._elms.heightMode && (_this6._elms.heightMode.value = '依附模型');\n _this6.label.position = [_this6.options.positions[0].lng, _this6.options.positions[0].lat];\n } else {\n _this6.label.ground = ground;\n _this6.label.position = [_this6.options.positions[0].lng, _this6.options.positions[0].lat, fromDegreesArray[2]];\n _this6.options.label.position = {\n lng: _this6.options.positions[0].lng,\n lat: _this6.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n }\n }, 0);\n }\n }, {\n key: \"extend\",\n get: function get() {\n return this.options.extend;\n },\n set: function set(v) {\n this.options.extend = v;\n this.closeNodeEdit();\n if (v) {\n this.heightMode = 2;\n }\n this._elms.extend && this._elms.extend.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n if (this.options.extend) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n } else {\n this.entity.polygon = undefined;\n }\n }\n }\n }, {\n key: \"extendWidth\",\n get: function get() {\n return this.options.extendWidth;\n },\n set: function set(v) {\n this.options.extendWidth = v;\n this._elms.extendWidth && this._elms.extendWidth.forEach(function (item) {\n item.value = v;\n });\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n }\n }, {\n key: \"extendColor\",\n get: function get() {\n return this.options.extendColor;\n },\n set: function set(v) {\n var _this7 = this;\n this.options.extendColor = v;\n if (this._elms.extendColor) {\n this._elms.extendColor.forEach(function (item, i) {\n var extendColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this7.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this7.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this7.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this7._elms.extendColor[i] = extendColorPicker;\n });\n }\n this.entity && this.entity.polygon && (this.entity.polygon.material = Cesium.Color.fromCssColorString(this.options.extendColor));\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n setTimeout(function () {\n _this8.label.position = [_this8.options.positions[0].lng, _this8.options.positions[0].lat, _this8.options.positions[0].alt];\n }, 0);\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this9.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this9.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this9.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this9._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this11 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this11.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this11._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this12 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this12.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this12._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"attributeType\",\n get: function get() {\n return this.options.attributeType;\n },\n set: function set(v) {\n this.options.attributeType = v;\n this._elms.attributeType && this._elms.attributeType.forEach(function (item) {\n item.value = v;\n });\n var attributeContent = this._DialogObject._element.content.getElementsByClassName('attribute-content');\n for (var i = 0; i < attributeContent.length; i++) {\n if (attributeContent[i].className.indexOf('attribute-content-' + v) > -1) {\n attributeContent[i].style.display = 'block';\n } else {\n attributeContent[i].style.display = 'none';\n }\n }\n }\n }, {\n key: \"attributeLink\",\n get: function get() {\n return this.options.attribute.link.content;\n },\n set: function set(v) {\n var _this13 = this;\n this.options.attribute.link.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-link').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.link.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.link.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.link.content[i].name + \"
\\n
\" + this.options.attribute.link.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n linkEdit: function () {\n var _linkEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(index) {\n var table, tableContent, item, _loop2, _i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return _this13.options.attribute.link.content;\n case 2:\n _this13.attributeLink = _context3.sent;\n table = _this13._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop2 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop2(_i) {\n var height, _html, textareaElm, td, btn, n, _iterator, _step, _loop3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(index === _i)) {\n _context2.next = 36;\n break;\n }\n height = item[_i].offsetHeight;\n _html = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i].innerHTML = _html;\n textareaElm = item[_i].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this13.options.attribute.link.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this13.options.attribute.link.content[index].url;\n btn = item[_i].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context2.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context2.next = 14;\n break;\n }\n return _context2.abrupt(\"continue\", 32);\n case 14:\n _iterator = _createForOfIteratorHelper(btn[n].attributes);\n _context2.prev = 15;\n _loop3 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop3() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop3$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n m = _step.value;\n if (!(m.name === '@click')) {\n _context.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _loop3);\n });\n _iterator.s();\n case 18:\n if ((_step = _iterator.n()).done) {\n _context2.next = 24;\n break;\n }\n return _context2.delegateYield(_loop3(), \"t0\", 20);\n case 20:\n if (!_context2.t0) {\n _context2.next = 22;\n break;\n }\n return _context2.abrupt(\"break\", 24);\n case 22:\n _context2.next = 18;\n break;\n case 24:\n _context2.next = 29;\n break;\n case 26:\n _context2.prev = 26;\n _context2.t1 = _context2[\"catch\"](15);\n _iterator.e(_context2.t1);\n case 29:\n _context2.prev = 29;\n _iterator.f();\n return _context2.finish(29);\n case 32:\n n++;\n _context2.next = 11;\n break;\n case 35:\n return _context2.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context2.stop();\n }\n }, _loop2, null, [[15, 26, 29, 32]]);\n });\n _i = 0;\n case 8:\n if (!(_i < item.length)) {\n _context3.next = 15;\n break;\n }\n return _context3.delegateYield(_loop2(_i), \"t0\", 10);\n case 10:\n if (!_context3.t0) {\n _context3.next = 12;\n break;\n }\n return _context3.abrupt(\"break\", 15);\n case 12:\n _i++;\n _context3.next = 8;\n break;\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }, _callee);\n }));\n function linkEdit(_x) {\n return _linkEdit.apply(this, arguments);\n }\n return linkEdit;\n }(),\n linkDelete: function linkDelete(i) {\n _this13.options.attribute.link.content.splice(i, 1);\n _this13.attributeLink = _this13.options.attribute.link.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, '');\n var url = value.url && value.url.replace(/\\s/g, '');\n if (name && url) {\n _this13.options.attribute.link.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this13.attributeLink = _this13.options.attribute.link.content;\n },\n cancelEdit: function cancelEdit() {\n _this13.attributeLink = _this13.options.attribute.link.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect);\n fileElm.addEventListener('change', _fileSelect);\n }\n };\n var _fileSelect = function _fileSelect(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop4 = function _loop4(_i2) {\n var btn = item[_i2].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator2 = _createForOfIteratorHelper(btn[n].attributes),\n _step2;\n try {\n var _loop5 = function _loop5() {\n var m = _step2.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i2);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n if (_loop5()) break;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n };\n for (var _i2 = 0; _i2 < item.length; _i2++) {\n _loop4(_i2);\n }\n }\n\n // get attributeCamera() {\n // return this.options.attribute.camera.content\n // }\n\n // set attributeCamera(v) {\n // this.options.attribute.camera.content = v\n // }\n\n // get attributeVr() {\n // return this.options.attribute.vr.content\n // }\n\n // set attributeVr(v) {\n // this.options.attribute.vr.content = v\n // if (\n // !this._DialogObject ||\n // !this._DialogObject._element ||\n // !this._DialogObject._element.content ||\n // this._DialogObject._element.content.getElementsByClassName(\n // 'attribute-content-vr'\n // ).length == 0\n // ) {\n // return\n // }\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // tableContent.innerHTML = ''\n // if (this.options.attribute.vr.content.length > 0) {\n // table.getElementsByClassName('table-empty')[0].style.display = 'none'\n // } else {\n // table.getElementsByClassName('table-empty')[0].style.display = 'flex'\n // }\n // for (let i = 0; i < this.options.attribute.vr.content.length; i++) {\n // let tr =\n // `\n //
\n //
` +\n // this.options.attribute.vr.content[i].name +\n // `
\n //
` +\n // this.options.attribute.vr.content[i].url +\n // `
\n //
\n // \n // \n //
\n //
`\n // let trElm = document.createRange().createContextualFragment(tr)\n // tableContent.appendChild(trElm)\n // }\n // let item = tableContent.getElementsByClassName('tr')\n // let fun = {\n // vrEdit: async index => {\n // this.attributeVr = await this.options.attribute.vr.content\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // let item = tableContent.getElementsByClassName('tr')\n // for (let i = 0; i < item.length; i++) {\n // if (index === i) {\n // let height = item[i].offsetHeight\n // let html = `\n //
\n // \n //
\n //
\n // \n //
\n //
\n // \n // \n //
`\n // item[i].innerHTML = html\n // let textareaElm = item[i].getElementsByClassName('link-edit')[0]\n // textareaElm.style.height = height - 10 + 'px'\n // let td = item[i].getElementsByClassName('td')\n // td[0].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].name\n // td[1].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].url\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](\n // {\n // name: td[0].getElementsByClassName('input')[0].value,\n // url: td[1].getElementsByClassName('input')[0].value\n // },\n // i\n // )\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // break\n // }\n // }\n // },\n // vrDelete: i => {\n // this.options.attribute.vr.content.splice(i, 1)\n // this.attributeVr = this.options.attribute.vr.content\n // },\n\n // confirmEdit: (value, i) => {\n // let name = value.name && value.name.replace(/\\s/g, '')\n // let url = value.url && value.url.replace(/\\s/g, '')\n // if (name && url) {\n // this.options.attribute.vr.content[i] = value\n // } else {\n // window.ELEMENT &&\n // window.ELEMENT.Message({\n // message: '名称或链接不能为空!',\n // type: 'warning',\n // duration: 1500\n // })\n // }\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // cancelEdit: () => {\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // fileSelect: (value, i) => {\n // let fileElm = item[i].getElementsByClassName('file-select')[0]\n // fileElm.click()\n // fileElm.removeEventListener('change', fileSelect)\n // fileElm.addEventListener('change', fileSelect)\n // }\n // }\n // let fileSelect = event => {\n // if (event.target.value) {\n // let td = item[\n // event.target.getAttribute('index')\n // ].getElementsByClassName('td')\n // td[1].getElementsByClassName('input')[0].value = event.target.value\n // event.target.value = null\n // }\n // }\n // for (let i = 0; i < item.length; i++) {\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](i)\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // }\n // }\n\n // get attributeGoods() {\n // return this.options.attribute.goods.content\n // }\n\n // set attributeGoods(v) {\n // this.options.attribute.goods.content = v\n // }\n }, {\n key: \"judgeLine\",\n value: function judgeLine(entity, newParam) {\n if (!entity.polyline.oriRepeat) {\n var param = {\n color: newParam.color,\n image: this.getSourceRootPath() + \"/img/arrow/1.png\",\n space: newParam.space,\n speed: newParam.speed\n };\n param.speed = newParam.rotate ? param.speed : 0 - param.speed;\n var canvasEle = document.createElement('canvas');\n var ctx = canvasEle.getContext('2d');\n var myImg = new Image();\n // myImg.src = that.getSourceRootPath() + '/img/arrow/1.png'\n myImg.src = param.image;\n var that = this;\n myImg.onload = function () {\n canvasEle.width = myImg.width * (param.space + 1);\n canvasEle.height = myImg.height;\n var oriRepeat = that.getSceenLine(entity, param, canvasEle);\n oriRepeat && (entity.polyline.oriRepeat = oriRepeat);\n var positionProperty = entity.polyline.positions;\n var positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime);\n if (!Cesium.defined(positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < positions.length - 1; ++i) {\n distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]);\n }\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = that.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = that.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = that.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n repeatX *= groundResolution / cameraHeight / (param.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var speed = repeatX / entity.polyline.oriRepeat;\n entity.polyline.oriSpeed = speed;\n entity.polyline.oriRepeatX = repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n entity.polyline.oriSpeed = sdk3dEntity.polyline.oriSpeed;\n entity.polyline.oriRepeatX = sdk3dEntity.polyline.oriRepeatX;\n }\n };\n }\n }\n /**获取当前满屏横线速度 */\n }, {\n key: \"getSceenLine\",\n value: function getSceenLine(entity, options, canvasEle) {\n var point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight);\n // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1)\n // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2)\n\n var ray = this.sdk.viewer.camera.getPickRay(point1);\n var cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n var ray2 = this.sdk.viewer.camera.getPickRay(point2);\n var cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // if (!cartesian1 || !cartesian2) {\n // let ray = this.sdk.viewer.camera.getPickRay(point1);\n // cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n\n // let ray2 = this.sdk.viewer.camera.getPickRay(point2);\n // cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // }\n if (cartesian1 && cartesian2) {\n var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = this.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = this.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = this.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = this.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n // repeatX *= groundResolution / cameraHeight / ((myImg.width / myImg.height * 5) + 1);\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n } else {\n repeatX = undefined;\n }\n if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id);\n return sdk3dEntity.polyline.oriRepeatX;\n }\n }\n }\n /**\r\n * 编辑框\r\n * @param {boolean} state true打开,false关闭\r\n */\n }, {\n key: \"edit\",\n value: (function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2(state) {\n var _this14 = this;\n var _this, tabClick, contentElm, tabsElm, colorPicker, labelColorPicker, extendColorPicker, lineColorPicker, labelBackgroundColorStartPicker, labelBackgroundColorEndPicker, all_elm;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n _this = this;\n this.originalOptions = this.deepCopyObj(this.options);\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n if (!state) {\n _context4.next = 32;\n break;\n }\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n tabClick = function tabClick(e) {\n if (e === '2' || e === 2) {\n //点击线条样式\n if (2 < _this.options.type && _this.options.type < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n }\n }; // 创建标签页\n _context4.next = 7;\n return new _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__[\"default\"](this.sdk, this.options, {\n title: '曲线属性',\n left: '180px',\n top: '100px',\n confirmCallBack: function confirmCallBack(options) {\n _this14.name = _this14.name.trim();\n if (!_this14.name) {\n _this14.name = '未命名对象';\n }\n _this14.options.label.position = {\n lng: _this14.label.position[0],\n lat: _this14.label.position[1],\n alt: _this14.label.position[2]\n };\n _this14.originalOptions = _this14.deepCopyObj(_this14.options);\n _this14._DialogObject.close();\n _this14.Dialog.confirmCallBack && _this14.Dialog.confirmCallBack(_this14.originalOptions);\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(_this14.sdk, _this14.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__[\"syncSplitData\"])(_this14.sdk, _this14.options.id);\n },\n resetCallBack: function resetCallBack() {\n _this14.reset();\n _this14.Dialog.resetCallBack && _this14.Dialog.resetCallBack();\n },\n removeCallBack: function removeCallBack() {\n _this14.Dialog.removeCallBack && _this14.Dialog.removeCallBack();\n },\n closeCallBack: function closeCallBack() {\n _this14.reset();\n _this14.Dialog.closeCallBack && _this14.Dialog.closeCallBack();\n for (var i = 0; i < _this14.nodePoints.length; i++) {\n _this14.sdk.viewer.entities.remove(_this14.nodePoints[i]);\n }\n _this14.nodePoints = [];\n _this14.positionEditing = false;\n },\n showCallBack: function showCallBack(show) {\n _this14.options.show = show;\n _this14.originalOptions.show = show;\n _this14.show = show;\n _this14.Dialog.showCallBack && _this14.Dialog.showCallBack();\n },\n translationalCallBack: function translationalCallBack() {\n _this14.positionEditing = !_this14.positionEditing;\n },\n // 二次编辑回调\n secondaryEditCallBack: function secondaryEditCallBack() {\n _this14.positionEditing = false;\n _this14.noseToTail = false;\n _this14.heightMode = 0;\n _this14.nodeEdit();\n }\n });\n case 7:\n this._DialogObject = _context4.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' polyline';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_10__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__[\"default\"]('polyline-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('color')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n extendColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('extendColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n lineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelLineColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorStart')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this14.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this14.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorEnd')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this14.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this14.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName('*');\n _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].on(this, all_elm);\n this._elms = _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].element;\n this._elms.color = [colorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.extendColor = [extendColorPicker];\n this._elms.labelLineColor = [lineColorPicker];\n this._elms.labelBackgroundColorStart = [labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n setTimeout(function () {\n _this14.attributeLink = _this14.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n var tagData = _this14.attributeSelect;\n var attributeElm = _this14._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(attributeElm, '.attribute-select');\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this14._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var i = 0; i < tagData.length; i++) {\n if (tagData[i].key === _this14.options.attributeType) {\n attributeSelectElm.value = tagData[i].value;\n legpObject.legp_searchActive(tagData[i].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i3 = 0; _i3 < tagData.length; _i3++) {\n if (tagData[_i3].value === attributeSelectElm.value) {\n _this14.attributeType = tagData[_i3].key;\n break;\n }\n }\n });\n }\n var nameData = [{\n name: '空间长度',\n value: '空间长度'\n }, {\n name: '投影长度',\n value: '投影长度'\n }, {\n name: '地表长度',\n value: '地表长度'\n }];\n var nameDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit');\n if (nameDataLegpObject) {\n nameDataLegpObject.legp_search(nameData);\n var nameDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n _this14._elms.wordsName = [nameDataLegpElm];\n nameDataLegpElm.value = _this14.options.wordsName;\n for (var _i4 = 0; _i4 < nameData.length; _i4++) {\n if (nameData[_i4].value === nameDataLegpElm.value) {\n nameDataLegpObject.legp_searchActive(nameData[_i4].value);\n break;\n }\n }\n nameDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < nameData.length; _i5++) {\n if (nameData[_i5].value === nameDataLegpElm.value) {\n _this14.wordsName = nameData[_i5].value;\n break;\n }\n }\n });\n }\n\n // 原始长度单位\n var unitData = [{\n name: '米',\n value: '米'\n }, {\n name: '千米',\n value: '千米'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit', 1);\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-unit')[1].getElementsByTagName('input')[0];\n _this14._elms.lengthUnit = [unitDataLegpElm];\n for (var _i6 = 0; _i6 < unitData.length; _i6++) {\n if (unitData[_i6].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i6].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < unitData.length; _i7++) {\n if (unitData[_i7].value === unitDataLegpElm.value) {\n _this14.lengthUnit = unitData[_i7].value;\n break;\n }\n }\n });\n }\n\n // 拟合长度单位\n // let fitUnitData = [\n // {\n // name: '米',\n // value: '米'\n // },\n // {\n // name: '千米',\n // value: '千米'\n // }\n // ]\n\n // let fitUnitDataLegpObject = legp(\n // this._DialogObject._element.content.getElementsByClassName(\n // 'input-select-fit-unit-box'\n // )[0],\n // '.input-select-fit-unit'\n // )\n // if (fitUnitDataLegpObject) {\n // fitUnitDataLegpObject.legp_search(fitUnitData)\n // let fitUnitDataLegpElm = this._DialogObject._element.content\n // .getElementsByClassName('input-select-fit-unit')[0]\n // .getElementsByTagName('input')[0]\n // this._elms.fitLengthUnit = [fitUnitDataLegpElm]\n // fitUnitDataLegpElm.value = this.options['fit-length-unit']\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // fitUnitDataLegpObject.legp_searchActive(fitUnitData[i].value)\n // break\n // }\n // }\n // fitUnitDataLegpElm.addEventListener('input', () => {\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // this.fitLengthUnit = fitUnitData[i].value\n // break\n // }\n // }\n // })\n // }\n\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n var lineTypeDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-line-type-box')[0], '.input-select-line-type');\n if (lineTypeDataLegpObject) {\n lineTypeDataLegpObject.legp_search(lineTypeData);\n var iActiveElm2 = document.createElement('i');\n iActiveElm2.className = 'icon icon-active';\n _this14._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByClassName('cy_datalist')[0].appendChild(iActiveElm2);\n var lineTypeDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByTagName('input')[0];\n _this14._elms.lineType = [lineTypeDataLegpElm];\n for (var _i8 = 0; _i8 < lineTypeData.length; _i8++) {\n if (lineTypeData[_i8].key === _this14.options.type) {\n lineTypeDataLegpObject.legp_searchActive(lineTypeData[_i8].value);\n lineTypeDataLegpElm.value = lineTypeData[_i8].value;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i8].icon);\n break;\n }\n }\n lineTypeDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < lineTypeData.length; _i9++) {\n if (lineTypeData[_i9].value === lineTypeDataLegpElm.value) {\n _this14.lineType = lineTypeData[_i9].key;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i9].icon);\n\n //控制参数显隐\n if (2 < _this14.lineType && _this14.lineType < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < _this14.lineType && _this14.lineType < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n break;\n }\n }\n });\n }\n var heightBoxElm = _this14._DialogObject._element.content.getElementsByClassName('height-box')[0];\n var heightElm = heightBoxElm.getElementsByClassName('height')[0];\n var heightConfirmElm = _this14._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (_this14.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n var heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n var heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (heightModeObject) {\n heightModeObject.legp_search(heightModeData);\n var heightModeDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n for (var _i10 = 0; _i10 < heightModeData.length; _i10++) {\n if (heightModeData[_i10].key == _this14.heightMode) {\n heightModeDataLegpElm.value = heightModeData[_i10].value;\n heightModeObject.legp_searchActive(heightModeData[_i10].value);\n break;\n }\n }\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i11 = 0; _i11 < heightModeData.length; _i11++) {\n if (heightModeData[_i11].value === heightModeDataLegpElm.value) {\n _this14.heightMode = heightModeData[_i11].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this14.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n _this14._elms.height = heightElm;\n _this14._elms.heightBox = heightBoxElm;\n _this14._elms.heightMode = heightModeDataLegpElm;\n _this14._elms.heightConfirm = heightConfirmElm;\n _this14._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n _this14.positionEditing = false;\n for (var _i12 = 0; _i12 < _this14.options.positions.length; _i12++) {\n _this14.options.positions[_i12].alt = Number((_this14.options.positions[_i12].alt + Number(heightElm.value)).toFixed(2));\n _this14._elms.alt[_i12].innerHTML = _this14.options.positions[_i12].alt;\n }\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n }\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n _this14._elms.lng = [];\n _this14._elms.lngInput = [];\n _this14._elms.lat = [];\n _this14._elms.latInput = [];\n _this14._elms.alt = [];\n _this14._elms.altInput = [];\n var _loop6 = function _loop6(_i13) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(_i13 + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this14.options.positions[_i13].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this14.options.positions[_i13].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this14.options.positions[_i13].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this14.options.positions[_i13].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this14.options.positions[_i13].alt.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this14.options.positions[_i13].alt.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this14.options.positions[_i13].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this14.options.positions[_i13].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this14.options.positions[_i13].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this14.options.positions[_i13].lng.toFixed(8);\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.label.position = [_this14.options.positions[0].lng, _this14.options.positions[0].lat, fromDegreesArray[2]];\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this14.options.positions[_i13].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this14.options.positions[_i13].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this14.options.positions[_i13].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this14.options.positions[_i13].lat.toFixed(8);\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.label.position = [_this14.options.positions[0].lng, _this14.options.positions[0].lat, fromDegreesArray[2]];\n });\n altBox.addEventListener('dblclick', function () {\n if (_this14.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this14.options.positions[_i13].alt.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this14.options.positions[_i13].alt.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this14.options.positions[_i13].alt = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = _this14.options.positions[_i13].alt.toFixed(2);\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.label.position = [_this14.options.positions[0].lng, _this14.options.positions[0].lat, fromDegreesArray[2]];\n });\n _this14._elms.lng.push(lng);\n _this14._elms.lngInput.push(lngInput);\n _this14._elms.lat.push(lat);\n _this14._elms.latInput.push(latInput);\n _this14._elms.alt.push(alt);\n _this14._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var _i13 = 0; _i13 < _this14.options.positions.length; _i13++) {\n _loop6(_i13);\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this14.labelFontFamily].value;\n for (var _i14 = 0; _i14 < fontData.length; _i14++) {\n if (fontData[_i14].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i14].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i15 = 0; _i15 < fontData.length; _i15++) {\n if (fontData[_i15].value === fontDataLegpElm.value) {\n _this14.labelFontFamily = fontData[_i15].key;\n break;\n }\n }\n });\n _this14._elms.labelFontFamily = [fontDataLegpElm];\n }\n }, 0);\n _context4.next = 33;\n break;\n case 32:\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n case 33:\n case \"end\":\n return _context4.stop();\n }\n }, _callee2, this);\n }));\n function edit(_x2) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }() // 平滑处理\n )\n }, {\n key: \"smoothHandle\",\n value: function smoothHandle(positions) {\n var newPositions = [];\n var time = [];\n var fromDegreesArrayHeights = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArrayHeights.push(positions[i].lng, positions[i].lat, positions[i].alt);\n time.push(i / (positions.length - 1));\n }\n var spline = new Cesium.CatmullRomSpline({\n times: time,\n points: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArrayHeights)\n });\n var length = positions.length * 20;\n for (var _i16 = 0; _i16 <= length; _i16++) {\n var cartesian3 = spline.evaluate(_i16 / length);\n newPositions.push(this.cartesian3Towgs84(cartesian3, this.sdk.viewer));\n }\n return newPositions;\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(positionsArray, cd) {\n if (this._error) {\n return;\n }\n var positions = JSON.parse(JSON.stringify(positionsArray));\n var ground;\n switch (this.heightMode) {\n case 0:\n case '0':\n ground = false;\n break;\n case 1:\n case '1':\n for (var i = 0; i < positions.length; i++) {\n var height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions[i].lng, positions[i].lat));\n positions[i].alt = height ? Number((positions[i].alt + Number(height)).toFixed(2)) : Number(positions[i].alt.toFixed(2));\n }\n ground = false;\n break;\n case 2:\n case '2':\n ground = true;\n break;\n }\n var newPositions;\n var fromDegreesArray = [];\n if (this.options.noseToTail && this.options.noseToTail !== 'false') {\n newPositions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions), [positions[0]]);\n } else {\n newPositions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions);\n }\n newPositions = this.smoothHandle(newPositions);\n for (var _i17 = 0; _i17 < newPositions.length; _i17++) {\n fromDegreesArray.push(newPositions[_i17].lng, newPositions[_i17].lat, newPositions[_i17].alt);\n }\n\n // 计算长度\n // let array = []\n // for (let i = 0; i < fromDegreesArray.length; i += 3) {\n // array.push({\n // lng: fromDegreesArray[i],\n // lat: fromDegreesArray[i + 1],\n // alt: fromDegreesArray[i + 2]\n // })\n // }\n // this.options.fitLengthByMeter = this.computeDistance2(\n // array,\n // 2,\n // ground\n // )\n // this.fitLengthUnit = this.options['fit-length-unit']\n // this.options.lengthByMeter = this.computeDistance2(this.smoothHandle(positions), 2, ground)\n // this.lengthUnit = this.options['length-unit']\n\n if (this.options.noseToTail && this.options.noseToTail !== 'false' || this.options.smooth && this.options.smooth !== 'false') {\n var array = [];\n for (var _i18 = 0; _i18 < fromDegreesArray.length; _i18 += 3) {\n array.push({\n lng: fromDegreesArray[_i18],\n lat: fromDegreesArray[_i18 + 1],\n alt: fromDegreesArray[_i18 + 2]\n });\n }\n // this.options.fitLengthByMeter = this.computeDistance(\n // array,\n // 2,\n // ground\n // )\n var _this15 = this;\n this.computeDistance(array, 2, this.options.wordsName).then(function (res) {\n _this15.lengthByMeter = res;\n cd && cd();\n });\n } else {\n var _this16 = this;\n this.computeDistance(_this16.smoothHandle(positions), 2, this.options.wordsName).then(function (res) {\n _this16.lengthByMeter = res;\n cd && cd();\n });\n }\n return fromDegreesArray;\n }\n\n // 更新多边形(线扩展)\n }, {\n key: \"renewPolygon\",\n value: function renewPolygon(fromDegreesArray) {\n var linePositions = [];\n if (this.options.extend && this.options.extend !== 'false') {\n var outerHole = [];\n for (var i = 0; i < fromDegreesArray.length; i += 3) {\n linePositions.push([fromDegreesArray[i], fromDegreesArray[i + 1]]);\n }\n var linestring = turf.lineString(linePositions);\n var buffered = turf.buffer(linestring, this.options.extendWidth / 1000, {\n units: 'kilometers'\n });\n for (var _i19 = 0; _i19 < buffered.geometry.coordinates[0].length; _i19++) {\n outerHole.push(buffered.geometry.coordinates[0][_i19][0], buffered.geometry.coordinates[0][_i19][1]);\n }\n var holes = []; // 孔\n for (var _i20 = 1; _i20 < buffered.geometry.coordinates.length; _i20++) {\n var array = [];\n for (var m = 0; m < buffered.geometry.coordinates[_i20].length; m++) {\n array.push(buffered.geometry.coordinates[_i20][m][0], buffered.geometry.coordinates[_i20][m][1]);\n }\n holes.push({\n positions: Cesium.Cartesian3.fromDegreesArray(array)\n });\n }\n this.entity.polygon = new Cesium.PolygonGraphics({\n hierarchy: {\n positions: Cesium.Cartesian3.fromDegreesArray(outerHole),\n holes: holes\n },\n material: Cesium.Color.fromCssColorString(this.options.extendColor)\n });\n } else {\n this.entity.polygon = undefined;\n }\n }\n }, {\n key: \"reset\",\n value: function () {\n var _reset = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (this.entity) {\n _context5.next = 2;\n break;\n }\n return _context5.abrupt(\"return\");\n case 2:\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineWidth = this.originalOptions.width;\n this.lineType = this.originalOptions.type;\n this.noseToTail = this.originalOptions.noseToTail;\n this.extend = this.originalOptions.extend;\n this.extendWidth = this.originalOptions.extendWidth;\n this.extendColor = this.originalOptions.extendColor;\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelScaleByDistance = this.originalOptions.label.scaleByDistance;\n this.labelNear = this.originalOptions.label.near;\n this.labelFar = this.originalOptions.label.far;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n this.attributeLink = this.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n this.rotate = this.originalOptions.rotate;\n this.speed = this.originalOptions.speed;\n // this.dashSize = this.originalOptions.dashSize\n this.space = this.originalOptions.space;\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n\n this.heightMode = this.options.heightMode;\n\n // let height\n // if (this.ground) {\n // height = await that.getClampToHeight({\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat\n // })\n // } else {\n // height = this.options.positions[0].alt\n // }\n // this.options.label.position = {\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat,\n // alt: height\n // }\n // this.label.position = [\n // this.options.label.position.lng,\n // this.options.label.position.lat,\n // this.options.label.position.alt\n // ]\n case 28:\n case \"end\":\n return _context5.stop();\n }\n }, _callee3, this);\n }));\n function reset() {\n return _reset.apply(this, arguments);\n }\n return reset;\n }()\n }, {\n key: \"_addLink\",\n value: function _addLink() {\n if (this._DialogObject._element.content.getElementsByClassName('link_add')[0].value) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: this._DialogObject._element.content.getElementsByClassName('link_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('link_add')[0].value = '';\n this.attributeLink = this.options.attribute.link.content;\n } else {\n this.Dialog.clickAddLink && this.Dialog.clickAddLink();\n // let input = document.createElement('input');\n // input.type = \"file\";\n // input.accept = \".mp4, .pdf\"\n // input.click()\n // input.addEventListener('change', (event) => {\n // if (input.value) {\n // this.options.attribute.link.content.push({\n // name: '链接',\n // url: input.value\n // })\n // this.attributeLink = this.options.attribute.link.content\n // }\n // })\n }\n }\n }, {\n key: \"addAttributeLink\",\n value: function addAttributeLink(link) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: link\n });\n this.attributeLink = this.options.attribute.link.content;\n }\n\n // _addRr() {\n // if (\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // ) {\n // this.options.attribute.vr.content.push({\n // name: '全景图',\n // url: this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // })\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value = ''\n // this.attributeVr = this.options.attribute.vr.content\n // } else {\n // this.Dialog.clickAddVr && this.Dialog.clickAddVr()\n // }\n // }\n\n // addAttributeRr(vr) {\n // this.options.attribute.vr.content.push({\n // name: '全景图',\n // url: vr\n // })\n // this.attributeVr = this.options.attribute.vr.content\n // }\n\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n height,\n i,\n a,\n _i21,\n _a,\n _i22,\n _a2,\n BoundingSphere,\n _args6 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n options = _args6.length > 0 && _args6[0] !== undefined ? _args6[0] : {};\n if (!this._error) {\n _context6.next = 3;\n break;\n }\n return _context6.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeViewFollow\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"setActiveViewer\"])(0);\n if (!this.options.customView) {\n _context6.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context6.next = 18;\n break;\n }\n _context6.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context6.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context6.next = 43;\n break;\n case 25:\n positionArray = [];\n _context6.t0 = this.options.heightMode;\n _context6.next = _context6.t0 === '0' ? 29 : _context6.t0 === 0 ? 29 : _context6.t0 === '1' ? 31 : _context6.t0 === 1 ? 31 : _context6.t0 === '2' ? 36 : _context6.t0 === 2 ? 36 : 41;\n break;\n case 29:\n for (i = 0; i < this.options.positions.length; i++) {\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt);\n positionArray.push(a.x, a.y, a.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 31:\n _context6.next = 33;\n return this.getClampToHeight(this.options.positions[0]);\n case 33:\n height = _context6.sent;\n for (_i21 = 0; _i21 < this.options.positions.length; _i21++) {\n _a = Cesium.Cartesian3.fromDegrees(this.options.positions[_i21].lng, this.options.positions[_i21].lat, height + this.options.positions[_i21].alt);\n positionArray.push(_a.x, _a.y, _a.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 36:\n _context6.next = 38;\n return this.getClampToHeight(this.options.positions[0]);\n case 38:\n height = _context6.sent;\n for (_i22 = 0; _i22 < this.options.positions.length; _i22++) {\n _a2 = Cesium.Cartesian3.fromDegrees(this.options.positions[_i22].lng, this.options.positions[_i22].lat, height);\n positionArray.push(_a2.x, _a2.y, _a2.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 41:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 43:\n case \"end\":\n return _context6.stop();\n }\n }, _callee4, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 打开富文本框\r\n */\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this17 = this;\n // var ue = UE.getEditor('app');\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].primaryCallBack = function (content) {\n _this17.options.richTextContent = content;\n };\n }\n\n // static nodeEdit2(that, cb = () => { }) {\n // that.positionEditing = false\n // if (YJ.Measure.GetMeasureStatus()) {\n // cb('上一次测量未结束')\n // } else {\n // YJ.Measure.SetMeasureStatus(true)\n // that.tip = new MouseTip('请选择一个顶点,右键取消', that.sdk)\n // that.event = new MouseEvent(that.sdk)\n // that.nodePoints = []\n // let selectPoint\n // let originalPosition\n // let newpositions = []\n // let fromDegreesArray = []\n // for (let i = 0; i < that.options.positions.length; i++) {\n // fromDegreesArray.push(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray)\n\n // that.event.mouse_left((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // originalPosition = that.options.positions[selectPoint.index]\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[selectPoint.index].lng,\n // that.options.positions[selectPoint.index].lat,\n // that.options.positions[selectPoint.index].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.splice(selectPoint.index, 0, entity)\n // that.options.positions.splice(\n // selectPoint.index,\n // 0,\n // that.options.positions[selectPoint.index]\n // )\n // let fromDegreesArray = that.renewPositions(that.options.positions)\n // that.renewPolygon(fromDegreesArray)\n // that.options.lengthByMeter = that.computeDistance2(\n // that.options.positions,\n // 2,\n // that.ground\n // )\n // that.lengthUnit = that.options['length-unit']\n // } else {\n // var pick = that.sdk.viewer.scene.pick(movement.position)\n // if (\n // pick &&\n // pick.id &&\n // pick.id.name &&\n // pick.id.name === 'node-secondary-edit-point'\n // ) {\n // selectPoint = pick.id\n // that.nodePoints.splice(pick.id.index, 1)\n // that.sdk.viewer.entities.remove(pick.id)\n // that.tip.set_text('左键开始,右键结束,CTRL+右键撤销')\n // originalPosition = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // }\n // }\n // })\n\n // that.event.mouse_right((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = originalPosition\n // cb(null, that.options.positions)\n // }\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // for (let i = 0; i < that.nodePoints.length; i++) {\n // that.sdk.viewer.entities.remove(that.nodePoints[i])\n // }\n // that.nodePoints = []\n // that.event.destroy()\n // that.tip.destroy()\n // })\n\n // that.event.mouse_move((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // if (that.options.positions.length === 1) {\n // that.label.position = [\n // that.options.positions[0].lng,\n // that.options.positions[0].lat,\n // that.options.positions[0].alt\n // ]\n // that.options.label.position = {\n // lng: that.options.positions[0].lng,\n // lat: that.options.positions[0].lat,\n // alt: that.options.positions[0].alt\n // }\n // }\n // }\n // that.tip.setPosition(\n // cartesian,\n // movement.endPosition.x,\n // movement.endPosition.y\n // )\n // })\n\n // that.event.mouse_right_keyboard_ctrl((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions.pop()\n // that.sdk.viewer.entities.remove(\n // that.nodePoints[that.nodePoints.length - 1]\n // )\n // that.nodePoints.pop()\n // if (selectPoint.index === that.options.positions.length) {\n // if (that.nodePoints[selectPoint.index - 1]) {\n // selectPoint = that.nodePoints[selectPoint.index - 1]\n // } else {\n // selectPoint.index = 0\n // }\n // }\n // }\n // })\n\n // that.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n // return newpositions\n // }, false)\n\n // for (let i = 0; i < that.options.positions.length; i++) {\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // index: i,\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.push(entity)\n // }\n // }\n // }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit() {\n var _this18 = this;\n this.positionEditing = false;\n if (YJ.Measure.GetMeasureStatus()) {} else {\n this.closeNodeEdit();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('请选择一个顶点,右键取消', this.sdk);\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.ControllerObject = new _Controller_index__WEBPACK_IMPORTED_MODULE_18__[\"default\"](this.sdk);\n var selectPoint;\n this.event.mouse_left(function (movement, cartesian) {\n var pick = _this18.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n _this18.ControllerObject.position = _this18.options.positions[selectPoint.index];\n _this18.ControllerObject.editTranslational();\n _this18.tip && _this18.tip.destroy();\n _this18.ControllerObject.controllerCallBack = function (params) {\n if (selectPoint.index === 0) {\n _this18.label.position = [params.position.lng, params.position.lat, params.position.alt];\n _this18.options.label.position = {\n lng: params.position.lng,\n lat: params.position.lat,\n alt: params.position.alt\n };\n }\n _this18.options.positions[selectPoint.index] = params.position;\n _this18._elms.lng && (_this18._elms.lng[selectPoint.index].innerHTML = params.position.lng.toFixed(8));\n _this18._elms.lngInput && (_this18._elms.lngInput[selectPoint.index].value = params.position.lng.toFixed(8));\n _this18._elms.lat && (_this18._elms.lat[selectPoint.index].innerHTML = params.position.lat.toFixed(8));\n _this18._elms.latInput && (_this18._elms.latInput[selectPoint.index].value = params.position.lat.toFixed(8));\n _this18._elms.alt && (_this18._elms.alt[selectPoint.index].innerHTML = params.position.alt.toFixed(2));\n _this18._elms.altInput && (_this18._elms.altInput[selectPoint.index].value = params.position.alt.toFixed(2));\n selectPoint.position = Cesium.Cartesian3.fromDegrees(params.position.lng, params.position.lat, params.position.alt);\n };\n }\n });\n this.event.mouse_right(function (movement, cartesian) {\n for (var i = 0; i < _this18.nodePoints.length; i++) {\n _this18.sdk.viewer.entities.remove(_this18.nodePoints[i]);\n }\n _this18.nodePoints = [];\n _this18.event.destroy();\n _this18.tip && _this18.tip.destroy();\n _this18.tip = null;\n _this18.ControllerObject.destroy();\n var fromDegreesArray = _this18.renewPositions(_this18.options.positions);\n _this18.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n });\n this.event.mouse_move(function (movement, cartesian) {\n _this18.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n return Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n }, false);\n for (var i = 0; i < this.options.positions.length; i++) {\n var entity = this.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: i,\n position: Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt),\n billboard: {\n image: this.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n this.nodePoints.push(entity);\n }\n }\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit() {\n this.ControllerObject && this.ControllerObject.destroy();\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.tip = null;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n }\n\n /**\r\n * 删除\r\n */\n }, {\n key: \"remove\",\n value: (function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.label && this.label.remove();\n this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context7.next = 8;\n return this.sdk.removeIncetance(this.options.id);\n case 8:\n _context7.next = 10;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(this.sdk, this.options.id);\n case 10:\n case \"end\":\n return _context7.stop();\n }\n }, _callee5, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n )\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this19 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.operate.positionEditing = status;\n if (status === true) {\n this.closeNodeEdit();\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var positions = JSON.parse(JSON.stringify(this.options.positions));\n var positions2 = this.renewPositions(this.options.positions);\n // let positions2 = JSON.parse(JSON.stringify(positions))\n // for (let i = 0; i < positions2.length; i++) {\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions2[i].lng, positions2[i].lat))\n // positions2[i] = Cesium.Cartesian3.fromDegrees(\n // positions2[i].lng,\n // positions2[i].lat,\n // Number((positions2[i].alt + Number(height)).toFixed(2))\n // )\n // }\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(this.options.positions)\n };\n for (var i = 0; i < positions.length; i++) {\n positions[i] = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n }\n var center = positions[Math.floor(positions.length / 2)];\n var disparity = [];\n for (var _i23 = 0; _i23 < positions.length; _i23++) {\n disparity.push({\n x: center.x - positions[_i23].x,\n y: center.y - positions[_i23].y,\n z: center.z - positions[_i23].z\n });\n }\n var newpositions = [];\n var newpositions84 = [];\n this.event.mouse_move(function (movement, cartesian) {\n newpositions = [];\n newpositions84 = [];\n for (var _i24 = 0; _i24 < disparity.length; _i24++) {\n var newP = {\n x: cartesian.x - disparity[_i24].x,\n y: cartesian.y - disparity[_i24].y,\n z: cartesian.z - disparity[_i24].z\n };\n var pos84 = _this19.cartesian3Towgs84(newP, _this19.sdk.viewer);\n pos84.alt = _this19.options.positions[_i24].alt;\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(pos84.lng, pos84.lat))\n // pos84.alt = Number((pos84.alt + Number(height)).toFixed(2))\n // newP = Cesium.Cartesian3.fromDegrees(\n // pos84.lng,\n // pos84.lat,\n // pos84.alt\n // )\n newpositions.push(newP);\n newpositions84.push(pos84);\n }\n var position84 = newpositions84[0];\n positions2 = _this19.renewPositions(newpositions84);\n _this19.label.position = [position84.lng, position84.lat, position84.alt];\n _this19.options.label.position = {\n lng: position84.lng,\n lat: position84.lat,\n alt: position84.alt\n };\n _this19.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this19.event.mouse_move(function () {});\n _this19.event.mouse_left(function () {});\n _this19.event.mouse_right(function () {});\n newpositions = [];\n newpositions84 = [];\n for (var _i25 = 0; _i25 < disparity.length; _i25++) {\n var newP = {\n x: cartesian.x - disparity[_i25].x,\n y: cartesian.y - disparity[_i25].y,\n z: cartesian.z - disparity[_i25].z\n };\n var pos84 = _this19.cartesian3Towgs84(newP, _this19.sdk.viewer);\n pos84.alt = _this19.options.positions[_i25].alt;\n newpositions.push(newP);\n newpositions84.push(pos84);\n }\n var positionsLngLat = [];\n for (var _i26 = 0; _i26 < newpositions84.length; _i26++) {\n var position = newpositions84[_i26];\n positionsLngLat.push(position);\n _this19._elms.lng && (_this19._elms.lng[_i26].innerHTML = position.lng.toFixed(8));\n _this19._elms.lngInput && (_this19._elms.lngInput[_i26].value = position.lng.toFixed(8));\n _this19._elms.lat && (_this19._elms.lat[_i26].innerHTML = position.lat.toFixed(8));\n _this19._elms.latInput && (_this19._elms.latInput[_i26].value = position.lat.toFixed(8));\n _this19._elms.alt && (_this19._elms.alt[_i26].innerHTML = position.alt.toFixed(2));\n _this19._elms.altInput && (_this19._elms.altInput[_i26].value = position.alt.toFixed(2));\n }\n _this19.options.positions = positionsLngLat;\n _this19.previous.positions = positionsLngLat;\n\n // this.entity.polyline.positionsLngLat = positionsLngLat\n var fromDegreesArray = _this19.renewPositions(_this19.options.positions, function () {\n if (_this19._positionEditingCallback) {\n _this19._positionEditingCallback();\n _this19._positionEditingCallback = null;\n }\n });\n _this19.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this19.renewPolygon(fromDegreesArray);\n _this19.positionEditing = false;\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this19.event.mouse_move(function () {});\n _this19.event.mouse_left(function () {});\n _this19.event.mouse_right(function () {});\n _this19.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this19.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n // 长按取消\n _this19.event.mouse_move(function () {});\n _this19.event.mouse_left(function () {});\n _this19.event.mouse_right(function () {});\n _this19.positionEditing = false;\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return Cesium.Cartesian3.fromDegreesArrayHeights(positions2);\n }, false);\n } else {\n if (!this.sdk || !this.sdk.viewer || !this.label || !this.label.entity) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.heightMode) {\n case 0:\n case '0':\n case 1:\n case '1':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat, fromDegreesArray[2]];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n case 2:\n case '2':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n }\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n this._positionEditingCallback = cd;\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _Cesium$Cartesian,\n _this20 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: '',\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var points = [];\n for (var i = 0; i < this.options.positions.length; i++) {\n points.push([this.options.positions[i].lng, this.options.positions[i].lat]);\n }\n var line = turf.lineString(points);\n var length = turf.length(line, {\n units: 'kilometers'\n });\n var sliced = turf.lineSliceAlong(line, 0, length / 2, {\n units: 'kilometers'\n });\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(sliced.geometry.coordinates[sliced.geometry.coordinates.length - 1]));\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this20.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }], [{\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee6(that) {\n var height, ground, objectsToExclude;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee6$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(that.sdk.viewer.entities.values);\n _context8.t0 = that.options.heightMode;\n _context8.next = _context8.t0 === '0' ? 4 : _context8.t0 === 0 ? 4 : _context8.t0 === '1' ? 7 : _context8.t0 === 1 ? 7 : _context8.t0 === '2' ? 14 : _context8.t0 === 2 ? 14 : 19;\n break;\n case 4:\n ground = false;\n height = that.options.positions[0].alt;\n return _context8.abrupt(\"break\", 19);\n case 7:\n ground = false;\n _context8.next = 10;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n }, objectsToExclude);\n case 10:\n _context8.t1 = _context8.sent;\n _context8.t2 = that.options.positions[0].alt;\n height = _context8.t1 + _context8.t2;\n return _context8.abrupt(\"break\", 19);\n case 14:\n ground = true;\n _context8.next = 17;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n }, objectsToExclude);\n case 17:\n height = _context8.sent;\n return _context8.abrupt(\"break\", 19);\n case 19:\n if (!that.options.label.position) {\n that.options.label.position = {\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat,\n alt: height\n };\n }\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_15__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far,\n ground: ground\n });\n case 21:\n case \"end\":\n return _context8.stop();\n }\n }, _callee6);\n }));\n function createLabel(_x3) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }, {\n key: \"create\",\n value: function create(that) {\n var ground;\n if (that.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n var positions = that.options.positions;\n var fromDegreesArray = that.renewPositions(positions);\n that.entity = that.sdk.viewer.entities.add({\n id: that.options.id,\n show: that.options.show,\n polyline: {\n positions: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray),\n width: that.options.width,\n clampToGround: ground,\n // material: that.getMaterial(that.options.color, that.options.type),\n zIndex: that.sdk._entityZIndex\n }\n });\n that.entity.polyline.oriWidth = that.options.width;\n that.judgeLine(that.entity, that.options);\n var params = _objectSpread({}, that.options);\n params.speed = that.inputSpeed;\n that.entity.polyline.material = that.getMaterial(that.options.color, that.options.type, that.entity, params);\n that.sdk._entityZIndex++;\n CurvelineObject.createLabel(that);\n // that.entity.polyline.positionsLngLat = positions\n that.renewPolygon(fromDegreesArray);\n // that.options.lengthByMeter = that.computeDistance2(that.smoothHandle(positions), 2, ground)\n // that.lengthUnit = that.options['length-unit']\n // syncData(that.sdk, that.options.id)\n // if (that.options.show) {\n // setSplitDirection(0, that.options.id)\n // }\n\n that.computeDistance(that.smoothHandle(positions), 2, that.options.wordsName).then(function (res) {\n that.lengthByMeter = res;\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(that.sdk, that.options.id);\n });\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__[\"setSplitDirection\"])(0, that.options.id);\n }\n\n // if (this.options.noseToTail) {\n // let array = []\n // for (let i = 0; i < fromDegreesArray.length; i += 2) {\n // array.push({ lng: fromDegreesArray[i], lat: fromDegreesArray[i + 1] })\n // }\n // this.options.fit_length = tool.computeDistance2(array)\n // }\n // else {\n // this.options.fit_length = tool.computeDistance2(positions)\n // }\n // if (this.options.fit_length_unit === 'km') {\n // this.options.fit_length = this.options.fit_length / 1000\n // }\n\n var scene = that.sdk.viewer.scene;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_11__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (CurvelineObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvQ3VydmVsaW5lT2JqZWN0L2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL09iai9CYXNlL0N1cnZlbGluZU9iamVjdC9pbmRleC5qcz80NDJjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAZGVzY3JpcHRpb24g57q/XHJcbiAqL1xyXG5pbXBvcnQgRGlhbG9nIGZyb20gJy4uLy4uL0VsZW1lbnQvRGlhbG9nJ1xyXG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnLi9fZWxlbWVudCdcclxuaW1wb3J0IEJhc2UgZnJvbSAnLi4vaW5kZXgnXHJcbmltcG9ydCBjeV90YWJzIGZyb20gJy4uLy4uL0VsZW1lbnQvY3lfaHRtbF90YWJzJ1xyXG5pbXBvcnQgcmljaFRleHQgZnJvbSAnLi4vLi4vRWxlbWVudC9yaWNoVGV4dCdcclxuaW1wb3J0IEV2ZW50QmluZGluZyBmcm9tICcuL2V2ZW50QmluZGluZydcclxuaW1wb3J0IExhYmVsT2JqZWN0IGZyb20gJy4uL0xhYmVsT2JqZWN0J1xyXG5pbXBvcnQgTW91c2VFdmVudCBmcm9tICcuLi8uLi8uLi9FdmVudC9pbmRleCdcclxuaW1wb3J0IE1vdXNlVGlwIGZyb20gJy4uLy4uLy4uL01vdXNlVGlwJ1xyXG5pbXBvcnQgQ29udHJvbGxlciBmcm9tICcuLi8uLi8uLi9Db250cm9sbGVyL2luZGV4J1xyXG5pbXBvcnQgeyBzeW5jRGF0YSwgZ2V0M0RWaWV3IH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL011bHRpVmlld3BvcnRNb2RlJ1xyXG5pbXBvcnQgeyBsZWdwIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9kYXRhbGlzdCdcclxuaW1wb3J0IHsgZ2V0Rm9udExpc3QsIGdldEZvbnRGYW1pbHlOYW1lIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9mb250U2VsZWN0J1xyXG5pbXBvcnQgeyBzZXRTcGxpdERpcmVjdGlvbiwgc3luY1NwbGl0RGF0YSwgc2V0QWN0aXZlSWQgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvU3BsaXRTY3JlZW4nXHJcbmltcG9ydCB7IHNldEFjdGl2ZVZpZXdlciwgY2xvc2VSb3RhdGVBcm91bmQsIGNsb3NlVmlld0ZvbGxvdyB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9nbG9iYWwnXHJcblxyXG5jbGFzcyBDdXJ2ZWxpbmVPYmplY3QgZXh0ZW5kcyBCYXNlIHtcclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gc2RrXHJcbiAgICogQGRlc2NyaXB0aW9uIOabsue6v1xyXG4gICAqIEBwYXJhbSBvcHRpb25zIHtvYmplY3R9IOe6v+WxnuaAp1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLm5hbWV7c3RyaW5nfSDlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy53aWR0aD0ze251bWJlcn0g57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY29sb3I9I2ZmMDAwMCB7c3RyaW5nfSDpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy50eXBlPTAge251bWJlcn0g5p2Q6LSo57G75Z6LIDAt5a6e57q/IDEt6Jma57q/IDIt5rOb5YWJLi4uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0TW9kZT0ye251bWJlcn0g6auY5bqm5qih5byP77yIMO+8mua1t+aLlOmrmOW6pu+8mzHvvJrnm7jlr7npq5jluqbvvJsy77ya5L6d6ZmE5qih5byP77yJXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubm9zZVRvVGFpbD1mYWxzZSB7Ym9vbGVhbn0g6aaW5bC+55u46L+eXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuZXh0ZW5kPWZhbHNlIHtib29sZWFufSDnur/nvJPlhrJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRlbmRXaWR0aD0xMCB7bnVtYmVyfSDnur/nvJPlhrLlrr3luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRlbmRDb2xvcj1yZ2JhKDI1NSwyNTUsODAsMC4zKSB7bnVtYmVyfSDnur/nvJPlhrLpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG93PXRydWUge2Jvb2xlYW59IOaYvumakFxyXG4gICAqIEBwYXJhbSB7QXJyYXkuPG9iamVjdD59IG9wdGlvbnMucG9zaXRpb25zIOW/heWhq++8jOe7j+e6rOW6puWSjOmrmOW6pueahOWIl+ihqO+8jOWAvOS6pOabvyBbe2xvbixsYXQsYWx0fSwuLi5dXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwge29iamVjdH0g5qCH562+5a+56LGhXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwudGV4dCB7c3RyaW5nfSDmoIfnrb7mlofmnKxcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5zaG93IHtzdHJpbmd9IOagh+etvuaYvumakFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtzdHJpbmd9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtvYmplY3R9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRTaXplPTIwIHtudW1iZXJ9IOWtl+S9k+Wkp+Wwj1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHk9MCB7bnVtYmVyfSDlrZfkvZPpobkgMO+8mum7keS9k++8mzHvvJrmgJ3mupDpu5HkvZPvvJsy77ya5bqe6Zeo5q2j6YGT5qCH6aKY5L2T77ybM++8muaVsOm7keS9k1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmNvbG9yPSNmZmZmZmYge3N0cmluZ30g5a2X5L2T6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZVdpZHRoPTQge251bWJlcn0g5byV57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZUNvbG9yPSMwMGZmZmY4MCB7c3RyaW5nfSDlvJXnur/popzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldD0yMCB7bnVtYmVyfSDlrZfkvZPlgY/np7so5byV57q/6ZW/5bqmKVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvcj1bJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSB7YXJyYXl9IOiDjOaZr+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB7Ym9vbGVhbn0g6Led56a757yp5pS+XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubmVhcj0yMDAwIHtudW1iZXJ9IOinhumHjue8qeaUvuacgOi/kei3neemu1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZhcj0xMDAwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+c6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlIHtvYmplY3R9IOWxnuaAp+WGheWuuVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rPXt9IHtzdHJpbmd9IOmTvuaOpVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQ9W11dIHthcnJheX0g6ZO+5o6l5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLm5hbWUge3N0cmluZ30g6ZO+5o6l5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLnVybCB7c3RyaW5nfSDpk77mjqXlnLDlnYBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5yaWNoVGV4dENvbnRlbnQge3N0cmluZ30g5a+M5paH5pys5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldyB7b2JqZWN0fSDpu5jorqTop4bop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uIHtvYmplY3R9IOm7mOiupOinhuinkuaWueS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB7bnVtYmVyfSDoiKrlkJHop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHtudW1iZXJ9IOS/r+S7sOinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB7bnVtYmVyfSDnv7vmu5rop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ge29iamVjdH0g6KeG6KeS55u45a+55L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogXHJcbiAgICogXHJcbiAgICogQHBhcmFtIF9EaWFsb2cge29iamVjdH0g5by55qGG5LqL5Lu2XHJcbiAgICogQHBhcmFtIF9EaWFsb2cuY29uZmlybUNhbGxCYWNrIHtmdW5jdGlvbn0g5by55qGG56Gu6K6k5pe255qE5Zue6LCDXHJcbiAgICogKi9cclxuICBjb25zdHJ1Y3RvcihzZGssIG9wdGlvbnMgPSB7fSwgX0RpYWxvZyA9IHt9KSB7XHJcbiAgICBzdXBlcihzZGssIG9wdGlvbnMpXHJcbiAgICB0aGlzLm9wdGlvbnMubmFtZSA9IG9wdGlvbnMubmFtZSB8fCAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgdGhpcy5vcHRpb25zLndpZHRoID0gKChvcHRpb25zLndpZHRoIHx8IG9wdGlvbnMud2lkdGggPT09IDApID8gb3B0aW9ucy53aWR0aCA6IDMpXHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSBvcHRpb25zLmNvbG9yIHx8ICcjZmYwMDAwJ1xyXG4gICAgdGhpcy5vcHRpb25zLnR5cGUgPSBvcHRpb25zLnR5cGUgPyBOdW1iZXIob3B0aW9ucy50eXBlKSA6IDBcclxuICAgIHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsID0gb3B0aW9ucy5ub3NlVG9UYWlsIHx8IGZhbHNlXHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kID0gb3B0aW9ucy5leHRlbmQgfHwgZmFsc2VcclxuICAgIHRoaXMub3B0aW9ucy5yb3RhdGUgPSAob3B0aW9ucy5yb3RhdGUgfHwgb3B0aW9ucy5yb3RhdGUgPT09IGZhbHNlKSA/IG9wdGlvbnMucm90YXRlIDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLnNwYWNlID0gb3B0aW9ucy5zcGFjZSB8fCAxXHJcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSBvcHRpb25zLnNwZWVkIHx8IDEwXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuZGFzaFNpemUgPSBvcHRpb25zLmRhc2hTaXplIHx8IDAuMDNcclxuICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWUgPSBvcHRpb25zLndvcmRzTmFtZSB8fCAn56m66Ze06ZW/5bqmJ1xyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZFdpZHRoID1cclxuICAgICAgb3B0aW9ucy5leHRlbmRXaWR0aCB8fCBvcHRpb25zLmV4dGVuZFdpZHRoID09PSAwXHJcbiAgICAgICAgPyBvcHRpb25zLmV4dGVuZFdpZHRoXHJcbiAgICAgICAgOiAxMFxyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZENvbG9yID0gb3B0aW9ucy5leHRlbmRDb2xvciB8fCAncmdiYSgyNTUsMjU1LDgwLDAuMyknXHJcbiAgICB0aGlzLm9wdGlvbnMuc2hvdyA9XHJcbiAgICAgIG9wdGlvbnMuc2hvdyB8fCBvcHRpb25zLnNob3cgPT09IGZhbHNlID8gb3B0aW9ucy5zaG93IDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAob3B0aW9ucy5oZWlnaHRNb2RlIHx8IG9wdGlvbnMuaGVpZ2h0TW9kZSA9PSAwKSA/IG9wdGlvbnMuaGVpZ2h0TW9kZSA6IDJcclxuICAgIHRoaXMuX2VsbXMgPSBbXVxyXG4gICAgb3B0aW9ucy5sYWJlbCA9IG9wdGlvbnMubGFiZWwgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHtcclxuICAgICAgdGV4dDogdGhpcy5vcHRpb25zLm5hbWUsXHJcbiAgICAgIHNob3c6IG9wdGlvbnMubGFiZWwuc2hvdyB8fCBmYWxzZSxcclxuICAgICAgcG9zaXRpb246IG9wdGlvbnMubGFiZWwucG9zaXRpb24sXHJcbiAgICAgIGZvbnRTaXplOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwuZm9udFNpemUgfHwgb3B0aW9ucy5sYWJlbC5mb250U2l6ZSA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgICAgICAgICA6IDIwLFxyXG4gICAgICBmb250RmFtaWx5OiBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPyBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgOiAwLFxyXG4gICAgICBjb2xvcjogb3B0aW9ucy5sYWJlbC5jb2xvciB8fCAnI2ZmZmZmZicsXHJcbiAgICAgIGxpbmVXaWR0aDpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCB8fCBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gICAgICAgICAgOiA0LFxyXG4gICAgICBwaXhlbE9mZnNldDpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0IHx8IG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gICAgICAgICAgOiAyMCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvciB8fCBbJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSxcclxuICAgICAgbGluZUNvbG9yOiBvcHRpb25zLmxhYmVsLmxpbmVDb2xvciB8fCAnIzAwZmZmZjgwJyxcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB8fCBmYWxzZSxcclxuICAgICAgbmVhcjpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLm5lYXIgfHwgb3B0aW9ucy5sYWJlbC5uZWFyID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwubmVhclxyXG4gICAgICAgICAgOiAyMDAwLFxyXG4gICAgICBmYXI6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5mYXIgfHwgb3B0aW9ucy5sYWJlbC5mYXIgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5mYXJcclxuICAgICAgICAgIDogMTAwMDAwXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlID0gb3B0aW9ucy5hdHRyaWJ1dGUgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgPVxyXG4gICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYSB8fCB7fVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCA9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQgfHwgW11cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyIHx8IHt9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgPVxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgfHwgW11cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzIHx8IHt9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgPVxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgfHwgW11cclxuXHJcblxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmFcclxuICAgICAgZGVsZXRlIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnJcclxuICAgICAgZGVsZXRlIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHNcclxuXHJcblxyXG4gICAgdGhpcy5vcGVyYXRlID0ge31cclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICB0aGlzLnVuaXROdW0gPSAwXHJcbiAgICB0aGlzLmlucHV0U3BlZWQgPSAob3B0aW9ucy5zcGVlZCAmJiBNYXRoLnBvdyhvcHRpb25zLnNwZWVkLCAtMSkgKiAxMDApIHx8IDEwXHJcbiAgICB0aGlzLkRpYWxvZyA9IF9EaWFsb2dcclxuICAgIGlmICghdGhpcy5vcHRpb25zLnBvc2l0aW9ucyB8fCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCA8IDIpIHtcclxuICAgICAgdGhpcy5fZXJyb3IgPSAn57q/5q615pyA5bCR6ZyA6KaB5Lik5Liq5Z2Q5qCH77yBJ1xyXG4gICAgICBjb25zb2xlLndhcm4odGhpcy5fZXJyb3IpXHJcbiAgICAgIHdpbmRvdy5FTEVNRU5UICYmXHJcbiAgICAgICAgd2luZG93LkVMRU1FTlQuTWVzc2FnZSh7XHJcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLl9lcnJvcixcclxuICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyA9IE51bWJlcihOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQgPSBOdW1iZXIoTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpKVxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ID0gTnVtYmVyKE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCkudG9GaXhlZCgyKSlcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZGsuYWRkSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZCwgdGhpcylcclxuICAgICAgQ3VydmVsaW5lT2JqZWN0LmNyZWF0ZSh0aGlzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb2xvclxyXG4gIH1cclxuICBzZXQgY29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmNvbG9yID0gdiB8fCAnI2ZmMDAwMCdcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh2LCB0aGlzLm9wdGlvbnMudHlwZSlcclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCBwYXJhbXMpXHJcbiAgICBpZiAodGhpcy5fZWxtcy5jb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLm9wdGlvbnMuY29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2xvciA9IGNcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JnYmEoMjU1LDAsMCwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMuY29sb3JbaV0gPSBjb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgc3BlZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNwZWVkXHJcbiAgfVxyXG5cclxuICBzZXQgc3BlZWQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gdlxyXG4gICAgLy8gdGhpcy5vcHRpb25zLnNwZWVkID0gdiAhPT0gMCA/IE1hdGgucG93KHYsIC0xKSAqIDEwMCA6IDBcclxuICAgIHRoaXMuaW5wdXRTcGVlZCA9IHYgIT09IDAgPyBNYXRoLnBvdyh2LCAtMSkgKiAxMDAgOiAwXHJcbiAgICBsZXQgcGFyYW1zID0geyAuLi50aGlzLm9wdGlvbnMgfVxyXG4gICAgcGFyYW1zLnNwZWVkID0gdGhpcy5pbnB1dFNwZWVkXHJcbiAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gIH1cclxuICAvLyBnZXQgZGFzaFNpemUoKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmRhc2hTaXplXHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXQgZGFzaFNpemUodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmRhc2hTaXplID0gdlxyXG4gIC8vICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAvLyAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gIC8vICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCB0aGlzLm9wdGlvbnMpXHJcbiAgLy8gICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHBhcmFtcylcclxuICAvLyB9XHJcblxyXG4gIGdldCByb3RhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJvdGF0ZVxyXG4gIH1cclxuXHJcbiAgc2V0IHJvdGF0ZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMucm90YXRlID0gdlxyXG4gICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgIHRoaXMuX2VsbXMucm90YXRlICYmXHJcbiAgICAgIHRoaXMuX2VsbXMucm90YXRlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG5cclxuICAgIHRoaXMub3B0aW9ucy5yb3RhdGUgPSB2XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICB9XHJcblxyXG4gIGdldCBzcGFjZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc3BhY2VcclxuICB9XHJcblxyXG4gIHNldCBzcGFjZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuc3BhY2UgPSB2XHJcbiAgICBsZXQgcGFyYW1zID0geyAuLi50aGlzLm9wdGlvbnMgfVxyXG4gICAgcGFyYW1zLnNwZWVkID0gdGhpcy5pbnB1dFNwZWVkXHJcbiAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxlbmd0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGVuZ3RoXHJcbiAgfVxyXG5cclxuICBzZXQgbGVuZ3RoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sZW5ndGggPSB2XHJcbiAgICAvL+WIpOaWreaVsOWAvOaYr+WQpuWkp+S6jjEwMDBtXHJcblxyXG4gICAgdGhpcy5fZWxtcy5sZW5ndGggJiZcclxuICAgICAgdGhpcy5fZWxtcy5sZW5ndGguZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGZpdExlbmd0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZml0TGVuZ3RoXHJcbiAgfVxyXG5cclxuICBzZXQgZml0TGVuZ3RoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5maXRMZW5ndGggPSB2XHJcbiAgICB0aGlzLl9lbG1zLmZpdExlbmd0aCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmZpdExlbmd0aC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgd29yZHNOYW1lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICB9XHJcbiAgc2V0IHdvcmRzTmFtZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lID0gdlxyXG4gICAgdGhpcy5fZWxtcy53b3Jkc05hbWUgJiZcclxuICAgICAgdGhpcy5fZWxtcy53b3Jkc05hbWUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIGlmICghdGhpcy5ub3NlVG9UYWlsKSB7XHJcbiAgICAgIHRoaXMuY29tcHV0ZURpc3RhbmNlKFxyXG4gICAgICAgIHRoaXMuc21vb3RoSGFuZGxlKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpLFxyXG4gICAgICAgIDIsXHJcbiAgICAgICAgdlxyXG4gICAgICApLnRoZW4ocmVzID0+IHtcclxuICAgICAgICBfdGhpcy5sZW5ndGhCeU1ldGVyID0gcmVzXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldCBmaXRMZW5ndGhVbml0KCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9uc1snZml0LWxlbmd0aC11bml0J11cclxuICAvLyB9XHJcbiAgLy8gc2V0IGZpdExlbmd0aFVuaXQodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zWydmaXQtbGVuZ3RoLXVuaXQnXSA9IHZcclxuICAvLyAgIHRoaXMuX2VsbXMuZml0TGVuZ3RoVW5pdCAmJlxyXG4gIC8vICAgICB0aGlzLl9lbG1zLmZpdExlbmd0aFVuaXQuZm9yRWFjaChpdGVtID0+IHtcclxuICAvLyAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgaWYgKHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyKSB7XHJcbiAgLy8gICAgIHN3aXRjaCAodikge1xyXG4gIC8vICAgICAgIGNhc2UgJ+exsyc6XHJcbiAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aCA9IHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyXHJcbiAgLy8gICAgICAgICBicmVha1xyXG4gIC8vICAgICAgIGNhc2UgJ+WNg+exsyc6XHJcbiAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aCA9IE51bWJlcihcclxuICAvLyAgICAgICAgICAgKHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyIC8gMTAwMCkudG9GaXhlZCg1KVxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICBkZWZhdWx0OlxyXG4gIC8vICAgICAgICAgdGhpcy5maXRMZW5ndGggPSB0aGlzLm9wdGlvbnMuZml0TGVuZ3RoQnlNZXRlclxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBnZXQgbGluZVdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy53aWR0aFxyXG4gIH1cclxuXHJcbiAgc2V0IGxpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMud2lkdGggPSAodiB8fCB2ID09IDApID8gdiA6IDNcclxuICAgIHRoaXMuX2VsbXMubGluZVdpZHRoICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGluZVdpZHRoLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHRoaXMub3B0aW9ucy53aWR0aFxyXG4gICAgICB9KVxyXG4gICAgaWYgKHRoaXMuZW50aXR5ICYmIHRoaXMuZW50aXR5LnBvbHlsaW5lKSB7XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLndpZHRoID0gdGhpcy5lbnRpdHkucG9seWxpbmUud2lkdGggKyB2IC0gdGhpcy5lbnRpdHkucG9seWxpbmUub3JpV2lkdGhcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUub3JpV2lkdGggPSB0aGlzLm9wdGlvbnMud2lkdGhcclxuICAgIH1cclxuICAgIC8vIHRoaXMuZW50aXR5ICYmXHJcbiAgICAvLyAgIHRoaXMuZW50aXR5LnBvbHlsaW5lICYmXHJcbiAgICAvLyAgICh0aGlzLmVudGl0eS5wb2x5bGluZS53aWR0aCA9IHRoaXMub3B0aW9ucy53aWR0aCkgJiYgKHRoaXMuZW50aXR5LnBvbHlsaW5lLm9yaVdpZHRoID0gdGhpcy5vcHRpb25zLndpZHRoKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxpbmVUeXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50eXBlXHJcbiAgfVxyXG5cclxuICBzZXQgbGluZVR5cGUodikge1xyXG4gICAgbGV0IGxpbmVUeXBlRGF0YSA9IFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbGluZVwiPjwvaT7lrp7nur8nLFxyXG4gICAgICAgIHZhbHVlOiAn5a6e57q/JyxcclxuICAgICAgICBrZXk6IDAsXHJcbiAgICAgICAgaWNvbjogJ2xpbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGRhc2gtbGluZVwiPjwvaT7omZrnur8nLFxyXG4gICAgICAgIHZhbHVlOiAn6Jma57q/JyxcclxuICAgICAgICBrZXk6IDEsXHJcbiAgICAgICAgaWNvbjogJ2Rhc2gtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbGlnaHQtbGluZVwiPjwvaT7ms5vlhYknLFxyXG4gICAgICAgIHZhbHVlOiAn5rOb5YWJJyxcclxuICAgICAgICBrZXk6IDIsXHJcbiAgICAgICAgaWNvbjogJ2xpZ2h0LWxpbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHRhaWwtbGluZVwiPjwvaT7lsL7ov7nlhYnnur8nLFxyXG4gICAgICAgIHZhbHVlOiAn5bC+6L+55YWJ57q/JyxcclxuICAgICAgICBrZXk6IDMsXHJcbiAgICAgICAgaWNvbjogJ3RhaWwtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbXVsdC10YWlsLWxpbmVcIj48L2k+5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICB2YWx1ZTogJ+WkmuWwvui/ueWFiee6vycsXHJcbiAgICAgICAga2V5OiA0LFxyXG4gICAgICAgIGljb246ICdtdWx0LXRhaWwtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZmxvdy1kYXNoLWxpbmUxXCI+PC9pPua1geWKqOiZmue6vzEnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MScsXHJcbiAgICAgICAga2V5OiA1LFxyXG4gICAgICAgIGljb246ICdmbG93LWRhc2gtbGluZTEnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGZsb3ctZGFzaC1saW5lMlwiPjwvaT7mtYHliqjomZrnur8yJyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOiZmue6vzInLFxyXG4gICAgICAgIGtleTogNixcclxuICAgICAgICBpY29uOiAnZmxvdy1kYXNoLWxpbmUyJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTFcIj48L2k+5rWB5Yqo566t5aS0MScsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQxJyxcclxuICAgICAgICBrZXk6IDcsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lMSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUyXCI+PC9pPua1geWKqOeureWktDInLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MicsXHJcbiAgICAgICAga2V5OiA4LFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTInXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lM1wiPjwvaT7mtYHliqjnrq3lpLQzJyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDMnLFxyXG4gICAgICAgIGtleTogOSxcclxuICAgICAgICBpY29uOiAncGljLWxpbmUzJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTRcIj48L2k+5rWB5Yqo566t5aS0NCcsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ0JyxcclxuICAgICAgICBrZXk6IDEwLFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTQnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNVwiPjwvaT7mtYHliqjnrq3lpLQ1JyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDUnLFxyXG4gICAgICAgIGtleTogMTEsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lNSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU2XCI+PC9pPua1geWKqOeureWktDYnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NicsXHJcbiAgICAgICAga2V5OiAxMixcclxuICAgICAgICBpY29uOiAncGljLWxpbmU2J1xyXG4gICAgICB9XHJcbiAgICBdXHJcbiAgICB0aGlzLm9wdGlvbnMudHlwZSA9IE51bWJlcih2KVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVHlwZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGxpbmVUeXBlRGF0YVtpXS5rZXkgPT09IE51bWJlcih2KSkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMubGluZVR5cGUgJiZcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGluZVR5cGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS52YWx1ZSA9IGxpbmVUeXBlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICBpZiAoMiA8IGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZSA8IDEzKSB7Ly/otLTlm77lj4LmlbBcclxuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdub25lJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoMiA8IGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZSA8IDUpIHsvL+Wwvui/ueWPguaVsFxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIHRoaXMuZW50aXR5ICYmXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lICYmXHJcbiAgICAgICh0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmNvbG9yLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy50eXBlLFxyXG4gICAgICAgIHRoaXMuZW50aXR5LFxyXG4gICAgICAgIHBhcmFtc1xyXG4gICAgICApKVxyXG4gIH1cclxuICBnZXQgbm9zZVRvVGFpbCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbFxyXG4gIH1cclxuXHJcbiAgc2V0IG5vc2VUb1RhaWwodikge1xyXG4gICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgdGhpcy5fZWxtcy5ub3NlVG9UYWlsICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubm9zZVRvVGFpbC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICAgIGlmICh0aGlzLmVudGl0eSkge1xyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICApXHJcbiAgICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICB9XHJcbiAgICAvLyBpZiAodikge1xyXG4gICAgLy8gICBpZiAodGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIgPiAxMDAwIHx8IHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyID09IDEwMDApIHtcclxuICAgIC8vICAgICBsZXQgZG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgLy8gICAgIGRvbSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXS5jbGljaygpXHJcbiAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMV1cclxuICAgIC8vICAgICBkb20gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0uY2xpY2soKVxyXG4gICAgLy8gICB9XHJcblxyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIC8vICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGhCeU1ldGVyID4gMTAwMCB8fCB0aGlzLm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9PSAxMDAwKSB7XHJcbiAgICAvLyAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMV1cclxuICAgIC8vICAgICBkb20gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMV0gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMV0uY2xpY2soKVxyXG4gICAgLy8gICB9IGVsc2Uge1xyXG4gICAgLy8gICAgIGxldCBkb20gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzFdXHJcbiAgICAvLyAgICAgZG9tICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzBdICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzBdLmNsaWNrKClcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcblxyXG4gIGdldCBoZWlnaHRNb2RlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlID8gdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgOiAwXHJcbiAgfVxyXG4gIHNldCBoZWlnaHRNb2RlKHYpIHtcclxuICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgIHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlID0gKHYgfHwgdiA9PSAwKSA/IHYgOiAyXHJcbiAgICBsZXQgaGVpZ2h0TW9kZU5hbWUgPSAnJ1xyXG4gICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgIGxldCBncm91bmQgPSBmYWxzZVxyXG4gICAgbGV0IGRpc2FibGVkID0gZmFsc2VcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgIClcclxuICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUuY2xhbXBUb0dyb3VuZCA9IGdyb3VuZFxyXG4gICAgICAgIHRoaXMuZXh0ZW5kID0gZmFsc2VcclxuICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfmtbfmi5Tpq5jluqYnXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgICAgdGhpcy5leHRlbmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodE1vZGVOYW1lID0gJ+ebuOWvueWcsOihqCdcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBkaXNhYmxlZCA9IHRydWVcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn5L6d6ZmE5qih5Z6LJ1xyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmxlbmd0aEJ5TWV0ZXIgPSB0aGlzLmNvbXB1dGVEaXN0YW5jZTIoXHJcbiAgICAvLyAgIHRoaXMuc21vb3RoSGFuZGxlKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpLFxyXG4gICAgLy8gICAyLFxyXG4gICAgLy8gICBncm91bmRcclxuICAgIC8vIClcclxuICAgIHRoaXMubGVuZ3RoVW5pdCA9IHRoaXMubGVuZ3RoVW5pdFxyXG4gICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlICYmICh0aGlzLl9lbG1zLmhlaWdodE1vZGUudmFsdWUgPSBoZWlnaHRNb2RlTmFtZSlcclxuICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKFxyXG4gICAgICBoZWlnaHRNb2RlTmFtZVxyXG4gICAgKSlcclxuICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLl9lbG1zLmhlaWdodEJveCAmJiAodGhpcy5fZWxtcy5oZWlnaHRCb3guY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3ggZGlzYWJsZWQnKTtcclxuICAgICAgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtICYmIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fZWxtcy5oZWlnaHRCb3ggJiYgKHRoaXMuX2VsbXMuaGVpZ2h0Qm94LmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94Jyk7XHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSAmJiB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoZ3JvdW5kKSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5ncm91bmQgPSBncm91bmRcclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgJiYgKHRoaXMuX2VsbXMuaGVpZ2h0TW9kZS52YWx1ZSA9ICfkvp3pmYTmqKHlnosnKVxyXG4gICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAgICAgXVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMubGFiZWwuZ3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICBmcm9tRGVncmVlc0FycmF5WzJdXHJcbiAgICAgICAgXVxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgIGxuZzogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgYWx0OiBmcm9tRGVncmVlc0FycmF5WzJdXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIGdldCBleHRlbmQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmV4dGVuZFxyXG4gIH1cclxuXHJcbiAgc2V0IGV4dGVuZCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kID0gdlxyXG4gICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgIGlmICh2KSB7XHJcbiAgICAgIHRoaXMuaGVpZ2h0TW9kZSA9IDJcclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMuZXh0ZW5kICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuZXh0ZW5kLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG4gICAgaWYgKHRoaXMuZW50aXR5KSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5kKSB7XHJcbiAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5Z29uID0gdW5kZWZpbmVkXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBleHRlbmRXaWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZXh0ZW5kV2lkdGhcclxuICB9XHJcblxyXG4gIHNldCBleHRlbmRXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kV2lkdGggPSB2XHJcbiAgICB0aGlzLl9lbG1zLmV4dGVuZFdpZHRoICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuZXh0ZW5kV2lkdGguZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGV4dGVuZENvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5leHRlbmRDb2xvclxyXG4gIH1cclxuICBzZXQgZXh0ZW5kQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZENvbG9yID0gdlxyXG4gICAgaWYgKHRoaXMuX2VsbXMuZXh0ZW5kQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5leHRlbmRDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGV4dGVuZENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5leHRlbmRDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leHRlbmRDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leHRlbmRDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5leHRlbmRDb2xvcltpXSA9IGV4dGVuZENvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eSAmJlxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uICYmXHJcbiAgICAgICh0aGlzLmVudGl0eS5wb2x5Z29uLm1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhcclxuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kQ29sb3JcclxuICAgICAgKSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFNob3coKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLnNob3dcclxuICB9XHJcbiAgc2V0IGxhYmVsU2hvdyh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuc2hvdyA9IHZcclxuICAgIGlmICh0aGlzLnNob3cgJiYgIXRoaXMuc2hvd1ZpZXcgfHwgdGhpcy5zaG93VmlldyA9PSAzKSB7XHJcbiAgICAgIHRoaXMubGFiZWwuc2hvdyA9IHZcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gICAgICAgIF1cclxuICAgICAgfSwgMClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubGFiZWwuc2hvdyA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsU2hvdyAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsU2hvdy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRGYW1pbHkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHlcclxuICB9XHJcblxyXG4gIHNldCBsYWJlbEZvbnRGYW1pbHkodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPSB2IHx8IDBcclxuICAgIHRoaXMubGFiZWwgJiYgKHRoaXMubGFiZWwuZm9udEZhbWlseSA9IHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5KVxyXG5cclxuICAgIGxldCBuYW1lID0gZ2V0Rm9udEZhbWlseU5hbWUodGhpcy5sYWJlbEZvbnRGYW1pbHkpIHx8ICcnXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSBuYW1lXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3JcclxuICB9XHJcbiAgc2V0IGxhYmVsQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmNvbG9yID0gdlxyXG4gICAgdGhpcy5sYWJlbC5jb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvcltpXSA9IGxhYmVsQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRTaXplKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gIH1cclxuICBzZXQgbGFiZWxGb250U2l6ZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemUgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmZvbnRTaXplID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRTaXplICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxGb250U2l6ZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxTY2FsZUJ5RGlzdGFuY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZVxyXG4gIH1cclxuICBzZXQgbGFiZWxTY2FsZUJ5RGlzdGFuY2Uodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSA9IHZcclxuICAgIHRoaXMubGFiZWwuc2NhbGVCeURpc3RhbmNlID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFNjYWxlQnlEaXN0YW5jZSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsU2NhbGVCeURpc3RhbmNlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsTmVhcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubmVhclxyXG4gIH1cclxuICBzZXQgbGFiZWxOZWFyKHYpIHtcclxuICAgIGxldCBuZWFyID0gdlxyXG4gICAgaWYgKG5lYXIgPiB0aGlzLmxhYmVsRmFyKSB7XHJcbiAgICAgIG5lYXIgPSB0aGlzLmxhYmVsRmFyXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxOZWFyICYmIHRoaXMuX2VsbXMubGFiZWxOZWFyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IG5lYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGYXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZhclxyXG4gIH1cclxuICBzZXQgbGFiZWxGYXIodikge1xyXG4gICAgbGV0IGZhciA9IHZcclxuICAgIGlmIChmYXIgPCB0aGlzLmxhYmVsTmVhcikge1xyXG4gICAgICBmYXIgPSB0aGlzLmxhYmVsTmVhclxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZhciA9IGZhclxyXG4gICAgdGhpcy5sYWJlbC5mYXIgPSBmYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGYXIgJiYgdGhpcy5fZWxtcy5sYWJlbEZhci5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSBmYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxMaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gIH1cclxuICBzZXQgbGFiZWxMaW5lV2lkdGgodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA9IHZcclxuICAgIHRoaXMubGFiZWwubGluZVdpZHRoID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbExpbmVXaWR0aCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZVdpZHRoLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFBpeGVsT2Zmc2V0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gIH1cclxuICBzZXQgbGFiZWxQaXhlbE9mZnNldCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnBpeGVsT2Zmc2V0ID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFBpeGVsT2Zmc2V0ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxQaXhlbE9mZnNldC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG4gIGdldCBsYWJlbExpbmVDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubGluZUNvbG9yXHJcbiAgfVxyXG4gIHNldCBsYWJlbExpbmVDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubGluZUNvbG9yID0gdlxyXG4gICAgdGhpcy5sYWJlbC5saW5lQ29sb3IgPSB2XHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGluZUNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbExpbmVDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9ICdyZ2JhKDAsMjU1LDI1NSwwLjUpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvcltpXSA9IGxpbmVDb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXVxyXG4gIH1cclxuICBzZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdID0gdlxyXG4gICAgdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IgPSBbdiwgdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1dXHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRbXHJcbiAgICAgICAgICBpXHJcbiAgICAgICAgXSA9IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuICB9XHJcbiAgc2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV0gPSB2XHJcbiAgICB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvciA9IFt0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvclswXSwgdl1cclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRbaV0gPSBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZVR5cGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGVcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVUeXBlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlID0gdlxyXG4gICAgdGhpcy5fZWxtcy5hdHRyaWJ1dGVUeXBlICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuYXR0cmlidXRlVHlwZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgICBsZXQgYXR0cmlidXRlQ29udGVudCA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICdhdHRyaWJ1dGUtY29udGVudCdcclxuICAgIClcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlQ29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgYXR0cmlidXRlQ29udGVudFtpXS5jbGFzc05hbWUuaW5kZXhPZignYXR0cmlidXRlLWNvbnRlbnQtJyArIHYpID4gLTFcclxuICAgICAgKSB7XHJcbiAgICAgICAgYXR0cmlidXRlQ29udGVudFtpXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRlbnRbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlTGluaygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gIH1cclxuXHJcbiAgc2V0IGF0dHJpYnV0ZUxpbmsodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgPSB2XHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLl9EaWFsb2dPYmplY3QgfHxcclxuICAgICAgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudCB8fFxyXG4gICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQgfHxcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAnYXR0cmlidXRlLWNvbnRlbnQtbGluaydcclxuICAgICAgKS5sZW5ndGggPT0gMFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnKVsxXVxyXG4gICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gICAgdGFibGVDb250ZW50LmlubmVySFRNTCA9ICcnXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdHIgPVxyXG4gICAgICAgIGBcclxuICAgICAgPGRpdiBjbGFzcz1cInRyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpXS5uYW1lICtcclxuICAgICAgICBgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpXS51cmwgK1xyXG4gICAgICAgIGA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwibGlua0VkaXRcIj7nvJbovpE8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImxpbmtEZWxldGVcIj7liKDpmaQ8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5gXHJcbiAgICAgIGxldCB0ckVsbSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHRyKVxyXG4gICAgICB0YWJsZUNvbnRlbnQuYXBwZW5kQ2hpbGQodHJFbG0pXHJcbiAgICB9XHJcbiAgICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgICBsZXQgZnVuID0ge1xyXG4gICAgICBsaW5rRWRpdDogYXN5bmMgaW5kZXggPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IGF3YWl0IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC1saW5rJylbMV1cclxuICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgICAgICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gICAgICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gaXRlbVtpXS5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgbGV0IGh0bWwgPSBgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIHR5cGU9XCJ0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJpbnB1dCBsaW5rLWVkaXRcIiB0eXBlPVwidGV4dFwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY29uZmlybUVkaXRcIj7noa7orqQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjYW5jZWxFZGl0XCI+5Y+W5raIPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+YFxyXG4gICAgICAgICAgICBpdGVtW2ldLmlubmVySFRNTCA9IGh0bWxcclxuICAgICAgICAgICAgbGV0IHRleHRhcmVhRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rLWVkaXQnKVswXVxyXG4gICAgICAgICAgICB0ZXh0YXJlYUVsbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgLSAxMCArICdweCdcclxuICAgICAgICAgICAgbGV0IHRkID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgICAgICAgICAgIHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICAgJ2lucHV0J1xyXG4gICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaW5kZXhdLm5hbWVcclxuICAgICAgICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgICAnaW5wdXQnXHJcbiAgICAgICAgICAgIClbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpbmRleF0udXJsXHJcbiAgICAgICAgICAgIGxldCBidG4gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ0bi5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgICAgICAgIGlmICghYnRuW25dIHx8ICFidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAgICAgICAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5bbS52YWx1ZV0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXShcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlcclxuICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBsaW5rRGVsZXRlOiBpID0+IHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5zcGxpY2UoaSwgMSlcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICB9LFxyXG5cclxuICAgICAgY29uZmlybUVkaXQ6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBuYW1lID0gdmFsdWUubmFtZSAmJiB2YWx1ZS5uYW1lLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAgICAgICBsZXQgdXJsID0gdmFsdWUudXJsICYmIHZhbHVlLnVybC5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgdXJsKSB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpXSA9IHZhbHVlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHdpbmRvdy5FTEVNRU5UICYmXHJcbiAgICAgICAgICAgIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICflkI3np7DmiJbpk77mjqXkuI3og73kuLrnqbrvvIEnLFxyXG4gICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgICAgICAgICBkdXJhdGlvbjogMTUwMFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICB9LFxyXG4gICAgICBjYW5jZWxFZGl0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgfSxcclxuICAgICAgZmlsZVNlbGVjdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGZpbGVFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ZpbGUtc2VsZWN0JylbMF1cclxuICAgICAgICBmaWxlRWxtLmNsaWNrKClcclxuICAgICAgICBmaWxlRWxtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgICAgICAgZmlsZUVsbS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgZmlsZVNlbGVjdCA9IGV2ZW50ID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSkge1xyXG4gICAgICAgIGxldCB0ZCA9IGl0ZW1bXHJcbiAgICAgICAgICBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdpbmRleCcpXHJcbiAgICAgICAgXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZVxyXG4gICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IG51bGxcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBidG4gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ0bi5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgIGlmICghYnRuW25dIHx8ICFidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgY29udGludWVcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5bbS52YWx1ZV0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXShpKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldCBhdHRyaWJ1dGVDYW1lcmEoKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudFxyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0IGF0dHJpYnV0ZUNhbWVyYSh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50ID0gdlxyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IGF0dHJpYnV0ZVZyKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0IGF0dHJpYnV0ZVZyKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCA9IHZcclxuICAvLyAgIGlmIChcclxuICAvLyAgICAgIXRoaXMuX0RpYWxvZ09iamVjdCB8fFxyXG4gIC8vICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50IHx8XHJcbiAgLy8gICAgICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudCB8fFxyXG4gIC8vICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICdhdHRyaWJ1dGUtY29udGVudC12cidcclxuICAvLyAgICAgKS5sZW5ndGggPT0gMFxyXG4gIC8vICAgKSB7XHJcbiAgLy8gICAgIHJldHVyblxyXG4gIC8vICAgfVxyXG4gIC8vICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAvLyAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LXZyJylbMV1cclxuICAvLyAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAvLyAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAvLyAgIHRhYmxlQ29udGVudC5pbm5lckhUTUwgPSAnJ1xyXG4gIC8vICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgLy8gICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnXHJcbiAgLy8gICB9XHJcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICBsZXQgdHIgPVxyXG4gIC8vICAgICAgIGBcclxuICAvLyAgICAgPGRpdiBjbGFzcz1cInRyXCI+XHJcbiAgLy8gICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICtcclxuICAvLyAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0ubmFtZSArXHJcbiAgLy8gICAgICAgYDwvZGl2PlxyXG4gIC8vICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgLy8gICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldLnVybCArXHJcbiAgLy8gICAgICAgYDwvZGl2PlxyXG4gIC8vICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJ2ckVkaXRcIj7nvJbovpE8L2J1dHRvbj5cclxuICAvLyAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cInZyRGVsZXRlXCI+5Yig6ZmkPC9idXR0b24+XHJcbiAgLy8gICAgICAgICA8L2Rpdj5cclxuICAvLyAgICAgPC9kaXY+YFxyXG4gIC8vICAgICBsZXQgdHJFbG0gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0cilcclxuICAvLyAgICAgdGFibGVDb250ZW50LmFwcGVuZENoaWxkKHRyRWxtKVxyXG4gIC8vICAgfVxyXG4gIC8vICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gIC8vICAgbGV0IGZ1biA9IHtcclxuICAvLyAgICAgdnJFZGl0OiBhc3luYyBpbmRleCA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IGF3YWl0IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgLy8gICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtdnInKVsxXVxyXG4gIC8vICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAvLyAgICAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgLy8gICAgICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gIC8vICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgICAgaWYgKGluZGV4ID09PSBpKSB7XHJcbiAgLy8gICAgICAgICAgIGxldCBoZWlnaHQgPSBpdGVtW2ldLm9mZnNldEhlaWdodFxyXG4gIC8vICAgICAgICAgICBsZXQgaHRtbCA9IGBcclxuICAvLyAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAvLyAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0XCIgdHlwZT1cInRleHRcIj5cclxuICAvLyAgICAgICAgICAgICA8L2Rpdj5cclxuICAvLyAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAvLyAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImlucHV0IGxpbmstZWRpdFwiIHR5cGU9XCJ0ZXh0XCI+PC90ZXh0YXJlYT5cclxuICAvLyAgICAgICAgICAgICA8L2Rpdj5cclxuICAvLyAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAvLyAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjb25maXJtRWRpdFwiPuehruiupDwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNhbmNlbEVkaXRcIj7lj5bmtog8L2J1dHRvbj5cclxuICAvLyAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgLy8gICAgICAgICAgIGl0ZW1baV0uaW5uZXJIVE1MID0gaHRtbFxyXG4gIC8vICAgICAgICAgICBsZXQgdGV4dGFyZWFFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmstZWRpdCcpWzBdXHJcbiAgLy8gICAgICAgICAgIHRleHRhcmVhRWxtLnN0eWxlLmhlaWdodCA9IGhlaWdodCAtIDEwICsgJ3B4J1xyXG4gIC8vICAgICAgICAgICBsZXQgdGQgPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAvLyAgICAgICAgICAgdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAvLyAgICAgICAgICAgICAnaW5wdXQnXHJcbiAgLy8gICAgICAgICAgIClbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaW5kZXhdLm5hbWVcclxuICAvLyAgICAgICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAvLyAgICAgICAgICAgICAnaW5wdXQnXHJcbiAgLy8gICAgICAgICAgIClbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaW5kZXhdLnVybFxyXG4gIC8vICAgICAgICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAvLyAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAvLyAgICAgICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAvLyAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAvLyAgICAgICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlLFxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZVxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBpXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICApXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gIC8vICAgICAgICAgICAgICAgICBicmVha1xyXG4gIC8vICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBicmVha1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSxcclxuICAvLyAgICAgdnJEZWxldGU6IGkgPT4ge1xyXG4gIC8vICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5zcGxpY2UoaSwgMSlcclxuICAvLyAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gICAgIH0sXHJcblxyXG4gIC8vICAgICBjb25maXJtRWRpdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgLy8gICAgICAgbGV0IG5hbWUgPSB2YWx1ZS5uYW1lICYmIHZhbHVlLm5hbWUucmVwbGFjZSgvXFxzL2csICcnKVxyXG4gIC8vICAgICAgIGxldCB1cmwgPSB2YWx1ZS51cmwgJiYgdmFsdWUudXJsLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAvLyAgICAgICBpZiAobmFtZSAmJiB1cmwpIHtcclxuICAvLyAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXSA9IHZhbHVlXHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHdpbmRvdy5FTEVNRU5UICYmXHJcbiAgLy8gICAgICAgICAgIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gIC8vICAgICAgICAgICAgIG1lc3NhZ2U6ICflkI3np7DmiJbpk77mjqXkuI3og73kuLrnqbrvvIEnLFxyXG4gIC8vICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAvLyAgICAgICAgICAgICBkdXJhdGlvbjogMTUwMFxyXG4gIC8vICAgICAgICAgICB9KVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIGNhbmNlbEVkaXQ6ICgpID0+IHtcclxuICAvLyAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIGZpbGVTZWxlY3Q6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gIC8vICAgICAgIGxldCBmaWxlRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmaWxlLXNlbGVjdCcpWzBdXHJcbiAgLy8gICAgICAgZmlsZUVsbS5jbGljaygpXHJcbiAgLy8gICAgICAgZmlsZUVsbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gIC8vICAgICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgbGV0IGZpbGVTZWxlY3QgPSBldmVudCA9PiB7XHJcbiAgLy8gICAgIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAvLyAgICAgICBsZXQgdGQgPSBpdGVtW1xyXG4gIC8vICAgICAgICAgZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaW5kZXgnKVxyXG4gIC8vICAgICAgIF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gIC8vICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcclxuICAvLyAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBudWxsXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAvLyAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAvLyAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAvLyAgICAgICAgIGNvbnRpbnVlXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAvLyAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgLy8gICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gIC8vICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oaSlcclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgLy8gICAgICAgICAgIGJyZWFrXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXQgYXR0cmlidXRlR29vZHMoKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXQgYXR0cmlidXRlR29vZHModikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50ID0gdlxyXG4gIC8vIH1cclxuXHJcbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUxhYmVsKHRoYXQpIHtcclxuICAgIGxldCBoZWlnaHRcclxuICAgIGxldCBncm91bmRcclxuICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gWy4uLnRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy52YWx1ZXNdXHJcbiAgICBzd2l0Y2ggKHRoYXQub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBoZWlnaHQgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzEnOlxyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBoZWlnaHQgPSBhd2FpdCB0aGF0LmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKSArIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMic6XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgaGVpZ2h0ID0gYXdhaXQgdGhhdC5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgICAgICAgIGxuZzogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICBsYXQ6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAgICAgfSwgb2JqZWN0c1RvRXhjbHVkZSlcclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24pIHtcclxuICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgIGxuZzogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgbGF0OiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICBhbHQ6IGhlaWdodFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGF0LmxhYmVsID0gbmV3IExhYmVsT2JqZWN0KHRoYXQuc2RrLCB7XHJcbiAgICAgIGlkOiB0aGF0Lm9wdGlvbnMuaWQsXHJcbiAgICAgIHNob3c6IHRoYXQub3B0aW9ucy5zaG93ID8gdGhhdC5vcHRpb25zLmxhYmVsLnNob3cgOiBmYWxzZSxcclxuICAgICAgcG9zaXRpb246IFtcclxuICAgICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24ubG5nLFxyXG4gICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sYXQsXHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmFsdFxyXG4gICAgICBdLFxyXG4gICAgICB0ZXh0OiB0aGF0Lm9wdGlvbnMubmFtZSxcclxuICAgICAgZm9udFNpemU6IHRoYXQub3B0aW9ucy5sYWJlbC5mb250U2l6ZSxcclxuICAgICAgZm9udEZhbWlseTogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHksXHJcbiAgICAgIGNvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwuY29sb3IsXHJcbiAgICAgIHBpeGVsT2Zmc2V0OiB0aGF0Lm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQsXHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhhdC5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvcixcclxuICAgICAgbGluZUNvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwubGluZUNvbG9yLFxyXG4gICAgICBsaW5lV2lkdGg6IHRoYXQub3B0aW9ucy5sYWJlbC5saW5lV2lkdGgsXHJcbiAgICAgIHNjYWxlQnlEaXN0YW5jZTogdGhhdC5vcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSxcclxuICAgICAgbmVhcjogdGhhdC5vcHRpb25zLmxhYmVsLm5lYXIsXHJcbiAgICAgIGZhcjogdGhhdC5vcHRpb25zLmxhYmVsLmZhcixcclxuICAgICAgZ3JvdW5kOiBncm91bmRcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY3JlYXRlKHRoYXQpIHtcclxuICAgIGxldCBncm91bmRcclxuICAgIGlmICh0aGF0LmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICBncm91bmQgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgfVxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhhdC5yZW5ld1Bvc2l0aW9ucyhwb3NpdGlvbnMpXHJcbiAgICB0aGF0LmVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyxcclxuICAgICAgcG9seWxpbmU6IHtcclxuICAgICAgICBwb3NpdGlvbnM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpLFxyXG4gICAgICAgIHdpZHRoOiB0aGF0Lm9wdGlvbnMud2lkdGgsXHJcbiAgICAgICAgY2xhbXBUb0dyb3VuZDogZ3JvdW5kLFxyXG4gICAgICAgIC8vIG1hdGVyaWFsOiB0aGF0LmdldE1hdGVyaWFsKHRoYXQub3B0aW9ucy5jb2xvciwgdGhhdC5vcHRpb25zLnR5cGUpLFxyXG4gICAgICAgIHpJbmRleDogdGhhdC5zZGsuX2VudGl0eVpJbmRleFxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIHRoYXQuZW50aXR5LnBvbHlsaW5lLm9yaVdpZHRoID0gdGhhdC5vcHRpb25zLndpZHRoXHJcbiAgICB0aGF0Lmp1ZGdlTGluZSh0aGF0LmVudGl0eSwgdGhhdC5vcHRpb25zKVxyXG5cclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoYXQub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGF0LmlucHV0U3BlZWRcclxuICAgIHRoYXQuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhhdC5nZXRNYXRlcmlhbChcclxuICAgICAgdGhhdC5vcHRpb25zLmNvbG9yLFxyXG4gICAgICB0aGF0Lm9wdGlvbnMudHlwZSxcclxuICAgICAgdGhhdC5lbnRpdHksXHJcbiAgICAgIHBhcmFtc1xyXG4gICAgKVxyXG5cclxuICAgIHRoYXQuc2RrLl9lbnRpdHlaSW5kZXgrK1xyXG4gICAgQ3VydmVsaW5lT2JqZWN0LmNyZWF0ZUxhYmVsKHRoYXQpXHJcbiAgICAvLyB0aGF0LmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnNMbmdMYXQgPSBwb3NpdGlvbnNcclxuICAgIHRoYXQucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAvLyB0aGF0Lm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9IHRoYXQuY29tcHV0ZURpc3RhbmNlMih0aGF0LnNtb290aEhhbmRsZShwb3NpdGlvbnMpLCAyLCBncm91bmQpXHJcbiAgICAvLyB0aGF0Lmxlbmd0aFVuaXQgPSB0aGF0Lm9wdGlvbnNbJ2xlbmd0aC11bml0J11cclxuICAgIC8vIHN5bmNEYXRhKHRoYXQuc2RrLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICAvLyBpZiAodGhhdC5vcHRpb25zLnNob3cpIHtcclxuICAgIC8vICAgc2V0U3BsaXREaXJlY3Rpb24oMCwgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHRoYXQuY29tcHV0ZURpc3RhbmNlKFxyXG4gICAgICB0aGF0LnNtb290aEhhbmRsZShwb3NpdGlvbnMpLFxyXG4gICAgICAyLFxyXG4gICAgICB0aGF0Lm9wdGlvbnMud29yZHNOYW1lXHJcbiAgICApLnRoZW4ocmVzID0+IHtcclxuICAgICAgdGhhdC5sZW5ndGhCeU1ldGVyID0gcmVzXHJcbiAgICAgIHN5bmNEYXRhKHRoYXQuc2RrLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICB9KVxyXG4gICAgaWYgKHRoYXQub3B0aW9ucy5zaG93KSB7XHJcbiAgICAgIHNldFNwbGl0RGlyZWN0aW9uKDAsIHRoYXQub3B0aW9ucy5pZClcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAodGhpcy5vcHRpb25zLm5vc2VUb1RhaWwpIHtcclxuICAgIC8vICAgbGV0IGFycmF5ID0gW11cclxuICAgIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcm9tRGVncmVlc0FycmF5Lmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAvLyAgICAgYXJyYXkucHVzaCh7IGxuZzogZnJvbURlZ3JlZXNBcnJheVtpXSwgbGF0OiBmcm9tRGVncmVlc0FycmF5W2kgKyAxXSB9KVxyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoID0gdG9vbC5jb21wdXRlRGlzdGFuY2UyKGFycmF5KVxyXG4gICAgLy8gfVxyXG4gICAgLy8gZWxzZSB7XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoID0gdG9vbC5jb21wdXRlRGlzdGFuY2UyKHBvc2l0aW9ucylcclxuICAgIC8vIH1cclxuICAgIC8vIGlmICh0aGlzLm9wdGlvbnMuZml0X2xlbmd0aF91bml0ID09PSAna20nKSB7XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoID0gdGhpcy5vcHRpb25zLmZpdF9sZW5ndGggLyAxMDAwXHJcbiAgICAvLyB9XHJcblxyXG4gICAgbGV0IHNjZW5lID0gdGhhdC5zZGsudmlld2VyLnNjZW5lXHJcbiAgfVxyXG4gIGp1ZGdlTGluZShlbnRpdHksIG5ld1BhcmFtKSB7XHJcbiAgICBpZiAoIWVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXQpIHtcclxuICAgICAgbGV0IHBhcmFtID0ge1xyXG4gICAgICAgIGNvbG9yOiBuZXdQYXJhbS5jb2xvcixcclxuICAgICAgICBpbWFnZTogdGhpcy5nZXRTb3VyY2VSb290UGF0aCgpICsgYC9pbWcvYXJyb3cvMS5wbmdgLFxyXG4gICAgICAgIHNwYWNlOiBuZXdQYXJhbS5zcGFjZSxcclxuICAgICAgICBzcGVlZDogbmV3UGFyYW0uc3BlZWRcclxuICAgICAgfVxyXG5cclxuICAgICAgcGFyYW0uc3BlZWQgPSBuZXdQYXJhbS5yb3RhdGUgPyBwYXJhbS5zcGVlZCA6IDAgLSBwYXJhbS5zcGVlZFxyXG5cclxuICAgICAgY29uc3QgY2FudmFzRWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhc0VsZS5nZXRDb250ZXh0KCcyZCcpXHJcbiAgICAgIGNvbnN0IG15SW1nID0gbmV3IEltYWdlKClcclxuICAgICAgLy8gbXlJbWcuc3JjID0gdGhhdC5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvYXJyb3cvMS5wbmcnXHJcbiAgICAgIG15SW1nLnNyYyA9IHBhcmFtLmltYWdlXHJcbiAgICAgIGxldCB0aGF0ID0gdGhpc1xyXG4gICAgICBteUltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY2FudmFzRWxlLndpZHRoID0gbXlJbWcud2lkdGggKiAocGFyYW0uc3BhY2UgKyAxKVxyXG4gICAgICAgIGNhbnZhc0VsZS5oZWlnaHQgPSBteUltZy5oZWlnaHRcclxuXHJcbiAgICAgICAgbGV0IG9yaVJlcGVhdCA9IHRoYXQuZ2V0U2NlZW5MaW5lKGVudGl0eSwgcGFyYW0sIGNhbnZhc0VsZSlcclxuICAgICAgICBvcmlSZXBlYXQgJiYgKGVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXQgPSBvcmlSZXBlYXQpXHJcblxyXG5cclxuICAgICAgICB2YXIgcG9zaXRpb25Qcm9wZXJ0eSA9IGVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnM7XHJcbiAgICAgICAgdmFyIHBvc2l0aW9ucyA9IHBvc2l0aW9uUHJvcGVydHkuZ2V0VmFsdWUodGhhdC5zZGsudmlld2VyLmNsb2NrLmN1cnJlbnRUaW1lKTtcclxuXHJcbiAgICAgICAgaWYgKCFDZXNpdW0uZGVmaW5lZChwb3NpdGlvbnMpKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDEuMCwgMS4wKTtcclxuICAgICAgICAgIC8vIHJldHVybiAxLjA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZGlzdGFuY2UgPSAwO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAtIDE7ICsraSkge1xyXG4gICAgICAgICAgZGlzdGFuY2UgKz0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciByZXBlYXRYID0gZGlzdGFuY2UgLyBlbnRpdHkucG9seWxpbmUud2lkdGguZ2V0VmFsdWUoKTtcclxuICAgICAgICAvLyDmoLnmja7lnLDlm77nvKnmlL7nqIvluqbosIPmlbRyZXBlYXRYXHJcbiAgICAgICAgdmFyIGNhbWVyYUhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5jYW1lcmEucG9zaXRpb25DYXJ0b2dyYXBoaWMuaGVpZ2h0O1xyXG4gICAgICAgIHZhciBib3VuZGluZ1NwaGVyZSA9IG5ldyBDZXNpdW0uQm91bmRpbmdTcGhlcmUoXHJcbiAgICAgICAgICBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoLTEwMDAwMDAsIDAsIDApLCAvLyDkuK3lv4PngrnlnZDmoIdcclxuICAgICAgICAgIDUwMDAwMCAvLyDljYrlvoTvvIjot53nprvvvIlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyDojrflj5bnu5jlm77nvJPlhrLljLrnmoTlrr3luqblkozpq5jluqbvvIjpgJrluLjmmK/lsY/luZXnmoTliIbovqjnjofvvIlcclxuICAgICAgICB2YXIgZHJhd2luZ0J1ZmZlcldpZHRoID0gdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aDtcclxuICAgICAgICB2YXIgZHJhd2luZ0J1ZmZlckhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyDkvb/nlKggZ2V0UGl4ZWxTaXplIOaWueazleiOt+WPluWMheWbtOeQg+WcqOWxj+W5leS4iueahOWDj+e0oOWkp+Wwj1xyXG4gICAgICAgIHZhciBncm91bmRSZXNvbHV0aW9uID0gdGhhdC5zZGsudmlld2VyLnNjZW5lLmNhbWVyYS5nZXRQaXhlbFNpemUoYm91bmRpbmdTcGhlcmUsIGRyYXdpbmdCdWZmZXJXaWR0aCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgICAgICByZXBlYXRYICo9IGdyb3VuZFJlc29sdXRpb24gLyBjYW1lcmFIZWlnaHQgLyAocGFyYW0uc3BhY2UgKiAoY2FudmFzRWxlLndpZHRoIC8gY2FudmFzRWxlLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgICAgLy8gaWYgKGVudGl0eS5wb2x5bGluZS5tYXRlcmlhbC5vcmlSZXBlYXQpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoYXQuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FM0QpIHtcclxuICAgICAgICAgIGxldCBzcGVlZCA9IHJlcGVhdFggLyBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0XHJcbiAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpU3BlZWQgPSBzcGVlZFxyXG4gICAgICAgICAgZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFggPSByZXBlYXRYXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBzZGszZCA9IGdldDNEVmlldygpXHJcbiAgICAgICAgICBsZXQgc2RrM2RFbnRpdHkgPSBzZGszZC52aWV3ZXIuZW50aXRpZXMuZ2V0QnlJZCh0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpU3BlZWQgPSBzZGszZEVudGl0eS5wb2x5bGluZS5vcmlTcGVlZFxyXG4gICAgICAgICAgZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFggPSBzZGszZEVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuICAvKirojrflj5blvZPliY3mu6HlsY/mqKrnur/pgJ/luqYgKi9cclxuICBnZXRTY2VlbkxpbmUoZW50aXR5LCBvcHRpb25zLCBjYW52YXNFbGUpIHtcclxuICAgIGxldCBwb2ludDEgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMCwgdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICBsZXQgcG9pbnQyID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50V2lkdGggLyAyLCB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodClcclxuICAgIC8vIHZhciBjYXJ0ZXNpYW4xID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLnBpY2tQb3NpdGlvbihwb2ludDEpXHJcbiAgICAvLyB2YXIgY2FydGVzaWFuMiA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5waWNrUG9zaXRpb24ocG9pbnQyKVxyXG5cclxuICAgIGxldCByYXkgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmdldFBpY2tSYXkocG9pbnQxKTtcclxuICAgIGxldCBjYXJ0ZXNpYW4xID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5LCB0aGlzLnNkay52aWV3ZXIuc2NlbmUpO1xyXG5cclxuICAgIGxldCByYXkyID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5nZXRQaWNrUmF5KHBvaW50Mik7XHJcbiAgICBsZXQgY2FydGVzaWFuMiA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5waWNrKHJheTIsIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcbiAgICAvLyBpZiAoIWNhcnRlc2lhbjEgfHwgIWNhcnRlc2lhbjIpIHtcclxuICAgIC8vICAgbGV0IHJheSA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDEpO1xyXG4gICAgLy8gICBjYXJ0ZXNpYW4xID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5LCB0aGlzLnNkay52aWV3ZXIuc2NlbmUpO1xyXG5cclxuICAgIC8vICAgbGV0IHJheTIgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmdldFBpY2tSYXkocG9pbnQyKTtcclxuICAgIC8vICAgY2FydGVzaWFuMiA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5waWNrKHJheTIsIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcbiAgICAvLyB9XHJcbiAgICBpZiAoY2FydGVzaWFuMSAmJiBjYXJ0ZXNpYW4yKSB7XHJcblxyXG5cclxuICAgICAgdmFyIGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UoY2FydGVzaWFuMSwgY2FydGVzaWFuMik7XHJcblxyXG4gICAgICB2YXIgcmVwZWF0WCA9IGRpc3RhbmNlIC8gZW50aXR5LnBvbHlsaW5lLndpZHRoLmdldFZhbHVlKCk7XHJcbiAgICAgIC8vIOagueaNruWcsOWbvue8qeaUvueoi+W6puiwg+aVtHJlcGVhdFhcclxuICAgICAgdmFyIGNhbWVyYUhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEucG9zaXRpb25DYXJ0b2dyYXBoaWMuaGVpZ2h0O1xyXG4gICAgICB2YXIgYm91bmRpbmdTcGhlcmUgPSBuZXcgQ2VzaXVtLkJvdW5kaW5nU3BoZXJlKFxyXG4gICAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygtMTAwMDAwMCwgMCwgMCksIC8vIOS4reW/g+eCueWdkOagh1xyXG4gICAgICAgIDUwMDAwMCAvLyDljYrlvoTvvIjot53nprvvvIlcclxuICAgICAgKTtcclxuXHJcblxyXG4gICAgICAvLyDojrflj5bnu5jlm77nvJPlhrLljLrnmoTlrr3luqblkozpq5jluqbvvIjpgJrluLjmmK/lsY/luZXnmoTliIbovqjnjofvvIlcclxuICAgICAgdmFyIGRyYXdpbmdCdWZmZXJXaWR0aCA9IHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50V2lkdGg7XHJcbiAgICAgIHZhciBkcmF3aW5nQnVmZmVySGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgICAvLyDkvb/nlKggZ2V0UGl4ZWxTaXplIOaWueazleiOt+WPluWMheWbtOeQg+WcqOWxj+W5leS4iueahOWDj+e0oOWkp+Wwj1xyXG4gICAgICB2YXIgZ3JvdW5kUmVzb2x1dGlvbiA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jYW1lcmEuZ2V0UGl4ZWxTaXplKGJvdW5kaW5nU3BoZXJlLCBkcmF3aW5nQnVmZmVyV2lkdGgsIGRyYXdpbmdCdWZmZXJIZWlnaHQpXHJcbiAgICAgIC8vIHJlcGVhdFggKj0gZ3JvdW5kUmVzb2x1dGlvbiAvIGNhbWVyYUhlaWdodCAvICgobXlJbWcud2lkdGggLyBteUltZy5oZWlnaHQgKiA1KSArIDEpO1xyXG4gICAgICBpZiAoZ3JvdW5kUmVzb2x1dGlvbiA+IDcwMCkge1xyXG4gICAgICAgIHJlcGVhdFggKj0gZ3JvdW5kUmVzb2x1dGlvbiAvIGNhbWVyYUhlaWdodCAvIChvcHRpb25zLnNwYWNlICogKGNhbnZhc0VsZS53aWR0aCAvIGNhbnZhc0VsZS5oZWlnaHQgKiA1KSArIDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlcGVhdFggPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gQ2VzaXVtLlNjZW5lTW9kZS5TQ0VORTNEKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcGVhdFhcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgc2RrM2QgPSBnZXQzRFZpZXcoKVxyXG4gICAgICAgIGxldCBzZGszZEVudGl0eSA9IHNkazNkLnZpZXdlci5lbnRpdGllcy5nZXRCeUlkKHRoaXMub3B0aW9ucy5pZClcclxuICAgICAgICByZXR1cm4gc2RrM2RFbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIOe8lui+keahhlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3RhdGUgdHJ1ZeaJk+W8gO+8jGZhbHNl5YWz6ZetXHJcbiAgICovXHJcbiAgYXN5bmMgZWRpdChzdGF0ZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucylcclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgIH1cclxuICAgIGlmIChzdGF0ZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBhd2FpdCBuZXcgRGlhbG9nKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMsIHtcclxuICAgICAgICB0aXRsZTogJ+absue6v+WxnuaApycsXHJcbiAgICAgICAgbGVmdDogJzE4MHB4JyxcclxuICAgICAgICB0b3A6ICcxMDBweCcsXHJcbiAgICAgICAgY29uZmlybUNhbGxCYWNrOiBvcHRpb25zID0+IHtcclxuICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMubmFtZS50cmltKClcclxuICAgICAgICAgIGlmICghdGhpcy5uYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmFtZSA9ICfmnKrlkb3lkI3lr7nosaEnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICAgIGxuZzogdGhpcy5sYWJlbC5wb3NpdGlvblswXSxcclxuICAgICAgICAgICAgbGF0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzFdLFxyXG4gICAgICAgICAgICBhbHQ6IHRoaXMubGFiZWwucG9zaXRpb25bMl1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuY29uZmlybUNhbGxCYWNrICYmXHJcbiAgICAgICAgICAgIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayh0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgICAgICAgIHN5bmNEYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgICAgICBzeW5jU3BsaXREYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZXNldENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnJlc2V0Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZW1vdmVDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5EaWFsb2cucmVtb3ZlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cucmVtb3ZlQ2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xvc2VDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5jbG9zZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2soKVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLm5vZGVQb2ludHNbaV0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NhbGxCYWNrOiBzaG93ID0+IHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnNob3dDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHJhbnNsYXRpb25hbENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9ICF0aGlzLnBvc2l0aW9uRWRpdGluZ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8g5LqM5qyh57yW6L6R5Zue6LCDXHJcbiAgICAgICAgc2Vjb25kYXJ5RWRpdENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB0aGlzLm5vc2VUb1RhaWwgPSBmYWxzZVxyXG4gICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gMFxyXG4gICAgICAgICAgdGhpcy5ub2RlRWRpdCgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuYm9keS5jbGFzc05hbWUgPVxyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmNsYXNzTmFtZSArICcgcG9seWxpbmUnXHJcbiAgICAgIGxldCBjb250ZW50RWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgICAgY29udGVudEVsbS5pbm5lckhUTUwgPSBodG1sKHRoaXMpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jb250ZW50QXBwQ2hpbGQoY29udGVudEVsbSlcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVUeXBlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGVcclxuICAgICAgLy8gdGhpcy5hdHRyaWJ1dGVDYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcbiAgICAgIC8vIHRoaXMuYXR0cmlidXRlR29vZHMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnRcclxuICAgICAgZnVuY3Rpb24gdGFiQ2xpY2soZSkge1xyXG4gICAgICAgIGlmIChlID09PSAnMicgfHwgZSA9PT0gMikgey8v54K55Ye757q/5p2h5qC35byPXHJcbiAgICAgICAgICBpZiAoMiA8IF90aGlzLm9wdGlvbnMudHlwZSAmJiBfdGhpcy5vcHRpb25zLnR5cGUgPCAxMykgey8v6LS05Zu+5Y+C5pWwXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykgJiYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDliJvlu7rmoIfnrb7pobVcclxuICAgICAgbGV0IHRhYnNFbG0gPSBuZXcgY3lfdGFicyhcclxuICAgICAgICAncG9seWxpbmUtb2JqZWN0LWVkaXQtdGFicycsXHJcbiAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgIHRoaXMuc2RrXHJcbiAgICAgIClcclxuICAgICAgLy8g6aKc6Imy57uE5Lu2XHJcbiAgICAgIGxldCBjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xvcicpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMuY29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbG9yID0gY29sb3JcclxuICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbENvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbENvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gY29sb3JcclxuICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBleHRlbmRDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdleHRlbmRDb2xvcicpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMuZXh0ZW5kQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmV4dGVuZENvbG9yID0gY29sb3JcclxuICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmV4dGVuZENvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGluZUNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhYmVsTGluZUNvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbExpbmVDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQnKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsXHJcbiAgICAgICAgYWxwaGE6IHRydWUsXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JyxcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSBjb2xvclxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhYmVsQmFja2dyb3VuZENvbG9yRW5kJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLFxyXG4gICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCxcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLFxyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBjb2xvclxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBhbGxfZWxtID0gY29udGVudEVsbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpXHJcbiAgICAgIEV2ZW50QmluZGluZy5vbih0aGlzLCBhbGxfZWxtKVxyXG4gICAgICB0aGlzLl9lbG1zID0gRXZlbnRCaW5kaW5nLmVsZW1lbnRcclxuICAgICAgdGhpcy5fZWxtcy5jb2xvciA9IFtjb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yID0gW2xhYmVsQ29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMuZXh0ZW5kQ29sb3IgPSBbZXh0ZW5kQ29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IgPSBbbGluZUNvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IFtsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlcl1cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgICAgLy8gdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICAgIC8vIHRoaXMuY2FtZXJhU2VsZWN0ICYmIHRoaXMuY2FtZXJhU2VsZWN0KClcclxuICAgICAgICAvLyB0aGlzLmdvb2RzU2VsZWN0ICYmIHRoaXMuZ29vZHNTZWxlY3QoKVxyXG4gICAgICAgIGxldCB0YWdEYXRhID0gdGhpcy5hdHRyaWJ1dGVTZWxlY3RcclxuICAgICAgICBsZXQgYXR0cmlidXRlRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICdhdHRyaWJ1dGUtc2VsZWN0LWJveCdcclxuICAgICAgICApWzBdXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZUVsbSkge1xyXG4gICAgICAgICAgbGV0IGxlZ3BPYmplY3QgPSBsZWdwKGF0dHJpYnV0ZUVsbSwgJy5hdHRyaWJ1dGUtc2VsZWN0JylcclxuICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2godGFnRGF0YSlcclxuICAgICAgICAgIGxldCBhdHRyaWJ1dGVTZWxlY3RFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLXNlbGVjdCcpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLmtleSA9PT0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGUpIHtcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUgPSB0YWdEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgbGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh0YWdEYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGF0dHJpYnV0ZVNlbGVjdEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRhZ0RhdGFbaV0udmFsdWUgPT09IGF0dHJpYnV0ZVNlbGVjdEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVUeXBlID0gdGFnRGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG5hbWVEYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn56m66Ze06ZW/5bqmJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfnqbrpl7Tplb/luqYnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5oqV5b2x6ZW/5bqmJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmipXlvbHplb/luqYnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5Zyw6KGo6ZW/5bqmJyxcclxuICAgICAgICAgICAgdmFsdWU6ICflnLDooajplb/luqYnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICBsZXQgbmFtZURhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdpbnB1dC1zZWxlY3QtdW5pdC1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5pbnB1dC1zZWxlY3QtdW5pdCdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKG5hbWVEYXRhTGVncE9iamVjdCkge1xyXG4gICAgICAgICAgbmFtZURhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKG5hbWVEYXRhKVxyXG4gICAgICAgICAgbGV0IG5hbWVEYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy53b3Jkc05hbWUgPSBbbmFtZURhdGFMZWdwRWxtXVxyXG4gICAgICAgICAgbmFtZURhdGFMZWdwRWxtLnZhbHVlID0gdGhpcy5vcHRpb25zLndvcmRzTmFtZVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobmFtZURhdGFbaV0udmFsdWUgPT09IG5hbWVEYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIG5hbWVEYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShuYW1lRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBuYW1lRGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAobmFtZURhdGFbaV0udmFsdWUgPT09IG5hbWVEYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3Jkc05hbWUgPSBuYW1lRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDljp/lp4vplb/luqbljZXkvY1cclxuICAgICAgICBsZXQgdW5pdERhdGEgPSBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfnsbMnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+exsydcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfljYPnsbMnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+WNg+exsydcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcblxyXG4gICAgICAgIGxldCB1bml0RGF0YUxlZ3BPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2lucHV0LXNlbGVjdC11bml0LWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmlucHV0LXNlbGVjdC11bml0JyxcclxuICAgICAgICAgIDFcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKHVuaXREYXRhTGVncE9iamVjdCkge1xyXG4gICAgICAgICAgdW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKHVuaXREYXRhKVxyXG4gICAgICAgICAgbGV0IHVuaXREYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzFdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sZW5ndGhVbml0ID0gW3VuaXREYXRhTGVncEVsbV1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHVuaXREYXRhW2ldLnZhbHVlID09PSB1bml0RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICB1bml0RGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUodW5pdERhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdW5pdERhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVuaXREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHVuaXREYXRhW2ldLnZhbHVlID09PSB1bml0RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoVW5pdCA9IHVuaXREYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOaLn+WQiOmVv+W6puWNleS9jVxyXG4gICAgICAgIC8vIGxldCBmaXRVbml0RGF0YSA9IFtcclxuICAgICAgICAvLyAgIHtcclxuICAgICAgICAvLyAgICAgbmFtZTogJ+exsycsXHJcbiAgICAgICAgLy8gICAgIHZhbHVlOiAn57GzJ1xyXG4gICAgICAgIC8vICAgfSxcclxuICAgICAgICAvLyAgIHtcclxuICAgICAgICAvLyAgICAgbmFtZTogJ+WNg+exsycsXHJcbiAgICAgICAgLy8gICAgIHZhbHVlOiAn5Y2D57GzJ1xyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIF1cclxuXHJcbiAgICAgICAgLy8gbGV0IGZpdFVuaXREYXRhTGVncE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgLy8gICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgIC8vICAgICAnaW5wdXQtc2VsZWN0LWZpdC11bml0LWJveCdcclxuICAgICAgICAvLyAgIClbMF0sXHJcbiAgICAgICAgLy8gICAnLmlucHV0LXNlbGVjdC1maXQtdW5pdCdcclxuICAgICAgICAvLyApXHJcbiAgICAgICAgLy8gaWYgKGZpdFVuaXREYXRhTGVncE9iamVjdCkge1xyXG4gICAgICAgIC8vICAgZml0VW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKGZpdFVuaXREYXRhKVxyXG4gICAgICAgIC8vICAgbGV0IGZpdFVuaXREYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgLy8gICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtZml0LXVuaXQnKVswXVxyXG4gICAgICAgIC8vICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAvLyAgIHRoaXMuX2VsbXMuZml0TGVuZ3RoVW5pdCA9IFtmaXRVbml0RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgLy8gICBmaXRVbml0RGF0YUxlZ3BFbG0udmFsdWUgPSB0aGlzLm9wdGlvbnNbJ2ZpdC1sZW5ndGgtdW5pdCddXHJcbiAgICAgICAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGZpdFVuaXREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIGlmIChmaXRVbml0RGF0YVtpXS52YWx1ZSA9PT0gZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgZml0VW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGZpdFVuaXREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgIC8vICAgICAgIGJyZWFrXHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyAgIGZpdFVuaXREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXRVbml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vICAgICAgIGlmIChmaXRVbml0RGF0YVtpXS52YWx1ZSA9PT0gZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aFVuaXQgPSBmaXRVbml0RGF0YVtpXS52YWx1ZVxyXG4gICAgICAgIC8vICAgICAgICAgYnJlYWtcclxuICAgICAgICAvLyAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgIH0pXHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBsZXQgbGluZVR5cGVEYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGxpbmVcIj48L2k+5a6e57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICflrp7nur8nLFxyXG4gICAgICAgICAgICBrZXk6IDAsXHJcbiAgICAgICAgICAgIGljb246ICdsaW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBkYXNoLWxpbmVcIj48L2k+6Jma57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfomZrnur8nLFxyXG4gICAgICAgICAgICBrZXk6IDEsXHJcbiAgICAgICAgICAgIGljb246ICdkYXNoLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGxpZ2h0LWxpbmVcIj48L2k+5rOb5YWJJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfms5vlhYknLFxyXG4gICAgICAgICAgICBrZXk6IDIsXHJcbiAgICAgICAgICAgIGljb246ICdsaWdodC1saW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiB0YWlsLWxpbmVcIj48L2k+5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICflsL7ov7nlhYnnur8nLFxyXG4gICAgICAgICAgICBrZXk6IDMsXHJcbiAgICAgICAgICAgIGljb246ICd0YWlsLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIG11bHQtdGFpbC1saW5lXCI+PC9pPuWkmuWwvui/ueWFiee6vycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAga2V5OiA0LFxyXG4gICAgICAgICAgICBpY29uOiAnbXVsdC10YWlsLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGZsb3ctZGFzaC1saW5lMVwiPjwvaT7mtYHliqjomZrnur8xJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjomZrnur8xJyxcclxuICAgICAgICAgICAga2V5OiA1LFxyXG4gICAgICAgICAgICBpY29uOiAnZmxvdy1kYXNoLWxpbmUxJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBmbG93LWRhc2gtbGluZTJcIj48L2k+5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAgICAgIGtleTogNixcclxuICAgICAgICAgICAgaWNvbjogJ2Zsb3ctZGFzaC1saW5lMidcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUxXCI+PC9pPua1geWKqOeureWktDEnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDEnLFxyXG4gICAgICAgICAgICBrZXk6IDcsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTEnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lMlwiPjwvaT7mtYHliqjnrq3lpLQyJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQyJyxcclxuICAgICAgICAgICAga2V5OiA4LFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmUyJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTNcIj48L2k+5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAgICAgIGtleTogOSxcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lMydcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU0XCI+PC9pPua1geWKqOeureWktDQnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDQnLFxyXG4gICAgICAgICAgICBrZXk6IDEwLFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmU0J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTVcIj48L2k+5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAgICAgIGtleTogMTEsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNlwiPjwvaT7mtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICAgICAga2V5OiAxMixcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lNidcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2lucHV0LXNlbGVjdC1saW5lLXR5cGUtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaW5wdXQtc2VsZWN0LWxpbmUtdHlwZSdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2gobGluZVR5cGVEYXRhKVxyXG5cclxuICAgICAgICAgIGxldCBpQWN0aXZlRWxtMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKVxyXG4gICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gJ2ljb24gaWNvbi1hY3RpdmUnXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtbGluZS10eXBlJylbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY3lfZGF0YWxpc3QnKVswXS5hcHBlbmRDaGlsZChpQWN0aXZlRWxtMilcclxuXHJcbiAgICAgICAgICBsZXQgbGluZVR5cGVEYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtbGluZS10eXBlJylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxpbmVUeXBlID0gW2xpbmVUeXBlRGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVUeXBlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobGluZVR5cGVEYXRhW2ldLmtleSA9PT0gdGhpcy5vcHRpb25zLnR5cGUpIHtcclxuICAgICAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGxpbmVUeXBlRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwRWxtLnZhbHVlID0gbGluZVR5cGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gYGljb24gaWNvbi1hY3RpdmUgJHtsaW5lVHlwZURhdGFbaV0uaWNvbn1gXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGluZVR5cGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVHlwZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAobGluZVR5cGVEYXRhW2ldLnZhbHVlID09PSBsaW5lVHlwZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVUeXBlID0gbGluZVR5cGVEYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gYGljb24gaWNvbi1hY3RpdmUgJHtsaW5lVHlwZURhdGFbaV0uaWNvbn1gXHJcblxyXG4gICAgICAgICAgICAgICAgLy/mjqfliLblj4LmlbDmmL7pmpBcclxuICAgICAgICAgICAgICAgIGlmICgyIDwgdGhpcy5saW5lVHlwZSAmJiB0aGlzLmxpbmVUeXBlIDwgMTMpIHsvL+i0tOWbvuWPguaVsFxyXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKDIgPCB0aGlzLmxpbmVUeXBlICYmIHRoaXMubGluZVR5cGUgPCA1KSB7Ly/lsL7ov7nlj4LmlbBcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaGVpZ2h0Qm94RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LWJveCcpWzBdXHJcbiAgICAgICAgbGV0IGhlaWdodEVsbSA9IGhlaWdodEJveEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQnKVswXVxyXG4gICAgICAgIGxldCBoZWlnaHRDb25maXJtRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LWNvbmZpcm0nKVswXVxyXG4gICAgICAgIGhlaWdodEVsbS52YWx1ZSA9IDEwXHJcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgICAgICBoZWlnaHRCb3hFbG0gJiYgKGhlaWdodEJveEVsbS5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCBkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgaGVpZ2h0Q29uZmlybUVsbSAmJiBoZWlnaHRDb25maXJtRWxtLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBoZWlnaHRCb3hFbG0gJiYgKGhlaWdodEJveEVsbS5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCcpO1xyXG4gICAgICAgICAgaGVpZ2h0Q29uZmlybUVsbSAmJiBoZWlnaHRDb25maXJtRWxtLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGhlaWdodE1vZGVEYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5rW35ouU6auY5bqmJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAgICBrZXk6ICcwJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfnm7jlr7nlnLDooagnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICAgIGtleTogJzEnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+S+nemZhOaooeWeiycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5L6d6ZmE5qih5Z6LJyxcclxuICAgICAgICAgICAga2V5OiAnMicsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICAgIGxldCBoZWlnaHRNb2RlT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdoZWlnaHQtbW9kZS1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5oZWlnaHQtbW9kZSdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGhlaWdodE1vZGVPYmplY3QpIHtcclxuICAgICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2goaGVpZ2h0TW9kZURhdGEpXHJcbiAgICAgICAgICBsZXQgaGVpZ2h0TW9kZURhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1tb2RlJylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodE1vZGVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHRNb2RlRGF0YVtpXS5rZXkgPT0gdGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgaGVpZ2h0TW9kZURhdGFMZWdwRWxtLnZhbHVlID0gaGVpZ2h0TW9kZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICBoZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0TW9kZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaGVpZ2h0TW9kZURhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodE1vZGVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlID09PSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0TW9kZSA9IGhlaWdodE1vZGVEYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgaGVpZ2h0RWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0ID0gaGVpZ2h0RWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodEJveCA9IGhlaWdodEJveEVsbVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFMZWdwRWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0gPSBoZWlnaHRDb25maXJtRWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGVPYmplY3QgPSBoZWlnaHRNb2RlT2JqZWN0XHJcblxyXG4gICAgICAgICAgaGVpZ2h0Q29uZmlybUVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCA9IE51bWJlcigodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQgKyBOdW1iZXIoaGVpZ2h0RWxtLnZhbHVlKSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgICB0aGlzLl9lbG1zLmFsdFtpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgICAgICAgICAgIClcclxuXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdGFibGVFbG0gPSBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NwYXRpYWwtaW5mby10YWJsZScpWzBdXHJcbiAgICAgICAgbGV0IHRCb2R5RWxtID0gdGFibGVFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sbmcgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMubG5nSW5wdXQgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGF0ID0gW11cclxuICAgICAgICB0aGlzLl9lbG1zLmxhdElucHV0ID0gW11cclxuICAgICAgICB0aGlzLl9lbG1zLmFsdCA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5hbHRJbnB1dCA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICAgICAgdHIuY2xhc3NOYW1lID0gJ3RyJ1xyXG4gICAgICAgICAgdHIuaW5uZXJIVE1MID0gYFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj4ke2kgKyAxfTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgbG5nIGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgbGF0IGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgYWx0IGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgYFxyXG4gICAgICAgICAgbGV0IGxuZ0JveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xuZycpWzBdXHJcbiAgICAgICAgICBsZXQgbG5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBsbmcuaW5uZXJIVE1MID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpXHJcbiAgICAgICAgICBsbmdCb3guYXBwZW5kQ2hpbGQobG5nKVxyXG4gICAgICAgICAgbGV0IGxuZ0lucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgbG5nSW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgbG5nSW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBsbmdJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBsbmdJbnB1dC5taW4gPSAtMTgwXHJcbiAgICAgICAgICBsbmdJbnB1dC5tYXggPSAxODBcclxuICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGxhdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhdCcpWzBdXHJcbiAgICAgICAgICBsZXQgbGF0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBsYXQuaW5uZXJIVE1MID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpXHJcbiAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0KVxyXG4gICAgICAgICAgbGV0IGxhdElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgbGF0SW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgbGF0SW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBsYXRJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBsYXRJbnB1dC5taW4gPSAtOTBcclxuICAgICAgICAgIGxhdElucHV0Lm1heCA9IDkwXHJcbiAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KVxyXG5cclxuICAgICAgICAgIGxldCBhbHRCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhbHQnKVswXVxyXG4gICAgICAgICAgbGV0IGFsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgYWx0LmlubmVySFRNTCA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCkudG9GaXhlZCgyKVxyXG4gICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdClcclxuICAgICAgICAgIGxldCBhbHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGFsdElucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGFsdElucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgYWx0SW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgYWx0SW5wdXQubWluID0gLTk5OTk5OTlcclxuICAgICAgICAgIGFsdElucHV0Lm1heCA9IDk5OTk5OTk5OVxyXG4gICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQpLnRvRml4ZWQoMilcclxuXHJcbiAgICAgICAgICBsbmdCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxuZ0JveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmdCb3guYXBwZW5kQ2hpbGQobG5nSW5wdXQpXHJcbiAgICAgICAgICAgIGxuZ0lucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxuZ0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZ0JveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsbmdCb3guYXBwZW5kQ2hpbGQobG5nKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxuZ0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyA9IE51bWJlcihOdW1iZXIobG5nSW5wdXQudmFsdWUpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZy5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCwgZnJvbURlZ3JlZXNBcnJheVsyXV1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgbGF0Qm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsYXRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbGF0Qm94LmFwcGVuZENoaWxkKGxhdElucHV0KVxyXG4gICAgICAgICAgICBsYXRJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsYXRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbGF0Qm94LmFwcGVuZENoaWxkKGxhdClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsYXRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQgPSBOdW1iZXIoTnVtYmVyKGxhdElucHV0LnZhbHVlKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXQuaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFt0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZywgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsIGZyb21EZWdyZWVzQXJyYXlbMl1dXHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIGFsdEJveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFsdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0SW5wdXQpXHJcbiAgICAgICAgICAgIGFsdElucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGFsdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGFsdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCA9IE51bWJlcihOdW1iZXIoYWx0SW5wdXQudmFsdWUpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdC5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdC50b0ZpeGVkKDIpXHJcbiAgICAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCwgZnJvbURlZ3JlZXNBcnJheVsyXV1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sbmcucHVzaChsbmcpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxuZ0lucHV0LnB1c2gobG5nSW5wdXQpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhdC5wdXNoKGxhdClcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGF0SW5wdXQucHVzaChsYXRJbnB1dClcclxuICAgICAgICAgIHRoaXMuX2VsbXMuYWx0LnB1c2goYWx0KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5hbHRJbnB1dC5wdXNoKGFsdElucHV0KVxyXG4gICAgICAgICAgdEJvZHlFbG0uYXBwZW5kQ2hpbGQodHIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZm9udERhdGEgPSBnZXRGb250TGlzdCgpXHJcbiAgICAgICAgbGV0IGZvbnRPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2ZvbnQtc2VsZWN0LWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmZvbnQtc2VsZWN0J1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoZm9udE9iamVjdCkge1xyXG4gICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaChmb250RGF0YSlcclxuICAgICAgICAgIGxldCBmb250RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZm9udC1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS52YWx1ZSA9IGZvbnREYXRhW3RoaXMubGFiZWxGb250RmFtaWx5XS52YWx1ZVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShmb250RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb250RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT09IGZvbnREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbEZvbnRGYW1pbHkgPSBmb250RGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgPSBbZm9udERhdGFMZWdwRWxtXVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgMClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOW5s+a7keWkhOeQhlxyXG4gIHNtb290aEhhbmRsZShwb3NpdGlvbnMpIHtcclxuICAgIGxldCBuZXdQb3NpdGlvbnMgPSBbXVxyXG4gICAgbGV0IHRpbWUgPSBbXVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzLnB1c2goXHJcbiAgICAgICAgcG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgIHBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgKVxyXG4gICAgICB0aW1lLnB1c2goaSAvIChwb3NpdGlvbnMubGVuZ3RoIC0gMSkpXHJcbiAgICB9XHJcbiAgICBsZXQgc3BsaW5lID0gbmV3IENlc2l1bS5DYXRtdWxsUm9tU3BsaW5lKHtcclxuICAgICAgdGltZXM6IHRpbWUsXHJcbiAgICAgIHBvaW50czogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheUhlaWdodHMpXHJcbiAgICB9KVxyXG4gICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGggKiAyMFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGNhcnRlc2lhbjMgPSBzcGxpbmUuZXZhbHVhdGUoaSAvIGxlbmd0aClcclxuICAgICAgbmV3UG9zaXRpb25zLnB1c2godGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4zLCB0aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1Bvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5Z2Q5qCHXHJcbiAgcmVuZXdQb3NpdGlvbnMocG9zaXRpb25zQXJyYXksIGNkKSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgcG9zaXRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwb3NpdGlvbnNBcnJheSkpXHJcbiAgICBsZXQgZ3JvdW5kXHJcbiAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KSlcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5hbHQgPSBoZWlnaHQgPyBOdW1iZXIoKHBvc2l0aW9uc1tpXS5hbHQgKyBOdW1iZXIoaGVpZ2h0KSkudG9GaXhlZCgyKSkgOiBOdW1iZXIoKHBvc2l0aW9uc1tpXS5hbHQpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIGxldCBuZXdQb3NpdGlvbnNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgIT09ICdmYWxzZSdcclxuICAgICkge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSBbLi4ucG9zaXRpb25zLCBwb3NpdGlvbnNbMF1dXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSBbLi4ucG9zaXRpb25zXVxyXG4gICAgfVxyXG4gICAgbmV3UG9zaXRpb25zID0gdGhpcy5zbW9vdGhIYW5kbGUobmV3UG9zaXRpb25zKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdQb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gICAgICAgIG5ld1Bvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgbmV3UG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICBuZXdQb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8g6K6h566X6ZW/5bqmXHJcbiAgICAvLyBsZXQgYXJyYXkgPSBbXVxyXG4gICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBmcm9tRGVncmVlc0FycmF5Lmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAvLyAgIGFycmF5LnB1c2goe1xyXG4gICAgLy8gICAgIGxuZzogZnJvbURlZ3JlZXNBcnJheVtpXSxcclxuICAgIC8vICAgICBsYXQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDFdLFxyXG4gICAgLy8gICAgIGFsdDogZnJvbURlZ3JlZXNBcnJheVtpICsgMl1cclxuICAgIC8vICAgfSlcclxuICAgIC8vIH1cclxuICAgIC8vIHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyID0gdGhpcy5jb21wdXRlRGlzdGFuY2UyKFxyXG4gICAgLy8gICBhcnJheSxcclxuICAgIC8vICAgMixcclxuICAgIC8vICAgZ3JvdW5kXHJcbiAgICAvLyApXHJcbiAgICAvLyB0aGlzLmZpdExlbmd0aFVuaXQgPSB0aGlzLm9wdGlvbnNbJ2ZpdC1sZW5ndGgtdW5pdCddXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9IHRoaXMuY29tcHV0ZURpc3RhbmNlMih0aGlzLnNtb290aEhhbmRsZShwb3NpdGlvbnMpLCAyLCBncm91bmQpXHJcbiAgICAvLyB0aGlzLmxlbmd0aFVuaXQgPSB0aGlzLm9wdGlvbnNbJ2xlbmd0aC11bml0J11cclxuXHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAodGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgICB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbCAhPT0gJ2ZhbHNlJykgfHxcclxuICAgICAgKHRoaXMub3B0aW9ucy5zbW9vdGggJiYgdGhpcy5vcHRpb25zLnNtb290aCAhPT0gJ2ZhbHNlJylcclxuICAgICkge1xyXG4gICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb21EZWdyZWVzQXJyYXkubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICBhcnJheS5wdXNoKHtcclxuICAgICAgICAgIGxuZzogZnJvbURlZ3JlZXNBcnJheVtpXSxcclxuICAgICAgICAgIGxhdDogZnJvbURlZ3JlZXNBcnJheVtpICsgMV0sXHJcbiAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDJdXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLm9wdGlvbnMuZml0TGVuZ3RoQnlNZXRlciA9IHRoaXMuY29tcHV0ZURpc3RhbmNlKFxyXG4gICAgICAvLyAgIGFycmF5LFxyXG4gICAgICAvLyAgIDIsXHJcbiAgICAgIC8vICAgZ3JvdW5kXHJcbiAgICAgIC8vIClcclxuICAgICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgICB0aGlzLmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgICBhcnJheSxcclxuICAgICAgICAyLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICAgKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgX3RoaXMubGVuZ3RoQnlNZXRlciA9IHJlc1xyXG4gICAgICAgIGNkICYmIGNkKClcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgICAgdGhpcy5jb21wdXRlRGlzdGFuY2UoXHJcbiAgICAgICAgX3RoaXMuc21vb3RoSGFuZGxlKHBvc2l0aW9ucyksXHJcbiAgICAgICAgMixcclxuICAgICAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lXHJcbiAgICAgICkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIF90aGlzLmxlbmd0aEJ5TWV0ZXIgPSByZXNcclxuICAgICAgICBjZCAmJiBjZCgpXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZyb21EZWdyZWVzQXJyYXlcclxuICB9XHJcblxyXG4gIC8vIOabtOaWsOWkmui+ueW9ou+8iOe6v+aJqeWxle+8iVxyXG4gIHJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KSB7XHJcbiAgICBsZXQgbGluZVBvc2l0aW9ucyA9IFtdXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuZCAmJiB0aGlzLm9wdGlvbnMuZXh0ZW5kICE9PSAnZmFsc2UnKSB7XHJcbiAgICAgIGxldCBvdXRlckhvbGUgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb21EZWdyZWVzQXJyYXkubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICBsaW5lUG9zaXRpb25zLnB1c2goW2Zyb21EZWdyZWVzQXJyYXlbaV0sIGZyb21EZWdyZWVzQXJyYXlbaSArIDFdXSlcclxuICAgICAgfVxyXG4gICAgICBsZXQgbGluZXN0cmluZyA9IHR1cmYubGluZVN0cmluZyhsaW5lUG9zaXRpb25zKVxyXG4gICAgICBsZXQgYnVmZmVyZWQgPSB0dXJmLmJ1ZmZlcihcclxuICAgICAgICBsaW5lc3RyaW5nLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5leHRlbmRXaWR0aCAvIDEwMDAsXHJcbiAgICAgICAgeyB1bml0czogJ2tpbG9tZXRlcnMnIH1cclxuICAgICAgKVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG91dGVySG9sZS5wdXNoKFxyXG4gICAgICAgICAgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1baV1bMF0sXHJcbiAgICAgICAgICBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXVtpXVsxXVxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBsZXQgaG9sZXMgPSBbXSAvLyDlrZRcclxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBhcnJheSA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1tpXS5sZW5ndGg7IG0rKykge1xyXG4gICAgICAgICAgYXJyYXkucHVzaChcclxuICAgICAgICAgICAgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbaV1bbV1bMF0sXHJcbiAgICAgICAgICAgIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzW2ldW21dWzFdXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhvbGVzLnB1c2goeyBwb3NpdGlvbnM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkoYXJyYXkpIH0pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbiA9IG5ldyBDZXNpdW0uUG9seWdvbkdyYXBoaWNzKHtcclxuICAgICAgICBoaWVyYXJjaHk6IHtcclxuICAgICAgICAgIHBvc2l0aW9uczogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShvdXRlckhvbGUpLFxyXG4gICAgICAgICAgaG9sZXM6IGhvbGVzXHJcbiAgICAgICAgfSxcclxuICAgICAgICBtYXRlcmlhbDogQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGlzLm9wdGlvbnMuZXh0ZW5kQ29sb3IpXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uID0gdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyByZXNldCgpIHtcclxuICAgIGlmICghdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3JpZ2luYWxPcHRpb25zKVxyXG4gICAgdGhpcy5uYW1lID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubmFtZVxyXG4gICAgdGhpcy5jb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmNvbG9yXHJcbiAgICB0aGlzLmxpbmVXaWR0aCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLndpZHRoXHJcbiAgICB0aGlzLmxpbmVUeXBlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMudHlwZVxyXG4gICAgdGhpcy5ub3NlVG9UYWlsID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubm9zZVRvVGFpbFxyXG4gICAgdGhpcy5leHRlbmQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5leHRlbmRcclxuICAgIHRoaXMuZXh0ZW5kV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5leHRlbmRXaWR0aFxyXG4gICAgdGhpcy5leHRlbmRDb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmV4dGVuZENvbG9yXHJcbiAgICB0aGlzLmxhYmVsU2hvdyA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnNob3dcclxuICAgIHRoaXMubGFiZWxDb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmNvbG9yXHJcbiAgICB0aGlzLmxhYmVsRm9udFNpemUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gICAgdGhpcy5sYWJlbEZvbnRGYW1pbHkgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mb250RmFtaWx5XHJcbiAgICB0aGlzLmxhYmVsU2NhbGVCeURpc3RhbmNlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlXHJcbiAgICB0aGlzLmxhYmVsTmVhciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLm5lYXJcclxuICAgIHRoaXMubGFiZWxGYXIgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mYXJcclxuICAgIHRoaXMubGFiZWxMaW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICAgIHRoaXMubGFiZWxQaXhlbE9mZnNldCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubGluZUNvbG9yXHJcbiAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAvLyB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAvLyB0aGlzLmF0dHJpYnV0ZUNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICAgIC8vIHRoaXMuYXR0cmlidXRlR29vZHMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnRcclxuICAgIHRoaXMucm90YXRlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMucm90YXRlXHJcbiAgICB0aGlzLnNwZWVkID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc3BlZWRcclxuICAgIC8vIHRoaXMuZGFzaFNpemUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5kYXNoU2l6ZVxyXG4gICAgdGhpcy5zcGFjZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnNwYWNlXHJcbiAgICAvLyB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAvLyB0aGlzLmdvb2RzU2VsZWN0ICYmIHRoaXMuZ29vZHNTZWxlY3QoKVxyXG5cclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlXHJcblxyXG4gICAgLy8gbGV0IGhlaWdodFxyXG4gICAgLy8gaWYgKHRoaXMuZ3JvdW5kKSB7XHJcbiAgICAvLyAgIGhlaWdodCA9IGF3YWl0IHRoYXQuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAvLyAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgIC8vICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAvLyAgIH0pXHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgLy8gICBoZWlnaHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gICAgLy8gfVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgLy8gICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgLy8gICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgLy8gICBhbHQ6IGhlaWdodFxyXG4gICAgLy8gfVxyXG4gICAgLy8gdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyxcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCxcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmFsdFxyXG4gICAgLy8gXVxyXG4gIH1cclxuXHJcbiAgX2FkZExpbmsoKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmtfYWRkJylbMF1cclxuICAgICAgICAudmFsdWVcclxuICAgICkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5wdXNoKHtcclxuICAgICAgICBuYW1lOiAn6ZO+5o6lJyxcclxuICAgICAgICB1cmw6IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnbGlua19hZGQnXHJcbiAgICAgICAgKVswXS52YWx1ZVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICdsaW5rX2FkZCdcclxuICAgICAgKVswXS52YWx1ZSA9ICcnXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLkRpYWxvZy5jbGlja0FkZExpbmsgJiYgdGhpcy5EaWFsb2cuY2xpY2tBZGRMaW5rKClcclxuICAgICAgLy8gbGV0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgICAgLy8gaW5wdXQudHlwZSA9IFwiZmlsZVwiO1xyXG4gICAgICAvLyBpbnB1dC5hY2NlcHQgPSBcIi5tcDQsIC5wZGZcIlxyXG4gICAgICAvLyBpbnB1dC5jbGljaygpXHJcbiAgICAgIC8vIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChldmVudCkgPT4ge1xyXG4gICAgICAvLyAgIGlmIChpbnB1dC52YWx1ZSkge1xyXG4gICAgICAvLyAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgIC8vICAgICAgIG5hbWU6ICfpk77mjqUnLFxyXG4gICAgICAvLyAgICAgICB1cmw6IGlucHV0LnZhbHVlXHJcbiAgICAgIC8vICAgICB9KVxyXG4gICAgICAvLyAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgLy8gICB9XHJcbiAgICAgIC8vIH0pXHJcbiAgICB9XHJcbiAgfVxyXG4gIGFkZEF0dHJpYnV0ZUxpbmsobGluaykge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgIG5hbWU6ICfpk77mjqUnLFxyXG4gICAgICB1cmw6IGxpbmtcclxuICAgIH0pXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gIH1cclxuXHJcbiAgLy8gX2FkZFJyKCkge1xyXG4gIC8vICAgaWYgKFxyXG4gIC8vICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICd2cl9hZGQnXHJcbiAgLy8gICAgIClbMF0udmFsdWVcclxuICAvLyAgICkge1xyXG4gIC8vICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQucHVzaCh7XHJcbiAgLy8gICAgICAgbmFtZTogJ+WFqOaZr+WbvicsXHJcbiAgLy8gICAgICAgdXJsOiB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICAgJ3ZyX2FkZCdcclxuICAvLyAgICAgICApWzBdLnZhbHVlXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgJ3ZyX2FkZCdcclxuICAvLyAgICAgKVswXS52YWx1ZSA9ICcnXHJcbiAgLy8gICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHRoaXMuRGlhbG9nLmNsaWNrQWRkVnIgJiYgdGhpcy5EaWFsb2cuY2xpY2tBZGRWcigpXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBhZGRBdHRyaWJ1dGVScih2cikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50LnB1c2goe1xyXG4gIC8vICAgICBuYW1lOiAn5YWo5pmv5Zu+JyxcclxuICAvLyAgICAgdXJsOiB2clxyXG4gIC8vICAgfSlcclxuICAvLyAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOmjnuWIsFxyXG4gICAqL1xyXG4gIGFzeW5jIGZseVRvKG9wdGlvbnMgPSB7fSkge1xyXG4gICAgaWYgKHRoaXMuX2Vycm9yKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgY2xvc2VSb3RhdGVBcm91bmQodGhpcy5zZGspXHJcbiAgICBjbG9zZVZpZXdGb2xsb3codGhpcy5zZGspXHJcblxyXG4gICAgc2V0QWN0aXZlVmlld2VyKDApXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmN1c3RvbVZpZXcpIHtcclxuICAgICAgbGV0IG9yaWVudGF0aW9uID0ge1xyXG4gICAgICAgIGhlYWRpbmc6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5oZWFkaW5nIHx8IDAuMCksXHJcbiAgICAgICAgcGl0Y2g6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5waXRjaCB8fCAtNjAuMCksXHJcbiAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnJvbGwgfHwgMC4wKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmdcclxuICAgICAgbGV0IGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0XHJcbiAgICAgIGxldCBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdFxyXG4gICAgICBsZXQgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uID0geyBsbmc6IDAsIGxhdDogMCB9XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb25zKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0gfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jZW50ZXIpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLmNlbnRlciB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnN0YXJ0KSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5zdGFydCB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbG5nJykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxuZyA9IHRoaXMub3B0aW9ucy5sbmdcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbGF0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxhdCA9IHRoaXMub3B0aW9ucy5sYXRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmFsdCA9IHRoaXMub3B0aW9ucy5hbHRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aaC5p6c5rKh5pyJ6auY5bqm5YC877yM5YiZ6I635Y+W57Sn6LS06auY5bqm6K6h566XXHJcbiAgICAgIGlmICghcG9zaXRpb24uaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgcG9zaXRpb24uYWx0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHBvc2l0aW9uKVxyXG4gICAgICB9XHJcbiAgICAgIGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nICsgcG9zaXRpb24ubG5nXHJcbiAgICAgIGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0ICsgcG9zaXRpb24ubGF0XHJcbiAgICAgIGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0ICsgcG9zaXRpb24uYWx0XHJcbiAgICAgIGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUbyh7XHJcbiAgICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uLFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvblxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbkFycmF5ID0gW11cclxuICAgICAgbGV0IGhlaWdodFxyXG4gICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBhID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2goYS54LCBhLnksIGEueilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgaGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0pXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgICBoZWlnaHQgKyB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaChhLngsIGEueSwgYS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBoZWlnaHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXSlcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgYSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaChhLngsIGEueSwgYS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICBsZXQgQm91bmRpbmdTcGhlcmUgPSBDZXNpdW0uQm91bmRpbmdTcGhlcmUuZnJvbVZlcnRpY2VzKHBvc2l0aW9uQXJyYXkpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG9Cb3VuZGluZ1NwaGVyZShCb3VuZGluZ1NwaGVyZSwge1xyXG4gICAgICAgIG9mZnNldDogb3B0aW9ucy5vcmllbnRhdGlvbiB8fCB7XHJcbiAgICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoMC4wKSxcclxuICAgICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoLTkwLjApLFxyXG4gICAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDmiZPlvIDlr4zmlofmnKzmoYZcclxuICAgKi9cclxuICBvcGVuUmljaFRleHRFZGl0b3IoZSkge1xyXG4gICAgLy8gdmFyIHVlID0gVUUuZ2V0RWRpdG9yKCdhcHAnKTtcclxuICAgIHJpY2hUZXh0Lm9wZW4oXHJcbiAgICAgIHRoaXMub3B0aW9ucy5pZCxcclxuICAgICAgdGhpcy5vcHRpb25zLm5hbWUsXHJcbiAgICAgIHRoaXMub3B0aW9ucy5yaWNoVGV4dENvbnRlbnRcclxuICAgIClcclxuICAgIHJpY2hUZXh0LnByaW1hcnlDYWxsQmFjayA9IGNvbnRlbnQgPT4ge1xyXG4gICAgICB0aGlzLm9wdGlvbnMucmljaFRleHRDb250ZW50ID0gY29udGVudFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gc3RhdGljIG5vZGVFZGl0Mih0aGF0LCBjYiA9ICgpID0+IHsgfSkge1xyXG4gIC8vICAgdGhhdC5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gIC8vICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpKSB7XHJcbiAgLy8gICAgIGNiKCfkuIrkuIDmrKHmtYvph4/mnKrnu5PmnZ8nKVxyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKHRydWUpXHJcbiAgLy8gICAgIHRoYXQudGlwID0gbmV3IE1vdXNlVGlwKCfor7fpgInmi6nkuIDkuKrpobbngrnvvIzlj7PplK7lj5bmtognLCB0aGF0LnNkaylcclxuICAvLyAgICAgdGhhdC5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoYXQuc2RrKVxyXG4gIC8vICAgICB0aGF0Lm5vZGVQb2ludHMgPSBbXVxyXG4gIC8vICAgICBsZXQgc2VsZWN0UG9pbnRcclxuICAvLyAgICAgbGV0IG9yaWdpbmFsUG9zaXRpb25cclxuICAvLyAgICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgLy8gICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgLy8gICAgICAgKVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIG5ld3Bvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcblxyXG4gIC8vICAgICB0aGF0LmV2ZW50Lm1vdXNlX2xlZnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAvLyAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAvLyAgICAgICAgICAgY2FydGVzaWFuLFxyXG4gIC8vICAgICAgICAgICB0aGF0LnNkay52aWV3ZXJcclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIG9yaWdpbmFsUG9zaXRpb24gPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gIC8vICAgICAgICAgbGV0IGVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gIC8vICAgICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sbmcsXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubGF0LFxyXG4gIC8vICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmFsdFxyXG4gIC8vICAgICAgICAgICApLFxyXG4gIC8vICAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAvLyAgICAgICAgICAgICBpbWFnZTogdGhhdC5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvcG9pbnQucG5nJyxcclxuICAvLyAgICAgICAgICAgICB3aWR0aDogMTUsXHJcbiAgLy8gICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAvLyAgICAgICAgICAgICBkaXNhYmxlRGVwdGhUZXN0RGlzdGFuY2U6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgdGhhdC5ub2RlUG9pbnRzLnNwbGljZShzZWxlY3RQb2ludC5pbmRleCwgMCwgZW50aXR5KVxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5zcGxpY2UoXHJcbiAgLy8gICAgICAgICAgIHNlbGVjdFBvaW50LmluZGV4LFxyXG4gIC8vICAgICAgICAgICAwLFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGF0LnJlbmV3UG9zaXRpb25zKHRoYXQub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgLy8gICAgICAgICB0aGF0LnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLmxlbmd0aEJ5TWV0ZXIgPSB0aGF0LmNvbXB1dGVEaXN0YW5jZTIoXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMsXHJcbiAgLy8gICAgICAgICAgIDIsXHJcbiAgLy8gICAgICAgICAgIHRoYXQuZ3JvdW5kXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICB0aGF0Lmxlbmd0aFVuaXQgPSB0aGF0Lm9wdGlvbnNbJ2xlbmd0aC11bml0J11cclxuICAvLyAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgdmFyIHBpY2sgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUucGljayhtb3ZlbWVudC5wb3NpdGlvbilcclxuICAvLyAgICAgICAgIGlmIChcclxuICAvLyAgICAgICAgICAgcGljayAmJlxyXG4gIC8vICAgICAgICAgICBwaWNrLmlkICYmXHJcbiAgLy8gICAgICAgICAgIHBpY2suaWQubmFtZSAmJlxyXG4gIC8vICAgICAgICAgICBwaWNrLmlkLm5hbWUgPT09ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50J1xyXG4gIC8vICAgICAgICAgKSB7XHJcbiAgLy8gICAgICAgICAgIHNlbGVjdFBvaW50ID0gcGljay5pZFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm5vZGVQb2ludHMuc3BsaWNlKHBpY2suaWQuaW5kZXgsIDEpXHJcbiAgLy8gICAgICAgICAgIHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUocGljay5pZClcclxuICAvLyAgICAgICAgICAgdGhhdC50aXAuc2V0X3RleHQoJ+W3pumUruW8gOWni++8jOWPs+mUrue7k+adn++8jENUUkwr5Y+z6ZSu5pKk6ZSAJylcclxuICAvLyAgICAgICAgICAgb3JpZ2luYWxQb3NpdGlvbiA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgLy8gICAgICAgICAgICAgY2FydGVzaWFuLFxyXG4gIC8vICAgICAgICAgICAgIHRoYXQuc2RrLnZpZXdlclxyXG4gIC8vICAgICAgICAgICApXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KVxyXG5cclxuICAvLyAgICAgdGhhdC5ldmVudC5tb3VzZV9yaWdodCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gIC8vICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSBvcmlnaW5hbFBvc2l0aW9uXHJcbiAgLy8gICAgICAgICBjYihudWxsLCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zKVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gIC8vICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gIC8vICAgICAgICAgICBwb3NpdGlvbnNbaV0ubG5nLFxyXG4gIC8vICAgICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gIC8vICAgICAgICAgICBwb3NpdGlvbnNbaV0uYWx0XHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIG5ld3Bvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gIC8vICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gIC8vICAgICAgIClcclxuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgICAgdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGF0Lm5vZGVQb2ludHNbaV0pXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHRoYXQubm9kZVBvaW50cyA9IFtdXHJcbiAgLy8gICAgICAgdGhhdC5ldmVudC5kZXN0cm95KClcclxuICAvLyAgICAgICB0aGF0LnRpcC5kZXN0cm95KClcclxuICAvLyAgICAgfSlcclxuXHJcbiAgLy8gICAgIHRoYXQuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gIC8vICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gIC8vICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgLy8gICAgICAgICAgIHRoYXQuc2RrLnZpZXdlclxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgbGV0IHBvc2l0aW9ucyA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNcclxuICAvLyAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAvLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAvLyAgICAgICAgICAgICBwb3NpdGlvbnNbaV0ubG5nLFxyXG4gIC8vICAgICAgICAgICAgIHBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgLy8gICAgICAgICAgICAgcG9zaXRpb25zW2ldLmFsdFxyXG4gIC8vICAgICAgICAgICApXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgICBuZXdwb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAvLyAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoID09PSAxKSB7XHJcbiAgLy8gICAgICAgICAgIHRoYXQubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAvLyAgICAgICAgICAgXVxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgLy8gICAgICAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAvLyAgICAgICAgICAgICBsYXQ6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gIC8vICAgICAgICAgICAgIGFsdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICB0aGF0LnRpcC5zZXRQb3NpdGlvbihcclxuICAvLyAgICAgICAgIGNhcnRlc2lhbixcclxuICAvLyAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgLy8gICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgLy8gICAgICAgKVxyXG4gIC8vICAgICB9KVxyXG5cclxuICAvLyAgICAgdGhhdC5ldmVudC5tb3VzZV9yaWdodF9rZXlib2FyZF9jdHJsKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLnBvcCgpXHJcbiAgLy8gICAgICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm5vZGVQb2ludHNbdGhhdC5ub2RlUG9pbnRzLmxlbmd0aCAtIDFdXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICB0aGF0Lm5vZGVQb2ludHMucG9wKClcclxuICAvLyAgICAgICAgIGlmIChzZWxlY3RQb2ludC5pbmRleCA9PT0gdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGgpIHtcclxuICAvLyAgICAgICAgICAgaWYgKHRoYXQubm9kZVBvaW50c1tzZWxlY3RQb2ludC5pbmRleCAtIDFdKSB7XHJcbiAgLy8gICAgICAgICAgICAgc2VsZWN0UG9pbnQgPSB0aGF0Lm5vZGVQb2ludHNbc2VsZWN0UG9pbnQuaW5kZXggLSAxXVxyXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgIHNlbGVjdFBvaW50LmluZGV4ID0gMFxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KVxyXG5cclxuICAvLyAgICAgdGhhdC5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAvLyAgICAgICByZXR1cm4gbmV3cG9zaXRpb25zXHJcbiAgLy8gICAgIH0sIGZhbHNlKVxyXG5cclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgbGV0IGVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gIC8vICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gIC8vICAgICAgICAgaW5kZXg6IGksXHJcbiAgLy8gICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAvLyAgICAgICAgICksXHJcbiAgLy8gICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAvLyAgICAgICAgICAgaW1hZ2U6IHRoYXQuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgLy8gICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAvLyAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAvLyAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KVxyXG4gIC8vICAgICAgIHRoYXQubm9kZVBvaW50cy5wdXNoKGVudGl0eSlcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgbm9kZUVkaXQoKSB7XHJcbiAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICBpZiAoWUouTWVhc3VyZS5HZXRNZWFzdXJlU3RhdHVzKCkpIHtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgIHRoaXMudGlwID0gbmV3IE1vdXNlVGlwKCfor7fpgInmi6nkuIDkuKrpobbngrnvvIzlj7PplK7lj5bmtognLCB0aGlzLnNkaylcclxuICAgICAgdGhpcy5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QgPSBuZXcgQ29udHJvbGxlcih0aGlzLnNkaylcclxuXHJcbiAgICAgIGxldCBzZWxlY3RQb2ludFxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB2YXIgcGljayA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5waWNrKG1vdmVtZW50LnBvc2l0aW9uKVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHBpY2sgJiZcclxuICAgICAgICAgIHBpY2suaWQgJiZcclxuICAgICAgICAgIHBpY2suaWQubmFtZSAmJlxyXG4gICAgICAgICAgcGljay5pZC5uYW1lID09PSAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCdcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHNlbGVjdFBvaW50ID0gcGljay5pZFxyXG4gICAgICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0LnBvc2l0aW9uID1cclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF1cclxuICAgICAgICAgIHRoaXMuQ29udHJvbGxlck9iamVjdC5lZGl0VHJhbnNsYXRpb25hbCgpXHJcbiAgICAgICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgICAgIHRoaXMuQ29udHJvbGxlck9iamVjdC5jb250cm9sbGVyQ2FsbEJhY2sgPSBwYXJhbXMgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0UG9pbnQuaW5kZXggPT09IDApIHtcclxuICAgICAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5sYXQsXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24uYWx0XHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgICAgICAgIGxuZzogcGFyYW1zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgICAgIGxhdDogcGFyYW1zLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICAgICAgICAgIGFsdDogcGFyYW1zLnBvc2l0aW9uLmFsdFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHBhcmFtcy5wb3NpdGlvblxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxuZyAmJiAodGhpcy5fZWxtcy5sbmdbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHBhcmFtcy5wb3NpdGlvbi5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sbmdJbnB1dCAmJiAodGhpcy5fZWxtcy5sbmdJbnB1dFtzZWxlY3RQb2ludC5pbmRleF0udmFsdWUgPSBwYXJhbXMucG9zaXRpb24ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubGF0ICYmICh0aGlzLl9lbG1zLmxhdFtzZWxlY3RQb2ludC5pbmRleF0uaW5uZXJIVE1MID0gcGFyYW1zLnBvc2l0aW9uLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxhdElucHV0ICYmICh0aGlzLl9lbG1zLmxhdElucHV0W3NlbGVjdFBvaW50LmluZGV4XS52YWx1ZSA9IHBhcmFtcy5wb3NpdGlvbi5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5hbHQgJiYgKHRoaXMuX2VsbXMuYWx0W3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSBwYXJhbXMucG9zaXRpb24uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMuYWx0SW5wdXQgJiYgKHRoaXMuX2VsbXMuYWx0SW5wdXRbc2VsZWN0UG9pbnQuaW5kZXhdLnZhbHVlID0gcGFyYW1zLnBvc2l0aW9uLmFsdC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBzZWxlY3RQb2ludC5wb3NpdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24uYWx0XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgICAgdGhpcy50aXAgPSBudWxsXHJcbiAgICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0LmRlc3Ryb3koKVxyXG5cclxuICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi54LFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgIClcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgcmV0dXJuIENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgIH0sIGZhbHNlKVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGVudGl0eSA9IHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAgICAgICAgICAgaW1hZ2U6IHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICAgICAgICAgIGNvbG9yOiBDZXNpdW0uQ29sb3IuV0hJVEUud2l0aEFscGhhKDAuOTkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLm5vZGVQb2ludHMucHVzaChlbnRpdHkpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlTm9kZUVkaXQoKSB7XHJcbiAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QgJiYgdGhpcy5Db250cm9sbGVyT2JqZWN0LmRlc3Ryb3koKVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCA9IG51bGxcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgIH1cclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDliKDpmaRcclxuICAgKi9cclxuICBhc3luYyByZW1vdmUoKSB7XHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgIHRoaXMubGFiZWwgJiYgdGhpcy5sYWJlbC5yZW1vdmUoKVxyXG4gICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLmVudGl0eSlcclxuICAgIHRoaXMuZW50aXR5ID0gbnVsbFxyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdCAmJiAhdGhpcy5fRGlhbG9nT2JqZWN0LmlzRGVzdHJveSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnNkay5yZW1vdmVJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgYXdhaXQgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICB9XHJcblxyXG4gIC8qKkBkZXNjIOaJk+W8gOW5s+enu+WKn+iDvVxyXG4gICAqXHJcbiAgICogQG1lbWJlck9mIFNvdXJjZVxyXG4gICAqIEBwYXJhbSBzdGF0dXMge2Jvb2xlYW59XHJcbiAgICpcclxuICAgKiAqL1xyXG4gIHNldCBwb3NpdGlvbkVkaXRpbmcoc3RhdHVzKSB7XHJcbiAgICBpZiAoWUouTWVhc3VyZS5HZXRNZWFzdXJlU3RhdHVzKCkgfHwgIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZyA9IHN0YXR1c1xyXG4gICAgaWYgKHN0YXR1cyA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgIHRoaXMuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGlzLnNkaylcclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgIHRoaXMudGlwID0gbmV3IE1vdXNlVGlwKCfngrnlh7vpvKDmoIflt6bplK7noa7orqTvvIzlj7PplK7lj5bmtognLCB0aGlzLnNkaylcclxuICAgICAgdGhpcy5sYWJlbCAmJlxyXG4gICAgICAgICh0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQuY29sb3IgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKFxyXG4gICAgICAgICAgYHJnYmEoMjU1LDI1NSwyNTUsMC45KWBcclxuICAgICAgICApKVxyXG4gICAgICB0aGlzLnBpY2tpbmcgPSBmYWxzZVxyXG4gICAgICBsZXQgcG9zaXRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMucG9zaXRpb25zKSlcclxuICAgICAgbGV0IHBvc2l0aW9uczIgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgIC8vIGxldCBwb3NpdGlvbnMyID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwb3NpdGlvbnMpKVxyXG4gICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9uczIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgLy8gICBsZXQgaGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLmdldEhlaWdodChDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21EZWdyZWVzKHBvc2l0aW9uczJbaV0ubG5nLCBwb3NpdGlvbnMyW2ldLmxhdCkpXHJcbiAgICAgIC8vICAgcG9zaXRpb25zMltpXSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAvLyAgICAgcG9zaXRpb25zMltpXS5sbmcsXHJcbiAgICAgIC8vICAgICBwb3NpdGlvbnMyW2ldLmxhdCxcclxuICAgICAgLy8gICAgIE51bWJlcigocG9zaXRpb25zMltpXS5hbHQgKyBOdW1iZXIoaGVpZ2h0KSkudG9GaXhlZCgyKSlcclxuICAgICAgLy8gICApXHJcbiAgICAgIC8vIH1cclxuICAgICAgdGhpcy5wcmV2aW91cyA9IHtcclxuICAgICAgICBwb3NpdGlvbnM6IFsuLi50aGlzLm9wdGlvbnMucG9zaXRpb25zXVxyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgcG9zaXRpb25zW2ldID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICBwb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgcG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGNlbnRlciA9IHBvc2l0aW9uc1tNYXRoLmZsb29yKHBvc2l0aW9ucy5sZW5ndGggLyAyKV1cclxuICAgICAgbGV0IGRpc3Bhcml0eSA9IFtdXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZGlzcGFyaXR5LnB1c2goe1xyXG4gICAgICAgICAgeDogY2VudGVyLnggLSBwb3NpdGlvbnNbaV0ueCxcclxuICAgICAgICAgIHk6IGNlbnRlci55IC0gcG9zaXRpb25zW2ldLnksXHJcbiAgICAgICAgICB6OiBjZW50ZXIueiAtIHBvc2l0aW9uc1tpXS56XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICBsZXQgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgbGV0IG5ld3Bvc2l0aW9uczg0ID0gW11cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgICBuZXdwb3NpdGlvbnM4NCA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBuZXdQID0ge1xyXG4gICAgICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgICAgICB6OiBjYXJ0ZXNpYW4ueiAtIGRpc3Bhcml0eVtpXS56XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgcG9zODQgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gICAgICAgICAgICBuZXdQLFxyXG4gICAgICAgICAgICB0aGlzLnNkay52aWV3ZXJcclxuICAgICAgICAgIClcclxuICAgICAgICAgIHBvczg0LmFsdCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICAvLyBsZXQgaGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLmdldEhlaWdodChDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21EZWdyZWVzKHBvczg0LmxuZywgcG9zODQubGF0KSlcclxuICAgICAgICAgIC8vIHBvczg0LmFsdCA9IE51bWJlcigocG9zODQuYWx0ICsgTnVtYmVyKGhlaWdodCkpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAvLyBuZXdQID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAvLyAgIHBvczg0LmxuZyxcclxuICAgICAgICAgIC8vICAgcG9zODQubGF0LFxyXG4gICAgICAgICAgLy8gICBwb3M4NC5hbHRcclxuICAgICAgICAgIC8vIClcclxuICAgICAgICAgIG5ld3Bvc2l0aW9ucy5wdXNoKG5ld1ApXHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnM4NC5wdXNoKHBvczg0KVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcG9zaXRpb244NCA9IG5ld3Bvc2l0aW9uczg0WzBdXHJcbiAgICAgICAgcG9zaXRpb25zMiA9IHRoaXMucmVuZXdQb3NpdGlvbnMobmV3cG9zaXRpb25zODQpXHJcbiAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtwb3NpdGlvbjg0LmxuZywgcG9zaXRpb244NC5sYXQsIHBvc2l0aW9uODQuYWx0XVxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgIGxuZzogcG9zaXRpb244NC5sbmcsXHJcbiAgICAgICAgICBsYXQ6IHBvc2l0aW9uODQubGF0LFxyXG4gICAgICAgICAgYWx0OiBwb3NpdGlvbjg0LmFsdFxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRpcC5zZXRQb3NpdGlvbihcclxuICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgICAgICAgKVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgICBuZXdwb3NpdGlvbnM4NCA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBuZXdQID0ge1xyXG4gICAgICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgICAgICB6OiBjYXJ0ZXNpYW4ueiAtIGRpc3Bhcml0eVtpXS56XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgcG9zODQgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gICAgICAgICAgICBuZXdQLFxyXG4gICAgICAgICAgICB0aGlzLnNkay52aWV3ZXJcclxuICAgICAgICAgIClcclxuICAgICAgICAgIHBvczg0LmFsdCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaChuZXdQKVxyXG4gICAgICAgICAgbmV3cG9zaXRpb25zODQucHVzaChwb3M4NClcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uc0xuZ0xhdCA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdwb3NpdGlvbnM4NC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHBvc2l0aW9uID0gbmV3cG9zaXRpb25zODRbaV1cclxuICAgICAgICAgIHBvc2l0aW9uc0xuZ0xhdC5wdXNoKHBvc2l0aW9uKVxyXG5cclxuICAgICAgICAgIHRoaXMuX2VsbXMubG5nICYmICh0aGlzLl9lbG1zLmxuZ1tpXS5pbm5lckhUTUwgPSBwb3NpdGlvbi5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMubG5nSW5wdXQgJiYgKHRoaXMuX2VsbXMubG5nSW5wdXRbaV0udmFsdWUgPSBwb3NpdGlvbi5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGF0ICYmICh0aGlzLl9lbG1zLmxhdFtpXS5pbm5lckhUTUwgPSBwb3NpdGlvbi5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGF0SW5wdXQgJiYgKHRoaXMuX2VsbXMubGF0SW5wdXRbaV0udmFsdWUgPSBwb3NpdGlvbi5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMuYWx0ICYmICh0aGlzLl9lbG1zLmFsdFtpXS5pbm5lckhUTUwgPSBwb3NpdGlvbi5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMuYWx0SW5wdXQgJiYgKHRoaXMuX2VsbXMuYWx0SW5wdXRbaV0udmFsdWUgPSBwb3NpdGlvbi5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnMgPSBwb3NpdGlvbnNMbmdMYXRcclxuICAgICAgICB0aGlzLnByZXZpb3VzLnBvc2l0aW9ucyA9IHBvc2l0aW9uc0xuZ0xhdFxyXG5cclxuICAgICAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnNMbmdMYXQgPSBwb3NpdGlvbnNMbmdMYXRcclxuICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucywgKCk9PntcclxuICAgICAgICAgIGlmKHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrKClcclxuICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2sgPSBudWxsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgICApXHJcbiAgICAgICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHtcclxuICAgICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgbGV0IHBvcyA9IHtcclxuICAgICAgICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICAgICAgICB4OiAobW92ZW1lbnQucG9zaXRpb24xLnggKyBtb3ZlbWVudC5wb3NpdGlvbjIueCkgLyAyLFxyXG4gICAgICAgICAgICAgIHk6IChtb3ZlbWVudC5wb3NpdGlvbjEueSArIG1vdmVtZW50LnBvc2l0aW9uMi55KSAvIDJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGVuZFRpbWUgLSBzdGFydFRpbWUgPj0gNTAwKSB7XHJcbiAgICAgICAgICAgIC8vIOmVv+aMieWPlua2iFxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGVmdEV2ZW50KHBvcywgY2FydGVzaWFuKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgICAgIHBvc2l0aW9uczJcclxuICAgICAgICApXHJcbiAgICAgIH0sIGZhbHNlKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmxhYmVsIHx8ICF0aGlzLmxhYmVsLmVudGl0eSkge1xyXG4gICAgICAgIHRoaXMubGFiZWwuZW50aXR5LmJpbGxib2FyZC5jb2xvciA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoXHJcbiAgICAgICAgICBgcmdiYSgyNTUsMjU1LDI1NSwxKWBcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5waWNraW5nID0gdHJ1ZVxyXG4gICAgICBpZiAodGhpcy5ldmVudCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICApXHJcbiAgICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICAgIF1cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgbGF0OiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgICAgYWx0OiBmcm9tRGVncmVlc0FycmF5WzJdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICAgIGxuZzogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICAgIGFsdDogZnJvbURlZ3JlZXNBcnJheVsyXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBwb3NpdGlvbkVkaXRpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZ1xyXG4gIH1cclxuICBvcGVuUG9zaXRpb25FZGl0aW5nKGNkKSB7XHJcbiAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IHRydWVcclxuICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrID0gY2RcclxuICB9XHJcblxyXG4gIHNldERJVihvcHRpb25zID0geyBkb21pZDogJycsIHg6IDEwLCB5OiAxMCB9KSB7XHJcbiAgICBvcHRpb25zLnggPSBvcHRpb25zLnggfHwgb3B0aW9ucy54ID09PSAwID8gb3B0aW9ucy54IDogMTBcclxuICAgIG9wdGlvbnMueSA9IG9wdGlvbnMueSB8fCBvcHRpb25zLnkgPT09IDAgPyBvcHRpb25zLnkgOiAxMFxyXG5cclxuICAgIGxldCBwb2ludHMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHBvaW50cy5wdXNoKFtcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdFxyXG4gICAgICBdKVxyXG4gICAgfVxyXG4gICAgbGV0IGxpbmUgPSB0dXJmLmxpbmVTdHJpbmcocG9pbnRzKVxyXG4gICAgbGV0IGxlbmd0aCA9IHR1cmYubGVuZ3RoKGxpbmUsIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9KVxyXG4gICAgbGV0IHNsaWNlZCA9IHR1cmYubGluZVNsaWNlQWxvbmcobGluZSwgMCwgbGVuZ3RoIC8gMiwge1xyXG4gICAgICB1bml0czogJ2tpbG9tZXRlcnMnXHJcbiAgICB9KVxyXG5cclxuICAgIGxldCBzaXRlSW5mb0RvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9wdGlvbnMuZG9taWQpXHJcbiAgICBsZXQgc2l0ZUluZm9Qb3NpdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAuLi5zbGljZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbc2xpY2VkLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aCAtIDFdXHJcbiAgICApXHJcbiAgICB0aGlzLnNkay52aWV3ZXIuc2NlbmUucG9zdFJlbmRlci5hZGRFdmVudExpc3RlbmVyKHBlcmNlbnRhZ2UgPT4ge1xyXG4gICAgICAvL+i9rOaNouWIsOWxj+W5leWdkOagh1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJ2Jsb2NrJyB8fFxyXG4gICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLmRpc3BsYXkgPT09ICcnXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCB3aW5wb3MgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuY2FydGVzaWFuVG9DYW52YXNDb29yZGluYXRlcyhcclxuICAgICAgICAgIHNpdGVJbmZvUG9zaXRpb25cclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKHdpbnBvcykge1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUubGVmdCA9ICh3aW5wb3MueCArIG9wdGlvbnMueCkudG9GaXhlZCgwKSArICdweCdcclxuICAgICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLnRvcCA9ICh3aW5wb3MueSArIG9wdGlvbnMueSkudG9GaXhlZCgwKSArICdweCdcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG59XHJcbmV4cG9ydCBkZWZhdWx0IEN1cnZlbGluZU9iamVjdFxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUlBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFwQkE7QUFBQTtBQWtCQTtBQUdBO0FBQ0E7QUFDQTtBQVFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBakJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF6QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtEQTtBQXpEQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBVkE7QUFBQTtBQVFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFsQkE7QUFBQTtBQUFBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBb0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBNkRBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQXZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBckRBO0FBc0RBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFjQTtBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBT0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF0SEE7QUFBQTtBQUFBO0FBd0hBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBdnRCQTtBQUFBO0FBQUE7QUFBQTtBQXl0QkE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBR0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUF6REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE0REE7QUFJQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBRUE7QUF5QkE7QUFBQTtBQXRCQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBMUdBO0FBQUE7QUFBQTtBQUFBO0FBNEdBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBWkE7QUFBQTtBQUFBO0FBQUE7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUFBO0FBQUE7QUFBQTtBQW9PQTtBQUNBO0FBQUE7QUEvTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFJQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE5OERBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUNBO0FBZUE7QUFBQTtBQVpBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSEE7QUFBQTtBQUFBO0FBT0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFIQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQXZEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQWcxREEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Obj/Base/CurvelineObject/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/CurvelineObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _eventBinding__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./eventBinding */ \"./src/Obj/Base/CurvelineObject/eventBinding.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Controller_index__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../Controller/index */ \"./src/Controller/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * @description 线\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar CurvelineObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 曲线\r\n * @param options {object} 线属性\r\n * @param options.name{string} 名称\r\n * @param options.width=3{number} 线宽\r\n * @param options.color=#ff0000 {string} 颜色\r\n * @param options.type=0 {number} 材质类型 0-实线 1-虚线 2-泛光...\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对高度;2:依附模式)\r\n * @param options.noseToTail=false {boolean} 首尾相连\r\n * @param options.extend=false {boolean} 线缓冲\r\n * @param options.extendWidth=10 {number} 线缓冲宽度\r\n * @param options.extendColor=rgba(255,255,80,0.3) {number} 线缓冲颜色\r\n * @param options.show=true {boolean} 显隐\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {string} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * \r\n * \r\n * @param _Dialog {object} 弹框事件\r\n * @param _Dialog.confirmCallBack {function} 弹框确认时的回调\r\n * */\n function CurvelineObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, CurvelineObject);\n _this2 = _callSuper(this, CurvelineObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.width = options.width || options.width === 0 ? options.width : 3;\n _this2.options.color = options.color || '#ff0000';\n _this2.options.type = options.type ? Number(options.type) : 0;\n _this2.options.noseToTail = options.noseToTail || false;\n _this2.options.extend = options.extend || false;\n _this2.options.rotate = options.rotate || options.rotate === false ? options.rotate : true;\n _this2.options.space = options.space || 1;\n _this2.options.speed = options.speed || 10;\n // this.options.dashSize = options.dashSize || 0.03\n _this2.options.wordsName = options.wordsName || 0;\n _this2.options.extendWidth = options.extendWidth || options.extendWidth === 0 ? options.extendWidth : 10;\n _this2.options.extendColor = options.extendColor || 'rgba(255,255,80,0.3)';\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2._elms = [];\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n // this.options.attribute.camera = this.options.attribute.camera || {}\n // this.options.attribute.camera.content =\n // this.options.attribute.camera.content || []\n // this.options.attribute.vr = this.options.attribute.vr || {}\n // this.options.attribute.vr.content =\n // this.options.attribute.vr.content || []\n // this.options.attribute.goods = this.options.attribute.goods || {}\n // this.options.attribute.goods.content =\n // this.options.attribute.goods.content || []\n\n delete _this2.options.attribute.camera;\n delete _this2.options.attribute.vr;\n delete _this2.options.attribute.goods;\n _this2.operate = {};\n _this2.nodePoints = [];\n _this2.unitNum = 0;\n _this2.inputSpeed = options.speed && Math.pow(options.speed, -1) * 100 || 10;\n _this2.Dialog = _Dialog;\n if (!_this2.options.positions || _this2.options.positions.length < 2) {\n _this2._error = '线段最少需要两个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n for (var i = 0; i < _this2.options.positions.length; i++) {\n _this2.options.positions[i].lng = Number(Number(_this2.options.positions[i].lng).toFixed(8));\n _this2.options.positions[i].lat = Number(Number(_this2.options.positions[i].lat).toFixed(8));\n _this2.options.positions[i].alt = Number(Number(_this2.options.positions[i].alt).toFixed(2));\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n CurvelineObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(CurvelineObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(CurvelineObject, [{\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || '#ff0000';\n // this.entity.polyline.material = this.getMaterial(v, this.options.type)\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,1)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"speed\",\n get: function get() {\n return this.options.speed;\n },\n set: function set(v) {\n this.options.speed = v;\n // this.options.speed = v !== 0 ? Math.pow(v, -1) * 100 : 0\n this.inputSpeed = v !== 0 ? Math.pow(v, -1) * 100 : 0;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n // get dashSize() {\n // return this.options.dashSize\n // }\n\n // set dashSize(v) {\n // this.options.dashSize = v\n // let params = { ...this.options }\n // params.speed = this.inputSpeed\n // // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params)\n // }\n }, {\n key: \"rotate\",\n get: function get() {\n return this.options.rotate;\n },\n set: function set(v) {\n this.options.rotate = v;\n this.closeNodeEdit();\n this._elms.rotate && this._elms.rotate.forEach(function (item) {\n item.checked = v;\n });\n this.options.rotate = v;\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options);\n }\n }, {\n key: \"space\",\n get: function get() {\n return this.options.space;\n },\n set: function set(v) {\n this.options.space = v;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n }, {\n key: \"wordsName\",\n get: function get() {\n return this.options.wordsName;\n },\n set: function set(v) {\n var _this4 = this;\n this.options.wordsName = v;\n var _this = this;\n if (!this.noseToTail) {\n this.computeDistance(this.smoothHandle(this.options.positions), 2, v).then(function (res) {\n _this.lengthByMeter = res;\n _this4.lengthChangeCallBack && _this4.lengthChangeCallBack();\n });\n } else {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n }\n }\n\n // get fitLengthUnit() {\n // return this.options['fit-length-unit']\n // }\n // set fitLengthUnit(v) {\n // this.options['fit-length-unit'] = v\n // this._elms.fitLengthUnit &&\n // this._elms.fitLengthUnit.forEach(item => {\n // item.value = v\n // })\n // if (this.options.fitLengthByMeter) {\n // switch (v) {\n // case '米':\n // this.fitLength = this.options.fitLengthByMeter\n // break\n // case '千米':\n // this.fitLength = Number(\n // (this.options.fitLengthByMeter / 1000).toFixed(5)\n // )\n // break\n // default:\n // this.fitLength = this.options.fitLengthByMeter\n // }\n // }\n // }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.width;\n },\n set: function set(v) {\n var _this5 = this;\n this.options.width = v || v == 0 ? v : 3;\n this._elms.lineWidth && this._elms.lineWidth.forEach(function (item) {\n item.value = _this5.options.width;\n });\n if (this.entity && this.entity.polyline) {\n this.entity.polyline.width = this.entity.polyline.width + v - this.entity.polyline.oriWidth;\n this.entity.polyline.oriWidth = this.options.width;\n }\n // this.entity &&\n // this.entity.polyline &&\n // (this.entity.polyline.width = this.options.width) && (this.entity.polyline.oriWidth = this.options.width)\n }\n }, {\n key: \"lineType\",\n get: function get() {\n return this.options.type;\n },\n set: function set(v) {\n var _this6 = this;\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n this.options.type = Number(v);\n var _loop = function _loop(i) {\n if (lineTypeData[i].key === Number(v)) {\n _this6._elms.lineType && _this6._elms.lineType.forEach(function (item) {\n item.value = lineTypeData[i].value;\n if (2 < item.value && item.value < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < item.value && item.value < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n });\n return 1; // break\n }\n };\n for (var i = 0; i < lineTypeData.length; i++) {\n if (_loop(i)) break;\n }\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n this.entity && this.entity.polyline && (this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params));\n }\n }, {\n key: \"noseToTail\",\n get: function get() {\n return this.options.noseToTail;\n },\n set: function set(v) {\n this.options.noseToTail = v;\n this.closeNodeEdit();\n this._elms.noseToTail && this._elms.noseToTail.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n }\n // if (v) {\n // if (this.options.fitLengthByMeter > 1000 || this.options.fitLengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n\n // } else {\n // if (this.options.lengthByMeter > 1000 || this.options.lengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n // }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this7 = this;\n this.positionEditing = false;\n this.options.heightMode = v || v == 0 ? v : 2;\n var heightModeName = '';\n this.closeNodeEdit();\n var ground = false;\n var disabled = false;\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n this.entity.polyline.clampToGround = ground;\n heightModeName = '依附模型';\n break;\n }\n\n // this.options.lengthByMeter = this.computeDistance2(\n // this.smoothHandle(this.options.positions),\n // 2,\n // ground\n // )\n this.lengthUnit = this.lengthUnit;\n this._elms.heightMode && (this._elms.heightMode.value = heightModeName);\n this._elms.heightModeObject && this._elms.heightModeObject.legp_searchActive(heightModeName);\n if (disabled) {\n this._elms.heightBox && (this._elms.heightBox.className = 'input-number input-number-unit-1 height-box disabled');\n this._elms.heightConfirm && this._elms.heightConfirm.setAttribute('disabled', 'disabled');\n } else {\n this._elms.heightBox && (this._elms.heightBox.className = 'input-number input-number-unit-1 height-box');\n this._elms.heightConfirm && this._elms.heightConfirm.removeAttribute('disabled');\n }\n setTimeout(function () {\n if (ground) {\n _this7.label.ground = ground;\n _this7._elms.heightMode && (_this7._elms.heightMode.value = '依附模型');\n _this7.label.position = [_this7.options.positions[0].lng, _this7.options.positions[0].lat];\n } else {\n _this7.label.ground = ground;\n _this7.label.position = [_this7.options.positions[0].lng, _this7.options.positions[0].lat, fromDegreesArray[2]];\n _this7.options.label.position = {\n lng: _this7.options.positions[0].lng,\n lat: _this7.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n }\n }, 0);\n }\n }, {\n key: \"extend\",\n get: function get() {\n return this.options.extend;\n },\n set: function set(v) {\n this.options.extend = v;\n this.closeNodeEdit();\n if (v) {\n this.heightMode = 2;\n }\n this._elms.extend && this._elms.extend.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n if (this.options.extend) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n } else {\n this.entity.polygon = undefined;\n }\n }\n }\n }, {\n key: \"extendWidth\",\n get: function get() {\n return this.options.extendWidth;\n },\n set: function set(v) {\n this.options.extendWidth = v;\n this._elms.extendWidth && this._elms.extendWidth.forEach(function (item) {\n item.value = v;\n });\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n }\n }, {\n key: \"extendColor\",\n get: function get() {\n return this.options.extendColor;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.extendColor = v;\n if (this._elms.extendColor) {\n this._elms.extendColor.forEach(function (item, i) {\n var extendColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this8._elms.extendColor[i] = extendColorPicker;\n });\n }\n this.entity && this.entity.polygon && (this.entity.polygon.material = Cesium.Color.fromCssColorString(this.options.extendColor));\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n setTimeout(function () {\n _this9.label.position = [_this9.options.positions[0].lng, _this9.options.positions[0].lat, _this9.options.positions[0].alt];\n }, 0);\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this11 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this11.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this11._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this12 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this12.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this12._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this13 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this13.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this13._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"attributeType\",\n get: function get() {\n return this.options.attributeType;\n },\n set: function set(v) {\n this.options.attributeType = v;\n this._elms.attributeType && this._elms.attributeType.forEach(function (item) {\n item.value = v;\n });\n var attributeContent = this._DialogObject._element.content.getElementsByClassName('attribute-content');\n for (var i = 0; i < attributeContent.length; i++) {\n if (attributeContent[i].className.indexOf('attribute-content-' + v) > -1) {\n attributeContent[i].style.display = 'block';\n } else {\n attributeContent[i].style.display = 'none';\n }\n }\n }\n }, {\n key: \"attributeLink\",\n get: function get() {\n return this.options.attribute.link.content;\n },\n set: function set(v) {\n var _this14 = this;\n this.options.attribute.link.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-link').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.link.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.link.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.link.content[i].name + \"
\\n
\" + this.options.attribute.link.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n linkEdit: function () {\n var _linkEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(index) {\n var table, tableContent, item, _loop2, _i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return _this14.options.attribute.link.content;\n case 2:\n _this14.attributeLink = _context3.sent;\n table = _this14._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop2 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop2(_i) {\n var height, _html, textareaElm, td, btn, n, _iterator, _step, _loop3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(index === _i)) {\n _context2.next = 36;\n break;\n }\n height = item[_i].offsetHeight;\n _html = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i].innerHTML = _html;\n textareaElm = item[_i].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this14.options.attribute.link.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this14.options.attribute.link.content[index].url;\n btn = item[_i].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context2.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context2.next = 14;\n break;\n }\n return _context2.abrupt(\"continue\", 32);\n case 14:\n _iterator = _createForOfIteratorHelper(btn[n].attributes);\n _context2.prev = 15;\n _loop3 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop3() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop3$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n m = _step.value;\n if (!(m.name === '@click')) {\n _context.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _loop3);\n });\n _iterator.s();\n case 18:\n if ((_step = _iterator.n()).done) {\n _context2.next = 24;\n break;\n }\n return _context2.delegateYield(_loop3(), \"t0\", 20);\n case 20:\n if (!_context2.t0) {\n _context2.next = 22;\n break;\n }\n return _context2.abrupt(\"break\", 24);\n case 22:\n _context2.next = 18;\n break;\n case 24:\n _context2.next = 29;\n break;\n case 26:\n _context2.prev = 26;\n _context2.t1 = _context2[\"catch\"](15);\n _iterator.e(_context2.t1);\n case 29:\n _context2.prev = 29;\n _iterator.f();\n return _context2.finish(29);\n case 32:\n n++;\n _context2.next = 11;\n break;\n case 35:\n return _context2.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context2.stop();\n }\n }, _loop2, null, [[15, 26, 29, 32]]);\n });\n _i = 0;\n case 8:\n if (!(_i < item.length)) {\n _context3.next = 15;\n break;\n }\n return _context3.delegateYield(_loop2(_i), \"t0\", 10);\n case 10:\n if (!_context3.t0) {\n _context3.next = 12;\n break;\n }\n return _context3.abrupt(\"break\", 15);\n case 12:\n _i++;\n _context3.next = 8;\n break;\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }, _callee);\n }));\n function linkEdit(_x) {\n return _linkEdit.apply(this, arguments);\n }\n return linkEdit;\n }(),\n linkDelete: function linkDelete(i) {\n _this14.options.attribute.link.content.splice(i, 1);\n _this14.attributeLink = _this14.options.attribute.link.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, '');\n var url = value.url && value.url.replace(/\\s/g, '');\n if (name && url) {\n _this14.options.attribute.link.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this14.attributeLink = _this14.options.attribute.link.content;\n },\n cancelEdit: function cancelEdit() {\n _this14.attributeLink = _this14.options.attribute.link.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect);\n fileElm.addEventListener('change', _fileSelect);\n }\n };\n var _fileSelect = function _fileSelect(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop4 = function _loop4(_i2) {\n var btn = item[_i2].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator2 = _createForOfIteratorHelper(btn[n].attributes),\n _step2;\n try {\n var _loop5 = function _loop5() {\n var m = _step2.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i2);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n if (_loop5()) break;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n };\n for (var _i2 = 0; _i2 < item.length; _i2++) {\n _loop4(_i2);\n }\n }\n\n // get attributeCamera() {\n // return this.options.attribute.camera.content\n // }\n\n // set attributeCamera(v) {\n // this.options.attribute.camera.content = v\n // }\n\n // get attributeVr() {\n // return this.options.attribute.vr.content\n // }\n\n // set attributeVr(v) {\n // this.options.attribute.vr.content = v\n // if (\n // !this._DialogObject ||\n // !this._DialogObject._element ||\n // !this._DialogObject._element.content ||\n // this._DialogObject._element.content.getElementsByClassName(\n // 'attribute-content-vr'\n // ).length == 0\n // ) {\n // return\n // }\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // tableContent.innerHTML = ''\n // if (this.options.attribute.vr.content.length > 0) {\n // table.getElementsByClassName('table-empty')[0].style.display = 'none'\n // } else {\n // table.getElementsByClassName('table-empty')[0].style.display = 'flex'\n // }\n // for (let i = 0; i < this.options.attribute.vr.content.length; i++) {\n // let tr =\n // `\n //
\n //
` +\n // this.options.attribute.vr.content[i].name +\n // `
\n //
` +\n // this.options.attribute.vr.content[i].url +\n // `
\n //
\n // \n // \n //
\n //
`\n // let trElm = document.createRange().createContextualFragment(tr)\n // tableContent.appendChild(trElm)\n // }\n // let item = tableContent.getElementsByClassName('tr')\n // let fun = {\n // vrEdit: async index => {\n // this.attributeVr = await this.options.attribute.vr.content\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // let item = tableContent.getElementsByClassName('tr')\n // for (let i = 0; i < item.length; i++) {\n // if (index === i) {\n // let height = item[i].offsetHeight\n // let html = `\n //
\n // \n //
\n //
\n // \n //
\n //
\n // \n // \n //
`\n // item[i].innerHTML = html\n // let textareaElm = item[i].getElementsByClassName('link-edit')[0]\n // textareaElm.style.height = height - 10 + 'px'\n // let td = item[i].getElementsByClassName('td')\n // td[0].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].name\n // td[1].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].url\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](\n // {\n // name: td[0].getElementsByClassName('input')[0].value,\n // url: td[1].getElementsByClassName('input')[0].value\n // },\n // i\n // )\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // break\n // }\n // }\n // },\n // vrDelete: i => {\n // this.options.attribute.vr.content.splice(i, 1)\n // this.attributeVr = this.options.attribute.vr.content\n // },\n\n // confirmEdit: (value, i) => {\n // let name = value.name && value.name.replace(/\\s/g, '')\n // let url = value.url && value.url.replace(/\\s/g, '')\n // if (name && url) {\n // this.options.attribute.vr.content[i] = value\n // } else {\n // window.ELEMENT &&\n // window.ELEMENT.Message({\n // message: '名称或链接不能为空!',\n // type: 'warning',\n // duration: 1500\n // })\n // }\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // cancelEdit: () => {\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // fileSelect: (value, i) => {\n // let fileElm = item[i].getElementsByClassName('file-select')[0]\n // fileElm.click()\n // fileElm.removeEventListener('change', fileSelect)\n // fileElm.addEventListener('change', fileSelect)\n // }\n // }\n // let fileSelect = event => {\n // if (event.target.value) {\n // let td = item[\n // event.target.getAttribute('index')\n // ].getElementsByClassName('td')\n // td[1].getElementsByClassName('input')[0].value = event.target.value\n // event.target.value = null\n // }\n // }\n // for (let i = 0; i < item.length; i++) {\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](i)\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // }\n // }\n\n // get attributeGoods() {\n // return this.options.attribute.goods.content\n // }\n\n // set attributeGoods(v) {\n // this.options.attribute.goods.content = v\n // }\n }, {\n key: \"judgeLine\",\n value: function judgeLine(entity, newParam) {\n if (!entity.polyline.oriRepeat) {\n var param = {\n color: newParam.color,\n image: this.getSourceRootPath() + \"/img/arrow/1.png\",\n space: newParam.space,\n speed: newParam.speed\n };\n param.speed = newParam.rotate ? param.speed : 0 - param.speed;\n var canvasEle = document.createElement('canvas');\n var ctx = canvasEle.getContext('2d');\n var myImg = new Image();\n // myImg.src = that.getSourceRootPath() + '/img/arrow/1.png'\n myImg.src = param.image;\n var that = this;\n myImg.onload = function () {\n canvasEle.width = myImg.width * (param.space + 1);\n canvasEle.height = myImg.height;\n var oriRepeat = that.getSceenLine(entity, param, canvasEle);\n oriRepeat && (entity.polyline.oriRepeat = oriRepeat);\n var positionProperty = entity.polyline.positions;\n var positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime);\n if (!Cesium.defined(positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < positions.length - 1; ++i) {\n distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]);\n }\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = that.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = that.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = that.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n repeatX *= groundResolution / cameraHeight / (param.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var speed = repeatX / entity.polyline.oriRepeat;\n entity.polyline.oriSpeed = speed;\n entity.polyline.oriRepeatX = repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n entity.polyline.oriSpeed = sdk3dEntity.polyline.oriSpeed;\n entity.polyline.oriRepeatX = sdk3dEntity.polyline.oriRepeatX;\n }\n };\n }\n }\n /**获取当前满屏横线速度 */\n }, {\n key: \"getSceenLine\",\n value: function getSceenLine(entity, options, canvasEle) {\n var point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight);\n // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1)\n // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2)\n\n var ray = this.sdk.viewer.camera.getPickRay(point1);\n var cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n var ray2 = this.sdk.viewer.camera.getPickRay(point2);\n var cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // if (!cartesian1 || !cartesian2) {\n // let ray = this.sdk.viewer.camera.getPickRay(point1);\n // cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n\n // let ray2 = this.sdk.viewer.camera.getPickRay(point2);\n // cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // }\n if (cartesian1 && cartesian2) {\n var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = this.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = this.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = this.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = this.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n // repeatX *= groundResolution / cameraHeight / ((myImg.width / myImg.height * 5) + 1);\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n } else {\n repeatX = undefined;\n }\n if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id);\n return sdk3dEntity.polyline.oriRepeatX;\n }\n }\n }\n /**\r\n * 编辑框\r\n * @param {boolean} state true打开,false关闭\r\n */\n }, {\n key: \"edit\",\n value: (function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2(state) {\n var _this15 = this;\n var _this, tabClick, contentElm, tabsElm, colorPicker, labelColorPicker, extendColorPicker, lineColorPicker, labelBackgroundColorStartPicker, labelBackgroundColorEndPicker, all_elm;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n return _context4.abrupt(\"return\");\n case 8:\n this._DialogObject = _context4.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' polyline';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_10__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__[\"default\"]('polyline-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('color')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n extendColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('extendColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n lineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelLineColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorStart')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this15.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this15.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorEnd')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this15.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this15.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName('*');\n _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].on(this, all_elm);\n this._elms = _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].element;\n this._elms.color = [colorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.extendColor = [extendColorPicker];\n this._elms.labelLineColor = [lineColorPicker];\n this._elms.labelBackgroundColorStart = [labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n setTimeout(function () {\n _this15.attributeLink = _this15.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n var tagData = _this15.attributeSelect;\n var attributeElm = _this15._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(attributeElm, '.attribute-select');\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this15._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var i = 0; i < tagData.length; i++) {\n if (tagData[i].key === _this15.options.attributeType) {\n attributeSelectElm.value = tagData[i].value;\n legpObject.legp_searchActive(tagData[i].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i3 = 0; _i3 < tagData.length; _i3++) {\n if (tagData[_i3].value === attributeSelectElm.value) {\n _this15.attributeType = tagData[_i3].key;\n break;\n }\n }\n });\n }\n var nameData = [{\n name: '空间长度',\n value: '空间长度'\n }, {\n name: '投影长度',\n value: '投影长度'\n }, {\n name: '地表长度',\n value: '地表长度'\n }];\n var nameDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit');\n if (nameDataLegpObject) {\n nameDataLegpObject.legp_search(nameData);\n var nameDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n _this15._elms.wordsName = [nameDataLegpElm];\n nameDataLegpElm.value = _this15.options.wordsName;\n for (var _i4 = 0; _i4 < nameData.length; _i4++) {\n if (nameData[_i4].value === nameDataLegpElm.value) {\n nameDataLegpObject.legp_searchActive(nameData[_i4].value);\n break;\n }\n }\n nameDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < nameData.length; _i5++) {\n if (nameData[_i5].value === nameDataLegpElm.value) {\n _this15.wordsName = nameData[_i5].value;\n break;\n }\n }\n });\n }\n\n // 原始长度单位\n var unitData = [{\n name: '米',\n value: '米'\n }, {\n name: '千米',\n value: '千米'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit', 1);\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('input-select-unit')[1].getElementsByTagName('input')[0];\n _this15._elms.lengthUnit = [unitDataLegpElm];\n for (var _i6 = 0; _i6 < unitData.length; _i6++) {\n if (unitData[_i6].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i6].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < unitData.length; _i7++) {\n if (unitData[_i7].value === unitDataLegpElm.value) {\n _this15.lengthUnit = unitData[_i7].value;\n break;\n }\n }\n });\n }\n\n // 拟合长度单位\n // let fitUnitData = [\n // {\n // name: '米',\n // value: '米'\n // },\n // {\n // name: '千米',\n // value: '千米'\n // }\n // ]\n\n // let fitUnitDataLegpObject = legp(\n // this._DialogObject._element.content.getElementsByClassName(\n // 'input-select-fit-unit-box'\n // )[0],\n // '.input-select-fit-unit'\n // )\n // if (fitUnitDataLegpObject) {\n // fitUnitDataLegpObject.legp_search(fitUnitData)\n // let fitUnitDataLegpElm = this._DialogObject._element.content\n // .getElementsByClassName('input-select-fit-unit')[0]\n // .getElementsByTagName('input')[0]\n // this._elms.fitLengthUnit = [fitUnitDataLegpElm]\n // fitUnitDataLegpElm.value = this.options['fit-length-unit']\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // fitUnitDataLegpObject.legp_searchActive(fitUnitData[i].value)\n // break\n // }\n // }\n // fitUnitDataLegpElm.addEventListener('input', () => {\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // this.fitLengthUnit = fitUnitData[i].value\n // break\n // }\n // }\n // })\n // }\n\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n var lineTypeDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('input-select-line-type-box')[0], '.input-select-line-type');\n if (lineTypeDataLegpObject) {\n lineTypeDataLegpObject.legp_search(lineTypeData);\n var iActiveElm2 = document.createElement('i');\n iActiveElm2.className = 'icon icon-active';\n _this15._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByClassName('cy_datalist')[0].appendChild(iActiveElm2);\n var lineTypeDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByTagName('input')[0];\n _this15._elms.lineType = [lineTypeDataLegpElm];\n for (var _i8 = 0; _i8 < lineTypeData.length; _i8++) {\n if (lineTypeData[_i8].key === _this15.options.type) {\n lineTypeDataLegpObject.legp_searchActive(lineTypeData[_i8].value);\n lineTypeDataLegpElm.value = lineTypeData[_i8].value;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i8].icon);\n break;\n }\n }\n lineTypeDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < lineTypeData.length; _i9++) {\n if (lineTypeData[_i9].value === lineTypeDataLegpElm.value) {\n _this15.lineType = lineTypeData[_i9].key;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i9].icon);\n\n //控制参数显隐\n if (2 < _this15.lineType && _this15.lineType < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < _this15.lineType && _this15.lineType < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n break;\n }\n }\n });\n }\n var heightBoxElm = _this15._DialogObject._element.content.getElementsByClassName('height-box')[0];\n var heightElm = heightBoxElm.getElementsByClassName('height')[0];\n var heightConfirmElm = _this15._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (_this15.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n var heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n var heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (heightModeObject) {\n heightModeObject.legp_search(heightModeData);\n var heightModeDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n for (var _i10 = 0; _i10 < heightModeData.length; _i10++) {\n if (heightModeData[_i10].key == _this15.heightMode) {\n heightModeDataLegpElm.value = heightModeData[_i10].value;\n heightModeObject.legp_searchActive(heightModeData[_i10].value);\n break;\n }\n }\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i11 = 0; _i11 < heightModeData.length; _i11++) {\n if (heightModeData[_i11].value === heightModeDataLegpElm.value) {\n _this15.heightMode = heightModeData[_i11].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this15.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n _this15._elms.height = heightElm;\n _this15._elms.heightBox = heightBoxElm;\n _this15._elms.heightMode = heightModeDataLegpElm;\n _this15._elms.heightConfirm = heightConfirmElm;\n _this15._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n _this15.positionEditing = false;\n for (var _i12 = 0; _i12 < _this15.options.positions.length; _i12++) {\n _this15.options.positions[_i12].alt = Number((_this15.options.positions[_i12].alt + Number(heightElm.value)).toFixed(2));\n _this15._elms.alt[_i12].innerHTML = _this15.options.positions[_i12].alt;\n }\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n }\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n _this15._elms.lng = [];\n _this15._elms.lngInput = [];\n _this15._elms.lat = [];\n _this15._elms.latInput = [];\n _this15._elms.alt = [];\n _this15._elms.altInput = [];\n var _loop6 = function _loop6(_i13) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(_i13 + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this15.options.positions[_i13].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this15.options.positions[_i13].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this15.options.positions[_i13].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this15.options.positions[_i13].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this15.options.positions[_i13].alt.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this15.options.positions[_i13].alt.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this15.options.positions[_i13].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this15.options.positions[_i13].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this15.options.positions[_i13].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this15.options.positions[_i13].lng.toFixed(8);\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.label.position = [_this15.options.positions[0].lng, _this15.options.positions[0].lat, fromDegreesArray[2]];\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this15.options.positions[_i13].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this15.options.positions[_i13].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this15.options.positions[_i13].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this15.options.positions[_i13].lat.toFixed(8);\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.label.position = [_this15.options.positions[0].lng, _this15.options.positions[0].lat, fromDegreesArray[2]];\n });\n altBox.addEventListener('dblclick', function () {\n if (_this15.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this15.options.positions[_i13].alt.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this15.options.positions[_i13].alt.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this15.options.positions[_i13].alt = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = _this15.options.positions[_i13].alt.toFixed(2);\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.label.position = [_this15.options.positions[0].lng, _this15.options.positions[0].lat, fromDegreesArray[2]];\n });\n _this15._elms.lng.push(lng);\n _this15._elms.lngInput.push(lngInput);\n _this15._elms.lat.push(lat);\n _this15._elms.latInput.push(latInput);\n _this15._elms.alt.push(alt);\n _this15._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var _i13 = 0; _i13 < _this15.options.positions.length; _i13++) {\n _loop6(_i13);\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this15.labelFontFamily].value;\n for (var _i14 = 0; _i14 < fontData.length; _i14++) {\n if (fontData[_i14].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i14].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i15 = 0; _i15 < fontData.length; _i15++) {\n if (fontData[_i15].value === fontDataLegpElm.value) {\n _this15.labelFontFamily = fontData[_i15].key;\n break;\n }\n }\n });\n _this15._elms.labelFontFamily = [fontDataLegpElm];\n }\n }, 0);\n _context4.next = 34;\n break;\n case 33:\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n case 34:\n case \"end\":\n return _context4.stop();\n }\n }, _callee2, this);\n }));\n function edit(_x2) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }() // 平滑处理\n )\n }, {\n key: \"smoothHandle\",\n value: function smoothHandle(positions) {\n var newPositions = [];\n var time = [];\n var fromDegreesArrayHeights = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArrayHeights.push(positions[i].lng, positions[i].lat, positions[i].alt);\n time.push(i / (positions.length - 1));\n }\n var spline = new Cesium.CatmullRomSpline({\n times: time,\n points: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArrayHeights)\n });\n var length = positions.length * 20;\n for (var _i16 = 0; _i16 <= length; _i16++) {\n var cartesian3 = spline.evaluate(_i16 / length);\n newPositions.push(this.cartesian3Towgs84(cartesian3, this.sdk.viewer));\n }\n return newPositions;\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(positionsArray, cd) {\n var _this17 = this;\n if (this._error) {\n return;\n }\n var positions = JSON.parse(JSON.stringify(positionsArray));\n var ground;\n switch (this.heightMode) {\n case 0:\n case '0':\n ground = false;\n break;\n case 1:\n case '1':\n for (var i = 0; i < positions.length; i++) {\n var height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions[i].lng, positions[i].lat));\n positions[i].alt = height ? Number((positions[i].alt + Number(height)).toFixed(2)) : Number(positions[i].alt.toFixed(2));\n }\n ground = false;\n break;\n case 2:\n case '2':\n ground = true;\n break;\n }\n var newPositions;\n var fromDegreesArray = [];\n if (this.options.noseToTail && this.options.noseToTail !== 'false') {\n newPositions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions), [positions[0]]);\n } else {\n newPositions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions);\n }\n newPositions = this.smoothHandle(newPositions);\n for (var _i17 = 0; _i17 < newPositions.length; _i17++) {\n fromDegreesArray.push(newPositions[_i17].lng, newPositions[_i17].lat, newPositions[_i17].alt);\n }\n\n // 计算长度\n // let array = []\n // for (let i = 0; i < fromDegreesArray.length; i += 3) {\n // array.push({\n // lng: fromDegreesArray[i],\n // lat: fromDegreesArray[i + 1],\n // alt: fromDegreesArray[i + 2]\n // })\n // }\n // this.options.fitLengthByMeter = this.computeDistance2(\n // array,\n // 2,\n // ground\n // )\n // this.fitLengthUnit = this.options['fit-length-unit']\n // this.options.lengthByMeter = this.computeDistance2(this.smoothHandle(positions), 2, ground)\n // this.lengthUnit = this.options['length-unit']\n\n if (this.options.noseToTail && this.options.noseToTail !== 'false' || this.options.smooth && this.options.smooth !== 'false') {\n var array = [];\n for (var _i18 = 0; _i18 < fromDegreesArray.length; _i18 += 3) {\n array.push({\n lng: fromDegreesArray[_i18],\n lat: fromDegreesArray[_i18 + 1],\n alt: fromDegreesArray[_i18 + 2]\n });\n }\n // this.options.fitLengthByMeter = this.computeDistance(\n // array,\n // 2,\n // ground\n // )\n var _this16 = this;\n this.computeDistance(array, 2, this.options.wordsName).then(function (res) {\n _this16.lengthByMeter = res;\n _this17.lengthChangeCallBack && _this17.lengthChangeCallBack();\n cd && cd();\n });\n } else {\n var _this18 = this;\n this.computeDistance(_this18.smoothHandle(positions), 2, this.options.wordsName).then(function (res) {\n _this18.lengthByMeter = res;\n _this17.lengthChangeCallBack && _this17.lengthChangeCallBack();\n cd && cd();\n });\n }\n return fromDegreesArray;\n }\n\n // 更新多边形(线扩展)\n }, {\n key: \"renewPolygon\",\n value: function renewPolygon(fromDegreesArray) {\n var linePositions = [];\n if (this.options.extend && this.options.extend !== 'false') {\n var outerHole = [];\n for (var i = 0; i < fromDegreesArray.length; i += 3) {\n linePositions.push([fromDegreesArray[i], fromDegreesArray[i + 1]]);\n }\n var linestring = turf.lineString(linePositions);\n var buffered = turf.buffer(linestring, this.options.extendWidth / 1000, {\n units: 'kilometers'\n });\n for (var _i19 = 0; _i19 < buffered.geometry.coordinates[0].length; _i19++) {\n outerHole.push(buffered.geometry.coordinates[0][_i19][0], buffered.geometry.coordinates[0][_i19][1]);\n }\n var holes = []; // 孔\n for (var _i20 = 1; _i20 < buffered.geometry.coordinates.length; _i20++) {\n var array = [];\n for (var m = 0; m < buffered.geometry.coordinates[_i20].length; m++) {\n array.push(buffered.geometry.coordinates[_i20][m][0], buffered.geometry.coordinates[_i20][m][1]);\n }\n holes.push({\n positions: Cesium.Cartesian3.fromDegreesArray(array)\n });\n }\n this.entity.polygon = new Cesium.PolygonGraphics({\n hierarchy: {\n positions: Cesium.Cartesian3.fromDegreesArray(outerHole),\n holes: holes\n },\n material: Cesium.Color.fromCssColorString(this.options.extendColor)\n });\n } else {\n this.entity.polygon = undefined;\n }\n }\n }, {\n key: \"reset\",\n value: function () {\n var _reset = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (this.entity) {\n _context5.next = 2;\n break;\n }\n return _context5.abrupt(\"return\");\n case 2:\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineWidth = this.originalOptions.width;\n this.lineType = this.originalOptions.type;\n this.noseToTail = this.originalOptions.noseToTail;\n this.extend = this.originalOptions.extend;\n this.extendWidth = this.originalOptions.extendWidth;\n this.extendColor = this.originalOptions.extendColor;\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelScaleByDistance = this.originalOptions.label.scaleByDistance;\n this.labelNear = this.originalOptions.label.near;\n this.labelFar = this.originalOptions.label.far;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n this.attributeLink = this.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n this.rotate = this.originalOptions.rotate;\n this.speed = this.originalOptions.speed;\n // this.dashSize = this.originalOptions.dashSize\n this.space = this.originalOptions.space;\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n\n this.heightMode = this.options.heightMode;\n\n // let height\n // if (this.ground) {\n // height = await that.getClampToHeight({\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat\n // })\n // } else {\n // height = this.options.positions[0].alt\n // }\n // this.options.label.position = {\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat,\n // alt: height\n // }\n // this.label.position = [\n // this.options.label.position.lng,\n // this.options.label.position.lat,\n // this.options.label.position.alt\n // ]\n case 28:\n case \"end\":\n return _context5.stop();\n }\n }, _callee3, this);\n }));\n function reset() {\n return _reset.apply(this, arguments);\n }\n return reset;\n }()\n }, {\n key: \"_addLink\",\n value: function _addLink() {\n if (this._DialogObject._element.content.getElementsByClassName('link_add')[0].value) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: this._DialogObject._element.content.getElementsByClassName('link_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('link_add')[0].value = '';\n this.attributeLink = this.options.attribute.link.content;\n } else {\n this.Dialog.clickAddLink && this.Dialog.clickAddLink();\n // let input = document.createElement('input');\n // input.type = \"file\";\n // input.accept = \".mp4, .pdf\"\n // input.click()\n // input.addEventListener('change', (event) => {\n // if (input.value) {\n // this.options.attribute.link.content.push({\n // name: '链接',\n // url: input.value\n // })\n // this.attributeLink = this.options.attribute.link.content\n // }\n // })\n }\n }\n }, {\n key: \"addAttributeLink\",\n value: function addAttributeLink(link) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: link\n });\n this.attributeLink = this.options.attribute.link.content;\n }\n\n // _addRr() {\n // if (\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // ) {\n // this.options.attribute.vr.content.push({\n // name: '全景图',\n // url: this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // })\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value = ''\n // this.attributeVr = this.options.attribute.vr.content\n // } else {\n // this.Dialog.clickAddVr && this.Dialog.clickAddVr()\n // }\n // }\n\n // addAttributeRr(vr) {\n // this.options.attribute.vr.content.push({\n // name: '全景图',\n // url: vr\n // })\n // this.attributeVr = this.options.attribute.vr.content\n // }\n\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n height,\n i,\n a,\n _i21,\n _a,\n _i22,\n _a2,\n BoundingSphere,\n _args6 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n options = _args6.length > 0 && _args6[0] !== undefined ? _args6[0] : {};\n if (!this._error) {\n _context6.next = 3;\n break;\n }\n return _context6.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeViewFollow\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"setActiveViewer\"])(0);\n if (!this.options.customView) {\n _context6.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context6.next = 18;\n break;\n }\n _context6.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context6.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context6.next = 43;\n break;\n case 25:\n positionArray = [];\n _context6.t0 = this.options.heightMode;\n _context6.next = _context6.t0 === '0' ? 29 : _context6.t0 === 0 ? 29 : _context6.t0 === '1' ? 31 : _context6.t0 === 1 ? 31 : _context6.t0 === '2' ? 36 : _context6.t0 === 2 ? 36 : 41;\n break;\n case 29:\n for (i = 0; i < this.options.positions.length; i++) {\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt);\n positionArray.push(a.x, a.y, a.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 31:\n _context6.next = 33;\n return this.getClampToHeight(this.options.positions[0]);\n case 33:\n height = _context6.sent;\n for (_i21 = 0; _i21 < this.options.positions.length; _i21++) {\n _a = Cesium.Cartesian3.fromDegrees(this.options.positions[_i21].lng, this.options.positions[_i21].lat, height + this.options.positions[_i21].alt);\n positionArray.push(_a.x, _a.y, _a.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 36:\n _context6.next = 38;\n return this.getClampToHeight(this.options.positions[0]);\n case 38:\n height = _context6.sent;\n for (_i22 = 0; _i22 < this.options.positions.length; _i22++) {\n _a2 = Cesium.Cartesian3.fromDegrees(this.options.positions[_i22].lng, this.options.positions[_i22].lat, height);\n positionArray.push(_a2.x, _a2.y, _a2.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 41:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 43:\n case \"end\":\n return _context6.stop();\n }\n }, _callee4, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 打开富文本框\r\n */\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this19 = this;\n // var ue = UE.getEditor('app');\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].primaryCallBack = function (content) {\n _this19.options.richTextContent = content;\n };\n }\n\n // static nodeEdit2(that, cb = () => { }) {\n // that.positionEditing = false\n // if (YJ.Measure.GetMeasureStatus()) {\n // cb('上一次测量未结束')\n // } else {\n // YJ.Measure.SetMeasureStatus(true)\n // that.tip = new MouseTip('请选择一个顶点,右键取消', that.sdk)\n // that.event = new MouseEvent(that.sdk)\n // that.nodePoints = []\n // let selectPoint\n // let originalPosition\n // let newpositions = []\n // let fromDegreesArray = []\n // for (let i = 0; i < that.options.positions.length; i++) {\n // fromDegreesArray.push(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray)\n\n // that.event.mouse_left((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // originalPosition = that.options.positions[selectPoint.index]\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[selectPoint.index].lng,\n // that.options.positions[selectPoint.index].lat,\n // that.options.positions[selectPoint.index].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.splice(selectPoint.index, 0, entity)\n // that.options.positions.splice(\n // selectPoint.index,\n // 0,\n // that.options.positions[selectPoint.index]\n // )\n // let fromDegreesArray = that.renewPositions(that.options.positions)\n // that.renewPolygon(fromDegreesArray)\n // that.options.lengthByMeter = that.computeDistance2(\n // that.options.positions,\n // 2,\n // that.ground\n // )\n // that.lengthUnit = that.options['length-unit']\n // } else {\n // var pick = that.sdk.viewer.scene.pick(movement.position)\n // if (\n // pick &&\n // pick.id &&\n // pick.id.name &&\n // pick.id.name === 'node-secondary-edit-point'\n // ) {\n // selectPoint = pick.id\n // that.nodePoints.splice(pick.id.index, 1)\n // that.sdk.viewer.entities.remove(pick.id)\n // that.tip.set_text('左键开始,右键结束,CTRL+右键撤销')\n // originalPosition = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // }\n // }\n // })\n\n // that.event.mouse_right((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = originalPosition\n // cb(null, that.options.positions)\n // }\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // for (let i = 0; i < that.nodePoints.length; i++) {\n // that.sdk.viewer.entities.remove(that.nodePoints[i])\n // }\n // that.nodePoints = []\n // that.event.destroy()\n // that.tip.destroy()\n // })\n\n // that.event.mouse_move((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // if (that.options.positions.length === 1) {\n // that.label.position = [\n // that.options.positions[0].lng,\n // that.options.positions[0].lat,\n // that.options.positions[0].alt\n // ]\n // that.options.label.position = {\n // lng: that.options.positions[0].lng,\n // lat: that.options.positions[0].lat,\n // alt: that.options.positions[0].alt\n // }\n // }\n // }\n // that.tip.setPosition(\n // cartesian,\n // movement.endPosition.x,\n // movement.endPosition.y\n // )\n // })\n\n // that.event.mouse_right_keyboard_ctrl((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions.pop()\n // that.sdk.viewer.entities.remove(\n // that.nodePoints[that.nodePoints.length - 1]\n // )\n // that.nodePoints.pop()\n // if (selectPoint.index === that.options.positions.length) {\n // if (that.nodePoints[selectPoint.index - 1]) {\n // selectPoint = that.nodePoints[selectPoint.index - 1]\n // } else {\n // selectPoint.index = 0\n // }\n // }\n // }\n // })\n\n // that.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n // return newpositions\n // }, false)\n\n // for (let i = 0; i < that.options.positions.length; i++) {\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // index: i,\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.push(entity)\n // }\n // }\n // }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit(cd) {\n var _this20 = this;\n this.positionEditing = false;\n if (YJ.Measure.GetMeasureStatus()) {} else {\n this.closeNodeEdit();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('请选择一个顶点,右键取消', this.sdk);\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.ControllerObject = new _Controller_index__WEBPACK_IMPORTED_MODULE_18__[\"default\"](this.sdk);\n this._nodeEditCallback = cd;\n var selectPoint;\n this.event.mouse_left(function (movement, cartesian) {\n var pick = _this20.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n _this20.ControllerObject.position = _this20.options.positions[selectPoint.index];\n _this20.ControllerObject.editTranslational();\n _this20.tip && _this20.tip.destroy();\n _this20.ControllerObject.controllerCallBack = function (params) {\n if (selectPoint.index === 0) {\n _this20.label.position = [params.position.lng, params.position.lat, params.position.alt];\n _this20.options.label.position = {\n lng: params.position.lng,\n lat: params.position.lat,\n alt: params.position.alt\n };\n }\n _this20.options.positions[selectPoint.index] = params.position;\n _this20._elms.lng && (_this20._elms.lng[selectPoint.index].innerHTML = params.position.lng.toFixed(8));\n _this20._elms.lngInput && (_this20._elms.lngInput[selectPoint.index].value = params.position.lng.toFixed(8));\n _this20._elms.lat && (_this20._elms.lat[selectPoint.index].innerHTML = params.position.lat.toFixed(8));\n _this20._elms.latInput && (_this20._elms.latInput[selectPoint.index].value = params.position.lat.toFixed(8));\n _this20._elms.alt && (_this20._elms.alt[selectPoint.index].innerHTML = params.position.alt.toFixed(2));\n _this20._elms.altInput && (_this20._elms.altInput[selectPoint.index].value = params.position.alt.toFixed(2));\n selectPoint.position = Cesium.Cartesian3.fromDegrees(params.position.lng, params.position.lat, params.position.alt);\n };\n }\n });\n this.event.mouse_right(function (movement, cartesian) {\n for (var i = 0; i < _this20.nodePoints.length; i++) {\n _this20.sdk.viewer.entities.remove(_this20.nodePoints[i]);\n }\n _this20.nodePoints = [];\n _this20.event.destroy();\n _this20.tip && _this20.tip.destroy();\n _this20.tip = null;\n _this20.ControllerObject.destroy();\n var fromDegreesArray = _this20.renewPositions(_this20.options.positions);\n _this20.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n YJ.Measure.SetMeasureStatus(false);\n _this20._nodeEditCallback = null;\n });\n this.event.mouse_move(function (movement, cartesian) {\n _this20.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n var fromDegreesArray = _this20.renewPositions(_this20.options.positions);\n _this20._nodeEditCallback(_this20.options.positions, _this20.lengthByMeter);\n return Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n }, false);\n for (var i = 0; i < this.options.positions.length; i++) {\n var entity = this.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: i,\n position: Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt),\n billboard: {\n image: this.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n this.nodePoints.push(entity);\n }\n }\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit() {\n this.ControllerObject && this.ControllerObject.destroy();\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.tip = null;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n this._nodeEditCallback = null;\n }\n\n /**\r\n * 删除\r\n */\n }, {\n key: \"remove\",\n value: (function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.label && this.label.remove();\n this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context7.next = 8;\n return this.sdk.removeIncetance(this.options.id);\n case 8:\n _context7.next = 10;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(this.sdk, this.options.id);\n case 10:\n case \"end\":\n return _context7.stop();\n }\n }, _callee5, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n )\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this21 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.operate.positionEditing = status;\n if (status === true) {\n this.closeNodeEdit();\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var positions = JSON.parse(JSON.stringify(this.options.positions));\n var positions2 = this.renewPositions(this.options.positions);\n // let positions2 = JSON.parse(JSON.stringify(positions))\n // for (let i = 0; i < positions2.length; i++) {\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions2[i].lng, positions2[i].lat))\n // positions2[i] = Cesium.Cartesian3.fromDegrees(\n // positions2[i].lng,\n // positions2[i].lat,\n // Number((positions2[i].alt + Number(height)).toFixed(2))\n // )\n // }\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(this.options.positions)\n };\n for (var i = 0; i < positions.length; i++) {\n positions[i] = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n }\n var center = positions[Math.floor(positions.length / 2)];\n var disparity = [];\n for (var _i23 = 0; _i23 < positions.length; _i23++) {\n disparity.push({\n x: center.x - positions[_i23].x,\n y: center.y - positions[_i23].y,\n z: center.z - positions[_i23].z\n });\n }\n var newpositions = [];\n var newpositions84 = [];\n this.event.mouse_move(function (movement, cartesian) {\n newpositions = [];\n newpositions84 = [];\n for (var _i24 = 0; _i24 < disparity.length; _i24++) {\n var newP = {\n x: cartesian.x - disparity[_i24].x,\n y: cartesian.y - disparity[_i24].y,\n z: cartesian.z - disparity[_i24].z\n };\n var pos84 = _this21.cartesian3Towgs84(newP, _this21.sdk.viewer);\n pos84.alt = _this21.options.positions[_i24].alt;\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(pos84.lng, pos84.lat))\n // pos84.alt = Number((pos84.alt + Number(height)).toFixed(2))\n // newP = Cesium.Cartesian3.fromDegrees(\n // pos84.lng,\n // pos84.lat,\n // pos84.alt\n // )\n newpositions.push(newP);\n newpositions84.push(pos84);\n }\n var position84 = newpositions84[0];\n positions2 = _this21.renewPositions(newpositions84);\n _this21.label.position = [position84.lng, position84.lat, position84.alt];\n _this21.options.label.position = {\n lng: position84.lng,\n lat: position84.lat,\n alt: position84.alt\n };\n _this21.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this21.event.mouse_move(function () {});\n _this21.event.mouse_left(function () {});\n _this21.event.mouse_right(function () {});\n newpositions = [];\n newpositions84 = [];\n for (var _i25 = 0; _i25 < disparity.length; _i25++) {\n var newP = {\n x: cartesian.x - disparity[_i25].x,\n y: cartesian.y - disparity[_i25].y,\n z: cartesian.z - disparity[_i25].z\n };\n var pos84 = _this21.cartesian3Towgs84(newP, _this21.sdk.viewer);\n pos84.alt = _this21.options.positions[_i25].alt;\n newpositions.push(newP);\n newpositions84.push(pos84);\n }\n var positionsLngLat = [];\n for (var _i26 = 0; _i26 < newpositions84.length; _i26++) {\n var position = newpositions84[_i26];\n positionsLngLat.push(position);\n _this21._elms.lng && (_this21._elms.lng[_i26].innerHTML = position.lng.toFixed(8));\n _this21._elms.lngInput && (_this21._elms.lngInput[_i26].value = position.lng.toFixed(8));\n _this21._elms.lat && (_this21._elms.lat[_i26].innerHTML = position.lat.toFixed(8));\n _this21._elms.latInput && (_this21._elms.latInput[_i26].value = position.lat.toFixed(8));\n _this21._elms.alt && (_this21._elms.alt[_i26].innerHTML = position.alt.toFixed(2));\n _this21._elms.altInput && (_this21._elms.altInput[_i26].value = position.alt.toFixed(2));\n }\n _this21.options.positions = positionsLngLat;\n _this21.previous.positions = positionsLngLat;\n\n // this.entity.polyline.positionsLngLat = positionsLngLat\n var fromDegreesArray = _this21.renewPositions(_this21.options.positions, function () {\n if (_this21._positionEditingCallback) {\n _this21._positionEditingCallback();\n _this21._positionEditingCallback = null;\n }\n });\n _this21.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this21.renewPolygon(fromDegreesArray);\n _this21.positionEditing = false;\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this21.event.mouse_move(function () {});\n _this21.event.mouse_left(function () {});\n _this21.event.mouse_right(function () {});\n _this21.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this21.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n // 长按取消\n _this21.event.mouse_move(function () {});\n _this21.event.mouse_left(function () {});\n _this21.event.mouse_right(function () {});\n _this21.positionEditing = false;\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return Cesium.Cartesian3.fromDegreesArrayHeights(positions2);\n }, false);\n } else {\n if (!this.sdk || !this.sdk.viewer || !this.label || !this.label.entity) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.heightMode) {\n case 0:\n case '0':\n case 1:\n case '1':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat, fromDegreesArray[2]];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n case 2:\n case '2':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n }\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n this._positionEditingCallback = cd;\n }\n }, {\n key: \"lengthChangeCallBack\",\n get: function get() {\n return this._lengthChangeCallBack;\n },\n set: function set(cd) {\n this._lengthChangeCallBack = cd;\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _Cesium$Cartesian,\n _this22 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: '',\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var points = [];\n for (var i = 0; i < this.options.positions.length; i++) {\n points.push([this.options.positions[i].lng, this.options.positions[i].lat]);\n }\n var line = turf.lineString(points);\n var length = turf.length(line, {\n units: 'kilometers'\n });\n var sliced = turf.lineSliceAlong(line, 0, length / 2, {\n units: 'kilometers'\n });\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(sliced.geometry.coordinates[sliced.geometry.coordinates.length - 1]));\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this22.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }], [{\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee6(that) {\n var height, ground, objectsToExclude;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee6$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(that.sdk.viewer.entities.values);\n _context8.t0 = that.options.heightMode;\n _context8.next = _context8.t0 === '0' ? 4 : _context8.t0 === 0 ? 4 : _context8.t0 === '1' ? 7 : _context8.t0 === 1 ? 7 : _context8.t0 === '2' ? 14 : _context8.t0 === 2 ? 14 : 19;\n break;\n case 4:\n ground = false;\n height = that.options.positions[0].alt;\n return _context8.abrupt(\"break\", 19);\n case 7:\n ground = false;\n _context8.next = 10;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n }, objectsToExclude);\n case 10:\n _context8.t1 = _context8.sent;\n _context8.t2 = that.options.positions[0].alt;\n height = _context8.t1 + _context8.t2;\n return _context8.abrupt(\"break\", 19);\n case 14:\n ground = true;\n _context8.next = 17;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n }, objectsToExclude);\n case 17:\n height = _context8.sent;\n return _context8.abrupt(\"break\", 19);\n case 19:\n if (!that.options.label.position) {\n that.options.label.position = {\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat,\n alt: height\n };\n }\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_15__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far,\n ground: ground\n });\n case 21:\n case \"end\":\n return _context8.stop();\n }\n }, _callee6);\n }));\n function createLabel(_x3) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }, {\n key: \"create\",\n value: function create(that) {\n var ground;\n if (that.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n var positions = that.options.positions;\n var fromDegreesArray = that.renewPositions(positions);\n that.entity = that.sdk.viewer.entities.add({\n id: that.options.id,\n show: that.options.show,\n polyline: {\n positions: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray),\n width: that.options.width,\n clampToGround: ground,\n // material: that.getMaterial(that.options.color, that.options.type),\n zIndex: that.sdk._entityZIndex\n }\n });\n that.entity.polyline.oriWidth = that.options.width;\n that.judgeLine(that.entity, that.options);\n var params = _objectSpread({}, that.options);\n params.speed = that.inputSpeed;\n that.entity.polyline.material = that.getMaterial(that.options.color, that.options.type, that.entity, params);\n that.sdk._entityZIndex++;\n CurvelineObject.createLabel(that);\n // that.entity.polyline.positionsLngLat = positions\n that.renewPolygon(fromDegreesArray);\n // that.options.lengthByMeter = that.computeDistance2(that.smoothHandle(positions), 2, ground)\n // that.lengthUnit = that.options['length-unit']\n // syncData(that.sdk, that.options.id)\n // if (that.options.show) {\n // setSplitDirection(0, that.options.id)\n // }\n\n that.computeDistance(that.smoothHandle(positions), 2, that.options.wordsName).then(function (res) {\n that.lengthByMeter = res;\n that.lengthChangeCallBack && that.lengthChangeCallBack();\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(that.sdk, that.options.id);\n });\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__[\"setSplitDirection\"])(0, that.options.id);\n }\n\n // if (this.options.noseToTail) {\n // let array = []\n // for (let i = 0; i < fromDegreesArray.length; i += 2) {\n // array.push({ lng: fromDegreesArray[i], lat: fromDegreesArray[i + 1] })\n // }\n // this.options.fit_length = tool.computeDistance2(array)\n // }\n // else {\n // this.options.fit_length = tool.computeDistance2(positions)\n // }\n // if (this.options.fit_length_unit === 'km') {\n // this.options.fit_length = this.options.fit_length / 1000\n // }\n\n var scene = that.sdk.viewer.scene;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_11__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (CurvelineObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvQ3VydmVsaW5lT2JqZWN0L2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL09iai9CYXNlL0N1cnZlbGluZU9iamVjdC9pbmRleC5qcz80NDJjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAZGVzY3JpcHRpb24g57q/XHJcbiAqL1xyXG5pbXBvcnQgRGlhbG9nIGZyb20gJy4uLy4uL0VsZW1lbnQvRGlhbG9nJ1xyXG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnLi9fZWxlbWVudCdcclxuaW1wb3J0IEJhc2UgZnJvbSAnLi4vaW5kZXgnXHJcbmltcG9ydCBjeV90YWJzIGZyb20gJy4uLy4uL0VsZW1lbnQvY3lfaHRtbF90YWJzJ1xyXG5pbXBvcnQgcmljaFRleHQgZnJvbSAnLi4vLi4vRWxlbWVudC9yaWNoVGV4dCdcclxuaW1wb3J0IEV2ZW50QmluZGluZyBmcm9tICcuL2V2ZW50QmluZGluZydcclxuaW1wb3J0IExhYmVsT2JqZWN0IGZyb20gJy4uL0xhYmVsT2JqZWN0J1xyXG5pbXBvcnQgTW91c2VFdmVudCBmcm9tICcuLi8uLi8uLi9FdmVudC9pbmRleCdcclxuaW1wb3J0IE1vdXNlVGlwIGZyb20gJy4uLy4uLy4uL01vdXNlVGlwJ1xyXG5pbXBvcnQgQ29udHJvbGxlciBmcm9tICcuLi8uLi8uLi9Db250cm9sbGVyL2luZGV4J1xyXG5pbXBvcnQgeyBzeW5jRGF0YSwgZ2V0M0RWaWV3IH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL011bHRpVmlld3BvcnRNb2RlJ1xyXG5pbXBvcnQgeyBsZWdwIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9kYXRhbGlzdCdcclxuaW1wb3J0IHsgZ2V0Rm9udExpc3QsIGdldEZvbnRGYW1pbHlOYW1lIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9mb250U2VsZWN0J1xyXG5pbXBvcnQgeyBzZXRTcGxpdERpcmVjdGlvbiwgc3luY1NwbGl0RGF0YSwgc2V0QWN0aXZlSWQgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvU3BsaXRTY3JlZW4nXHJcbmltcG9ydCB7IHNldEFjdGl2ZVZpZXdlciwgY2xvc2VSb3RhdGVBcm91bmQsIGNsb3NlVmlld0ZvbGxvdyB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9nbG9iYWwnXHJcblxyXG5jbGFzcyBDdXJ2ZWxpbmVPYmplY3QgZXh0ZW5kcyBCYXNlIHtcclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gc2RrXHJcbiAgICogQGRlc2NyaXB0aW9uIOabsue6v1xyXG4gICAqIEBwYXJhbSBvcHRpb25zIHtvYmplY3R9IOe6v+WxnuaAp1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLm5hbWV7c3RyaW5nfSDlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy53aWR0aD0ze251bWJlcn0g57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY29sb3I9I2ZmMDAwMCB7c3RyaW5nfSDpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy50eXBlPTAge251bWJlcn0g5p2Q6LSo57G75Z6LIDAt5a6e57q/IDEt6Jma57q/IDIt5rOb5YWJLi4uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0TW9kZT0ye251bWJlcn0g6auY5bqm5qih5byP77yIMO+8mua1t+aLlOmrmOW6pu+8mzHvvJrnm7jlr7npq5jluqbvvJsy77ya5L6d6ZmE5qih5byP77yJXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubm9zZVRvVGFpbD1mYWxzZSB7Ym9vbGVhbn0g6aaW5bC+55u46L+eXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuZXh0ZW5kPWZhbHNlIHtib29sZWFufSDnur/nvJPlhrJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRlbmRXaWR0aD0xMCB7bnVtYmVyfSDnur/nvJPlhrLlrr3luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRlbmRDb2xvcj1yZ2JhKDI1NSwyNTUsODAsMC4zKSB7bnVtYmVyfSDnur/nvJPlhrLpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG93PXRydWUge2Jvb2xlYW59IOaYvumakFxyXG4gICAqIEBwYXJhbSB7QXJyYXkuPG9iamVjdD59IG9wdGlvbnMucG9zaXRpb25zIOW/heWhq++8jOe7j+e6rOW6puWSjOmrmOW6pueahOWIl+ihqO+8jOWAvOS6pOabvyBbe2xvbixsYXQsYWx0fSwuLi5dXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwge29iamVjdH0g5qCH562+5a+56LGhXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwudGV4dCB7c3RyaW5nfSDmoIfnrb7mlofmnKxcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5zaG93IHtzdHJpbmd9IOagh+etvuaYvumakFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtzdHJpbmd9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtvYmplY3R9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRTaXplPTIwIHtudW1iZXJ9IOWtl+S9k+Wkp+Wwj1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHk9MCB7bnVtYmVyfSDlrZfkvZPpobkgMO+8mum7keS9k++8mzHvvJrmgJ3mupDpu5HkvZPvvJsy77ya5bqe6Zeo5q2j6YGT5qCH6aKY5L2T77ybM++8muaVsOm7keS9k1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmNvbG9yPSNmZmZmZmYge3N0cmluZ30g5a2X5L2T6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZVdpZHRoPTQge251bWJlcn0g5byV57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZUNvbG9yPSMwMGZmZmY4MCB7c3RyaW5nfSDlvJXnur/popzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldD0yMCB7bnVtYmVyfSDlrZfkvZPlgY/np7so5byV57q/6ZW/5bqmKVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvcj1bJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSB7YXJyYXl9IOiDjOaZr+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB7Ym9vbGVhbn0g6Led56a757yp5pS+XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubmVhcj0yMDAwIHtudW1iZXJ9IOinhumHjue8qeaUvuacgOi/kei3neemu1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZhcj0xMDAwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+c6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlIHtvYmplY3R9IOWxnuaAp+WGheWuuVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rPXt9IHtzdHJpbmd9IOmTvuaOpVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQ9W11dIHthcnJheX0g6ZO+5o6l5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLm5hbWUge3N0cmluZ30g6ZO+5o6l5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLnVybCB7c3RyaW5nfSDpk77mjqXlnLDlnYBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5yaWNoVGV4dENvbnRlbnQge3N0cmluZ30g5a+M5paH5pys5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldyB7b2JqZWN0fSDpu5jorqTop4bop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uIHtvYmplY3R9IOm7mOiupOinhuinkuaWueS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB7bnVtYmVyfSDoiKrlkJHop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHtudW1iZXJ9IOS/r+S7sOinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB7bnVtYmVyfSDnv7vmu5rop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ge29iamVjdH0g6KeG6KeS55u45a+55L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogXHJcbiAgICogXHJcbiAgICogQHBhcmFtIF9EaWFsb2cge29iamVjdH0g5by55qGG5LqL5Lu2XHJcbiAgICogQHBhcmFtIF9EaWFsb2cuY29uZmlybUNhbGxCYWNrIHtmdW5jdGlvbn0g5by55qGG56Gu6K6k5pe255qE5Zue6LCDXHJcbiAgICogKi9cclxuICBjb25zdHJ1Y3RvcihzZGssIG9wdGlvbnMgPSB7fSwgX0RpYWxvZyA9IHt9KSB7XHJcbiAgICBzdXBlcihzZGssIG9wdGlvbnMpXHJcbiAgICB0aGlzLm9wdGlvbnMubmFtZSA9IG9wdGlvbnMubmFtZSB8fCAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgdGhpcy5vcHRpb25zLndpZHRoID0gKChvcHRpb25zLndpZHRoIHx8IG9wdGlvbnMud2lkdGggPT09IDApID8gb3B0aW9ucy53aWR0aCA6IDMpXHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSBvcHRpb25zLmNvbG9yIHx8ICcjZmYwMDAwJ1xyXG4gICAgdGhpcy5vcHRpb25zLnR5cGUgPSBvcHRpb25zLnR5cGUgPyBOdW1iZXIob3B0aW9ucy50eXBlKSA6IDBcclxuICAgIHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsID0gb3B0aW9ucy5ub3NlVG9UYWlsIHx8IGZhbHNlXHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kID0gb3B0aW9ucy5leHRlbmQgfHwgZmFsc2VcclxuICAgIHRoaXMub3B0aW9ucy5yb3RhdGUgPSAob3B0aW9ucy5yb3RhdGUgfHwgb3B0aW9ucy5yb3RhdGUgPT09IGZhbHNlKSA/IG9wdGlvbnMucm90YXRlIDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLnNwYWNlID0gb3B0aW9ucy5zcGFjZSB8fCAxXHJcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSBvcHRpb25zLnNwZWVkIHx8IDEwXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuZGFzaFNpemUgPSBvcHRpb25zLmRhc2hTaXplIHx8IDAuMDNcclxuICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWUgPSBvcHRpb25zLndvcmRzTmFtZSB8fCAwXHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kV2lkdGggPVxyXG4gICAgICBvcHRpb25zLmV4dGVuZFdpZHRoIHx8IG9wdGlvbnMuZXh0ZW5kV2lkdGggPT09IDBcclxuICAgICAgICA/IG9wdGlvbnMuZXh0ZW5kV2lkdGhcclxuICAgICAgICA6IDEwXHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kQ29sb3IgPSBvcHRpb25zLmV4dGVuZENvbG9yIHx8ICdyZ2JhKDI1NSwyNTUsODAsMC4zKSdcclxuICAgIHRoaXMub3B0aW9ucy5zaG93ID1cclxuICAgICAgb3B0aW9ucy5zaG93IHx8IG9wdGlvbnMuc2hvdyA9PT0gZmFsc2UgPyBvcHRpb25zLnNob3cgOiB0cnVlXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9IChvcHRpb25zLmhlaWdodE1vZGUgfHwgb3B0aW9ucy5oZWlnaHRNb2RlID09IDApID8gb3B0aW9ucy5oZWlnaHRNb2RlIDogMlxyXG4gICAgdGhpcy5fZWxtcyA9IFtdXHJcbiAgICBvcHRpb25zLmxhYmVsID0gb3B0aW9ucy5sYWJlbCB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsID0ge1xyXG4gICAgICB0ZXh0OiB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgc2hvdzogb3B0aW9ucy5sYWJlbC5zaG93IHx8IGZhbHNlLFxyXG4gICAgICBwb3NpdGlvbjogb3B0aW9ucy5sYWJlbC5wb3NpdGlvbixcclxuICAgICAgZm9udFNpemU6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5mb250U2l6ZSB8fCBvcHRpb25zLmxhYmVsLmZvbnRTaXplID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICAgICAgICAgIDogMjAsXHJcbiAgICAgIGZvbnRGYW1pbHk6IG9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA/IG9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA6IDAsXHJcbiAgICAgIGNvbG9yOiBvcHRpb25zLmxhYmVsLmNvbG9yIHx8ICcjZmZmZmZmJyxcclxuICAgICAgbGluZVdpZHRoOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwubGluZVdpZHRoIHx8IG9wdGlvbnMubGFiZWwubGluZVdpZHRoID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwubGluZVdpZHRoXHJcbiAgICAgICAgICA6IDQsXHJcbiAgICAgIHBpeGVsT2Zmc2V0OlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgfHwgb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgICAgICAgICA6IDIwLFxyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yIHx8IFsnIzAwZmZmZjgwJywgJyMwMGZmZmY4MCddLFxyXG4gICAgICBsaW5lQ29sb3I6IG9wdGlvbnMubGFiZWwubGluZUNvbG9yIHx8ICcjMDBmZmZmODAnLFxyXG4gICAgICBzY2FsZUJ5RGlzdGFuY2U6IG9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlIHx8IGZhbHNlLFxyXG4gICAgICBuZWFyOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwubmVhciB8fCBvcHRpb25zLmxhYmVsLm5lYXIgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5uZWFyXHJcbiAgICAgICAgICA6IDIwMDAsXHJcbiAgICAgIGZhcjpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLmZhciB8fCBvcHRpb25zLmxhYmVsLmZhciA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLmZhclxyXG4gICAgICAgICAgOiAxMDAwMDBcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUgPSBvcHRpb25zLmF0dHJpYnV0ZSB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCA9XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50IHx8IFtdXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhIHx8IHt9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50ID1cclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIgfHwge31cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCA9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgfHwge31cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCA9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCB8fCBbXVxyXG5cclxuXHJcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYVxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52clxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kc1xyXG5cclxuXHJcbiAgICB0aGlzLm9wZXJhdGUgPSB7fVxyXG4gICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgIHRoaXMudW5pdE51bSA9IDBcclxuICAgIHRoaXMuaW5wdXRTcGVlZCA9IChvcHRpb25zLnNwZWVkICYmIE1hdGgucG93KG9wdGlvbnMuc3BlZWQsIC0xKSAqIDEwMCkgfHwgMTBcclxuICAgIHRoaXMuRGlhbG9nID0gX0RpYWxvZ1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMucG9zaXRpb25zIHx8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICB0aGlzLl9lcnJvciA9ICfnur/mrrXmnIDlsJHpnIDopoHkuKTkuKrlnZDmoIfvvIEnXHJcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLl9lcnJvcilcclxuICAgICAgd2luZG93LkVMRU1FTlQgJiZcclxuICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuX2Vycm9yLFxyXG4gICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nID0gTnVtYmVyKE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KSlcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCA9IE51bWJlcihOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQgPSBOdW1iZXIoTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KS50b0ZpeGVkKDIpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNkay5hZGRJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkLCB0aGlzKVxyXG4gICAgICBDdXJ2ZWxpbmVPYmplY3QuY3JlYXRlKHRoaXMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBjb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSB2IHx8ICcjZmYwMDAwJ1xyXG4gICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHYsIHRoaXMub3B0aW9ucy50eXBlKVxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCB0aGlzLm9wdGlvbnMpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHBhcmFtcylcclxuICAgIGlmICh0aGlzLl9lbG1zLmNvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMuY29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMub3B0aW9ucy5jb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gY1xyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSAncmdiYSgyNTUsMCwwLDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5jb2xvcltpXSA9IGNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzcGVlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc3BlZWRcclxuICB9XHJcblxyXG4gIHNldCBzcGVlZCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSB2XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuc3BlZWQgPSB2ICE9PSAwID8gTWF0aC5wb3codiwgLTEpICogMTAwIDogMFxyXG4gICAgdGhpcy5pbnB1dFNwZWVkID0gdiAhPT0gMCA/IE1hdGgucG93KHYsIC0xKSAqIDEwMCA6IDBcclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCBwYXJhbXMpXHJcbiAgfVxyXG4gIC8vIGdldCBkYXNoU2l6ZSgpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuZGFzaFNpemVcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBkYXNoU2l6ZSh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuZGFzaFNpemUgPSB2XHJcbiAgLy8gICBsZXQgcGFyYW1zID0geyAuLi50aGlzLm9wdGlvbnMgfVxyXG4gIC8vICAgcGFyYW1zLnNwZWVkID0gdGhpcy5pbnB1dFNwZWVkXHJcbiAgLy8gICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAvLyAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gIC8vIH1cclxuXHJcbiAgZ2V0IHJvdGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucm90YXRlXHJcbiAgfVxyXG5cclxuICBzZXQgcm90YXRlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5yb3RhdGUgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgdGhpcy5fZWxtcy5yb3RhdGUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5yb3RhdGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcblxyXG4gICAgdGhpcy5vcHRpb25zLnJvdGF0ZSA9IHZcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNwYWNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zcGFjZVxyXG4gIH1cclxuXHJcbiAgc2V0IHNwYWNlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5zcGFjZSA9IHZcclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCBwYXJhbXMpXHJcbiAgfVxyXG5cclxuICBnZXQgd29yZHNOYW1lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICB9XHJcbiAgc2V0IHdvcmRzTmFtZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lID0gdlxyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIGlmICghdGhpcy5ub3NlVG9UYWlsKSB7XHJcbiAgICAgIHRoaXMuY29tcHV0ZURpc3RhbmNlKFxyXG4gICAgICAgIHRoaXMuc21vb3RoSGFuZGxlKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpLFxyXG4gICAgICAgIDIsXHJcbiAgICAgICAgdlxyXG4gICAgICApLnRoZW4ocmVzID0+IHtcclxuICAgICAgICBfdGhpcy5sZW5ndGhCeU1ldGVyID0gcmVzXHJcbiAgICAgICAgdGhpcy5sZW5ndGhDaGFuZ2VDYWxsQmFjayAmJiB0aGlzLmxlbmd0aENoYW5nZUNhbGxCYWNrKClcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IGZpdExlbmd0aFVuaXQoKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zWydmaXQtbGVuZ3RoLXVuaXQnXVxyXG4gIC8vIH1cclxuICAvLyBzZXQgZml0TGVuZ3RoVW5pdCh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnNbJ2ZpdC1sZW5ndGgtdW5pdCddID0gdlxyXG4gIC8vICAgdGhpcy5fZWxtcy5maXRMZW5ndGhVbml0ICYmXHJcbiAgLy8gICAgIHRoaXMuX2VsbXMuZml0TGVuZ3RoVW5pdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gIC8vICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICBpZiAodGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIpIHtcclxuICAvLyAgICAgc3dpdGNoICh2KSB7XHJcbiAgLy8gICAgICAgY2FzZSAn57GzJzpcclxuICAvLyAgICAgICAgIHRoaXMuZml0TGVuZ3RoID0gdGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXJcclxuICAvLyAgICAgICAgIGJyZWFrXHJcbiAgLy8gICAgICAgY2FzZSAn5Y2D57GzJzpcclxuICAvLyAgICAgICAgIHRoaXMuZml0TGVuZ3RoID0gTnVtYmVyKFxyXG4gIC8vICAgICAgICAgICAodGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIgLyAxMDAwKS50b0ZpeGVkKDUpXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBicmVha1xyXG4gIC8vICAgICAgIGRlZmF1bHQ6XHJcbiAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aCA9IHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIGdldCBsaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLndpZHRoXHJcbiAgfVxyXG5cclxuICBzZXQgbGluZVdpZHRoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy53aWR0aCA9ICh2IHx8IHYgPT0gMCkgPyB2IDogM1xyXG4gICAgdGhpcy5fZWxtcy5saW5lV2lkdGggJiZcclxuICAgICAgdGhpcy5fZWxtcy5saW5lV2lkdGguZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdGhpcy5vcHRpb25zLndpZHRoXHJcbiAgICAgIH0pXHJcbiAgICBpZiAodGhpcy5lbnRpdHkgJiYgdGhpcy5lbnRpdHkucG9seWxpbmUpIHtcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUud2lkdGggPSB0aGlzLmVudGl0eS5wb2x5bGluZS53aWR0aCArIHYgLSB0aGlzLmVudGl0eS5wb2x5bGluZS5vcmlXaWR0aFxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5vcmlXaWR0aCA9IHRoaXMub3B0aW9ucy53aWR0aFxyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5lbnRpdHkgJiZcclxuICAgIC8vICAgdGhpcy5lbnRpdHkucG9seWxpbmUgJiZcclxuICAgIC8vICAgKHRoaXMuZW50aXR5LnBvbHlsaW5lLndpZHRoID0gdGhpcy5vcHRpb25zLndpZHRoKSAmJiAodGhpcy5lbnRpdHkucG9seWxpbmUub3JpV2lkdGggPSB0aGlzLm9wdGlvbnMud2lkdGgpXHJcbiAgfVxyXG5cclxuICBnZXQgbGluZVR5cGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnR5cGVcclxuICB9XHJcblxyXG4gIHNldCBsaW5lVHlwZSh2KSB7XHJcbiAgICBsZXQgbGluZVR5cGVEYXRhID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBsaW5lXCI+PC9pPuWunue6vycsXHJcbiAgICAgICAgdmFsdWU6ICflrp7nur8nLFxyXG4gICAgICAgIGtleTogMCxcclxuICAgICAgICBpY29uOiAnbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZGFzaC1saW5lXCI+PC9pPuiZmue6vycsXHJcbiAgICAgICAgdmFsdWU6ICfomZrnur8nLFxyXG4gICAgICAgIGtleTogMSxcclxuICAgICAgICBpY29uOiAnZGFzaC1saW5lJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBsaWdodC1saW5lXCI+PC9pPuazm+WFiScsXHJcbiAgICAgICAgdmFsdWU6ICfms5vlhYknLFxyXG4gICAgICAgIGtleTogMixcclxuICAgICAgICBpY29uOiAnbGlnaHQtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gdGFpbC1saW5lXCI+PC9pPuWwvui/ueWFiee6vycsXHJcbiAgICAgICAgdmFsdWU6ICflsL7ov7nlhYnnur8nLFxyXG4gICAgICAgIGtleTogMyxcclxuICAgICAgICBpY29uOiAndGFpbC1saW5lJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBtdWx0LXRhaWwtbGluZVwiPjwvaT7lpJrlsL7ov7nlhYnnur8nLFxyXG4gICAgICAgIHZhbHVlOiAn5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICBrZXk6IDQsXHJcbiAgICAgICAgaWNvbjogJ211bHQtdGFpbC1saW5lJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBmbG93LWRhc2gtbGluZTFcIj48L2k+5rWB5Yqo6Jma57q/MScsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjomZrnur8xJyxcclxuICAgICAgICBrZXk6IDUsXHJcbiAgICAgICAgaWNvbjogJ2Zsb3ctZGFzaC1saW5lMSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZmxvdy1kYXNoLWxpbmUyXCI+PC9pPua1geWKqOiZmue6vzInLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAga2V5OiA2LFxyXG4gICAgICAgIGljb246ICdmbG93LWRhc2gtbGluZTInXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lMVwiPjwvaT7mtYHliqjnrq3lpLQxJyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDEnLFxyXG4gICAgICAgIGtleTogNyxcclxuICAgICAgICBpY29uOiAncGljLWxpbmUxJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTJcIj48L2k+5rWB5Yqo566t5aS0MicsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQyJyxcclxuICAgICAgICBrZXk6IDgsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lMidcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUzXCI+PC9pPua1geWKqOeureWktDMnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAga2V5OiA5LFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTMnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNFwiPjwvaT7mtYHliqjnrq3lpLQ0JyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDQnLFxyXG4gICAgICAgIGtleTogMTAsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lNCdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU1XCI+PC9pPua1geWKqOeureWktDUnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAga2V5OiAxMSxcclxuICAgICAgICBpY29uOiAncGljLWxpbmU1J1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTZcIj48L2k+5rWB5Yqo566t5aS0NicsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICBrZXk6IDEyLFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTYnXHJcbiAgICAgIH1cclxuICAgIF1cclxuICAgIHRoaXMub3B0aW9ucy50eXBlID0gTnVtYmVyKHYpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVUeXBlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAobGluZVR5cGVEYXRhW2ldLmtleSA9PT0gTnVtYmVyKHYpKSB7XHJcbiAgICAgICAgdGhpcy5fZWxtcy5saW5lVHlwZSAmJlxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5saW5lVHlwZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpdGVtLnZhbHVlID0gbGluZVR5cGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgIGlmICgyIDwgaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlIDwgMTMpIHsvL+i0tOWbvuWPguaVsFxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgyIDwgaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlIDwgNSkgey8v5bC+6L+55Y+C5pWwXHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMV0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMV0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gICAgdGhpcy5lbnRpdHkgJiZcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUgJiZcclxuICAgICAgKHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbChcclxuICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3IsXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnR5cGUsXHJcbiAgICAgICAgdGhpcy5lbnRpdHksXHJcbiAgICAgICAgcGFyYW1zXHJcbiAgICAgICkpXHJcbiAgfVxyXG4gIGdldCBub3NlVG9UYWlsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsXHJcbiAgfVxyXG5cclxuICBzZXQgbm9zZVRvVGFpbCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbCA9IHZcclxuICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICB0aGlzLl9lbG1zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgdGhpcy5fZWxtcy5ub3NlVG9UYWlsLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG4gICAgaWYgKHRoaXMuZW50aXR5KSB7XHJcbiAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgICAgIClcclxuICAgICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgIH1cclxuICAgIC8vIGlmICh2KSB7XHJcbiAgICAvLyAgIGlmICh0aGlzLm9wdGlvbnMuZml0TGVuZ3RoQnlNZXRlciA+IDEwMDAgfHwgdGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIgPT0gMTAwMCkge1xyXG4gICAgLy8gICAgIGxldCBkb20gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzFdXHJcbiAgICAvLyAgICAgZG9tICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzFdICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzFdLmNsaWNrKClcclxuICAgIC8vICAgfSBlbHNlIHtcclxuICAgIC8vICAgICBsZXQgZG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgLy8gICAgIGRvbSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVswXSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVswXS5jbGljaygpXHJcbiAgICAvLyAgIH1cclxuXHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgLy8gICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aEJ5TWV0ZXIgPiAxMDAwIHx8IHRoaXMub3B0aW9ucy5sZW5ndGhCeU1ldGVyID09IDEwMDApIHtcclxuICAgIC8vICAgICBsZXQgZG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgLy8gICAgIGRvbSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXS5jbGljaygpXHJcbiAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMV1cclxuICAgIC8vICAgICBkb20gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0uY2xpY2soKVxyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0IGhlaWdodE1vZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPyB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA6IDBcclxuICB9XHJcbiAgc2V0IGhlaWdodE1vZGUodikge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAodiB8fCB2ID09IDApID8gdiA6IDJcclxuICAgIGxldCBoZWlnaHRNb2RlTmFtZSA9ICcnXHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcbiAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgKVxyXG4gICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgICAgdGhpcy5leHRlbmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodE1vZGVOYW1lID0gJ+a1t+aLlOmrmOW6pidcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSBncm91bmRcclxuICAgICAgICB0aGlzLmV4dGVuZCA9IGZhbHNlXHJcbiAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn55u45a+55Zyw6KGoJ1xyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzInOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSBncm91bmRcclxuICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfkvp3pmYTmqKHlnosnXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9IHRoaXMuY29tcHV0ZURpc3RhbmNlMihcclxuICAgIC8vICAgdGhpcy5zbW9vdGhIYW5kbGUodGhpcy5vcHRpb25zLnBvc2l0aW9ucyksXHJcbiAgICAvLyAgIDIsXHJcbiAgICAvLyAgIGdyb3VuZFxyXG4gICAgLy8gKVxyXG4gICAgdGhpcy5sZW5ndGhVbml0ID0gdGhpcy5sZW5ndGhVbml0XHJcbiAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgJiYgKHRoaXMuX2VsbXMuaGVpZ2h0TW9kZS52YWx1ZSA9IGhlaWdodE1vZGVOYW1lKVxyXG4gICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlT2JqZWN0ICYmICh0aGlzLl9lbG1zLmhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoXHJcbiAgICAgIGhlaWdodE1vZGVOYW1lXHJcbiAgICApKVxyXG4gICAgaWYgKGRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ICYmICh0aGlzLl9lbG1zLmhlaWdodEJveC5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCBkaXNhYmxlZCcpO1xyXG4gICAgICB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0gJiYgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLl9lbG1zLmhlaWdodEJveCAmJiAodGhpcy5fZWxtcy5oZWlnaHRCb3guY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3gnKTtcclxuICAgICAgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtICYmIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChncm91bmQpIHtcclxuICAgICAgICB0aGlzLmxhYmVsLmdyb3VuZCA9IGdyb3VuZFxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlLnZhbHVlID0gJ+S+nemZhOaooeWeiycpXHJcbiAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5ncm91bmQgPSBncm91bmRcclxuICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICBdXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGV4dGVuZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZXh0ZW5kXHJcbiAgfVxyXG5cclxuICBzZXQgZXh0ZW5kKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmQgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgaWYgKHYpIHtcclxuICAgICAgdGhpcy5oZWlnaHRNb2RlID0gMlxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5leHRlbmQgJiZcclxuICAgICAgdGhpcy5fZWxtcy5leHRlbmQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgICBpZiAodGhpcy5lbnRpdHkpIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbmQpIHtcclxuICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24gPSB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGV4dGVuZFdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5leHRlbmRXaWR0aFxyXG4gIH1cclxuXHJcbiAgc2V0IGV4dGVuZFdpZHRoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmRXaWR0aCA9IHZcclxuICAgIHRoaXMuX2VsbXMuZXh0ZW5kV2lkdGggJiZcclxuICAgICAgdGhpcy5fZWxtcy5leHRlbmRXaWR0aC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgfVxyXG5cclxuICBnZXQgZXh0ZW5kQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmV4dGVuZENvbG9yXHJcbiAgfVxyXG4gIHNldCBleHRlbmRDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kQ29sb3IgPSB2XHJcbiAgICBpZiAodGhpcy5fZWxtcy5leHRlbmRDb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmV4dGVuZENvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgZXh0ZW5kQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmV4dGVuZENvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuZENvbG9yID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuZENvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmV4dGVuZENvbG9yW2ldID0gZXh0ZW5kQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5ICYmXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24gJiZcclxuICAgICAgKHRoaXMuZW50aXR5LnBvbHlnb24ubWF0ZXJpYWwgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5leHRlbmRDb2xvclxyXG4gICAgICApKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2hvdygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2hvd1xyXG4gIH1cclxuICBzZXQgbGFiZWxTaG93KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93ID0gdlxyXG4gICAgaWYgKHRoaXMuc2hvdyAmJiAhdGhpcy5zaG93VmlldyB8fCB0aGlzLnNob3dWaWV3ID09IDMpIHtcclxuICAgICAgdGhpcy5sYWJlbC5zaG93ID0gdlxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAgICAgXVxyXG4gICAgICB9LCAwKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5sYWJlbC5zaG93ID0gZmFsc2VcclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMubGFiZWxTaG93ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxTaG93LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsRm9udEZhbWlseSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseVxyXG4gIH1cclxuXHJcbiAgc2V0IGxhYmVsRm9udEZhbWlseSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA9IHYgfHwgMFxyXG4gICAgdGhpcy5sYWJlbCAmJiAodGhpcy5sYWJlbC5mb250RmFtaWx5ID0gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkpXHJcblxyXG4gICAgbGV0IG5hbWUgPSBnZXRGb250RmFtaWx5TmFtZSh0aGlzLmxhYmVsRm9udEZhbWlseSkgfHwgJydcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGb250RmFtaWx5ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxGb250RmFtaWx5LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IG5hbWVcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbENvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5jb2xvclxyXG4gIH1cclxuICBzZXQgbGFiZWxDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3IgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmNvbG9yID0gdlxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxDb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbENvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yW2ldID0gbGFiZWxDb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsRm9udFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgfVxyXG4gIHNldCBsYWJlbEZvbnRTaXplKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZSA9IHZcclxuICAgIHRoaXMubGFiZWwuZm9udFNpemUgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRm9udFNpemUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRTaXplLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFNjYWxlQnlEaXN0YW5jZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlXHJcbiAgfVxyXG4gIHNldCBsYWJlbFNjYWxlQnlEaXN0YW5jZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlID0gdlxyXG4gICAgdGhpcy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsU2NhbGVCeURpc3RhbmNlICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxOZWFyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5uZWFyXHJcbiAgfVxyXG4gIHNldCBsYWJlbE5lYXIodikge1xyXG4gICAgbGV0IG5lYXIgPSB2XHJcbiAgICBpZiAobmVhciA+IHRoaXMubGFiZWxGYXIpIHtcclxuICAgICAgbmVhciA9IHRoaXMubGFiZWxGYXJcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5uZWFyID0gbmVhclxyXG4gICAgdGhpcy5sYWJlbC5uZWFyID0gbmVhclxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbE5lYXIgJiYgdGhpcy5fZWxtcy5sYWJlbE5lYXIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gbmVhclxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZhcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZmFyXHJcbiAgfVxyXG4gIHNldCBsYWJlbEZhcih2KSB7XHJcbiAgICBsZXQgZmFyID0gdlxyXG4gICAgaWYgKGZhciA8IHRoaXMubGFiZWxOZWFyKSB7XHJcbiAgICAgIGZhciA9IHRoaXMubGFiZWxOZWFyXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZmFyID0gZmFyXHJcbiAgICB0aGlzLmxhYmVsLmZhciA9IGZhclxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZhciAmJiB0aGlzLl9lbG1zLmxhYmVsRmFyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IGZhclxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbExpbmVXaWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubGluZVdpZHRoXHJcbiAgfVxyXG4gIHNldCBsYWJlbExpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubGluZVdpZHRoID0gdlxyXG4gICAgdGhpcy5sYWJlbC5saW5lV2lkdGggPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsTGluZVdpZHRoICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lV2lkdGguZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsUGl4ZWxPZmZzZXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgfVxyXG4gIHNldCBsYWJlbFBpeGVsT2Zmc2V0KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCA9IHZcclxuICAgIHRoaXMubGFiZWwucGl4ZWxPZmZzZXQgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsUGl4ZWxPZmZzZXQgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbFBpeGVsT2Zmc2V0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcbiAgZ2V0IGxhYmVsTGluZUNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lQ29sb3JcclxuICB9XHJcbiAgc2V0IGxhYmVsTGluZUNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lQ29sb3IgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmxpbmVDb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsTGluZUNvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gJ3JnYmEoMCwyNTUsMjU1LDAuNSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yW2ldID0gbGluZUNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdXHJcbiAgfVxyXG4gIHNldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF0gPSB2XHJcbiAgICB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvciA9IFt2LCB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXV1cclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCxcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFtcclxuICAgICAgICAgIGlcclxuICAgICAgICBdID0gbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXVxyXG4gIH1cclxuICBzZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXSA9IHZcclxuICAgIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yID0gW3RoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdLCB2XVxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCxcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZFtpXSA9IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlVHlwZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZVxyXG4gIH1cclxuXHJcbiAgc2V0IGF0dHJpYnV0ZVR5cGUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGUgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmF0dHJpYnV0ZVR5cGUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5hdHRyaWJ1dGVUeXBlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICAgIGxldCBhdHRyaWJ1dGVDb250ZW50ID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgJ2F0dHJpYnV0ZS1jb250ZW50J1xyXG4gICAgKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVDb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBhdHRyaWJ1dGVDb250ZW50W2ldLmNsYXNzTmFtZS5pbmRleE9mKCdhdHRyaWJ1dGUtY29udGVudC0nICsgdikgPiAtMVxyXG4gICAgICApIHtcclxuICAgICAgICBhdHRyaWJ1dGVDb250ZW50W2ldLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXR0cmlidXRlQ29udGVudFtpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBhdHRyaWJ1dGVMaW5rKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgfVxyXG5cclxuICBzZXQgYXR0cmlidXRlTGluayh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCA9IHZcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuX0RpYWxvZ09iamVjdCB8fFxyXG4gICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50IHx8XHJcbiAgICAgICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudCB8fFxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICdhdHRyaWJ1dGUtY29udGVudC1saW5rJ1xyXG4gICAgICApLmxlbmd0aCA9PSAwXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtbGluaycpWzFdXHJcbiAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICB0YWJsZUNvbnRlbnQuaW5uZXJIVE1MID0gJydcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnXHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCB0ciA9XHJcbiAgICAgICAgYFxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgK1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2ldLm5hbWUgK1xyXG4gICAgICAgIGA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgK1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2ldLnVybCArXHJcbiAgICAgICAgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJsaW5rRWRpdFwiPue8lui+kTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwibGlua0RlbGV0ZVwiPuWIoOmZpDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PmBcclxuICAgICAgbGV0IHRyRWxtID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodHIpXHJcbiAgICAgIHRhYmxlQ29udGVudC5hcHBlbmRDaGlsZCh0ckVsbSlcclxuICAgIH1cclxuICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAgIGxldCBmdW4gPSB7XHJcbiAgICAgIGxpbmtFZGl0OiBhc3luYyBpbmRleCA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gYXdhaXQgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnKVsxXVxyXG4gICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgICAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICAgICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09PSBpKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBpdGVtW2ldLm9mZnNldEhlaWdodFxyXG4gICAgICAgICAgICBsZXQgaHRtbCA9IGBcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0XCIgdHlwZT1cInRleHRcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImlucHV0IGxpbmstZWRpdFwiIHR5cGU9XCJ0ZXh0XCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjb25maXJtRWRpdFwiPuehruiupDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNhbmNlbEVkaXRcIj7lj5bmtog8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICAgICAgICAgIGl0ZW1baV0uaW5uZXJIVE1MID0gaHRtbFxyXG4gICAgICAgICAgICBsZXQgdGV4dGFyZWFFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmstZWRpdCcpWzBdXHJcbiAgICAgICAgICAgIHRleHRhcmVhRWxtLnN0eWxlLmhlaWdodCA9IGhlaWdodCAtIDEwICsgJ3B4J1xyXG4gICAgICAgICAgICBsZXQgdGQgPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAgICAgICAgICAgdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgICAnaW5wdXQnXHJcbiAgICAgICAgICAgIClbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpbmRleF0ubmFtZVxyXG4gICAgICAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAgICdpbnB1dCdcclxuICAgICAgICAgICAgKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2luZGV4XS51cmxcclxuICAgICAgICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaVxyXG4gICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGxpbmtEZWxldGU6IGkgPT4ge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50LnNwbGljZShpLCAxKVxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBjb25maXJtRWRpdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IG5hbWUgPSB2YWx1ZS5uYW1lICYmIHZhbHVlLm5hbWUucmVwbGFjZSgvXFxzL2csICcnKVxyXG4gICAgICAgIGxldCB1cmwgPSB2YWx1ZS51cmwgJiYgdmFsdWUudXJsLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAgICAgICBpZiAobmFtZSAmJiB1cmwpIHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2ldID0gdmFsdWVcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgd2luZG93LkVMRU1FTlQgJiZcclxuICAgICAgICAgICAgd2luZG93LkVMRU1FTlQuTWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ+WQjeensOaIlumTvuaOpeS4jeiDveS4uuepuu+8gScsXHJcbiAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGNhbmNlbEVkaXQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICB9LFxyXG4gICAgICBmaWxlU2VsZWN0OiAodmFsdWUsIGkpID0+IHtcclxuICAgICAgICBsZXQgZmlsZUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZS1zZWxlY3QnKVswXVxyXG4gICAgICAgIGZpbGVFbG0uY2xpY2soKVxyXG4gICAgICAgIGZpbGVFbG0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgICBmaWxlRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBmaWxlU2VsZWN0ID0gZXZlbnQgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0LnZhbHVlKSB7XHJcbiAgICAgICAgbGV0IHRkID0gaXRlbVtcclxuICAgICAgICAgIGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2luZGV4JylcclxuICAgICAgICBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKGkpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IGF0dHJpYnV0ZUNhbWVyYSgpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXQgYXR0cmlidXRlQ2FtZXJhKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQgPSB2XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXQgYXR0cmlidXRlVnIoKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXQgYXR0cmlidXRlVnIodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50ID0gdlxyXG4gIC8vICAgaWYgKFxyXG4gIC8vICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0IHx8XHJcbiAgLy8gICAgICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQgfHxcclxuICAvLyAgICAgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50IHx8XHJcbiAgLy8gICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgJ2F0dHJpYnV0ZS1jb250ZW50LXZyJ1xyXG4gIC8vICAgICApLmxlbmd0aCA9PSAwXHJcbiAgLy8gICApIHtcclxuICAvLyAgICAgcmV0dXJuXHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gIC8vICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtdnInKVsxXVxyXG4gIC8vICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gIC8vICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gIC8vICAgdGFibGVDb250ZW50LmlubmVySFRNTCA9ICcnXHJcbiAgLy8gICBpZiAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAvLyAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAvLyAgIH1cclxuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgIGxldCB0ciA9XHJcbiAgLy8gICAgICAgYFxyXG4gIC8vICAgICA8ZGl2IGNsYXNzPVwidHJcIj5cclxuICAvLyAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgK1xyXG4gIC8vICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXS5uYW1lICtcclxuICAvLyAgICAgICBgPC9kaXY+XHJcbiAgLy8gICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICtcclxuICAvLyAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0udXJsICtcclxuICAvLyAgICAgICBgPC9kaXY+XHJcbiAgLy8gICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAvLyAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cInZyRWRpdFwiPue8lui+kTwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwidnJEZWxldGVcIj7liKDpmaQ8L2J1dHRvbj5cclxuICAvLyAgICAgICAgIDwvZGl2PlxyXG4gIC8vICAgICA8L2Rpdj5gXHJcbiAgLy8gICAgIGxldCB0ckVsbSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHRyKVxyXG4gIC8vICAgICB0YWJsZUNvbnRlbnQuYXBwZW5kQ2hpbGQodHJFbG0pXHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgLy8gICBsZXQgZnVuID0ge1xyXG4gIC8vICAgICB2ckVkaXQ6IGFzeW5jIGluZGV4ID0+IHtcclxuICAvLyAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gYXdhaXQgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gICAgICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAvLyAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC12cicpWzFdXHJcbiAgLy8gICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gIC8vICAgICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAvLyAgICAgICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgLy8gICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICBpZiAoaW5kZXggPT09IGkpIHtcclxuICAvLyAgICAgICAgICAgbGV0IGhlaWdodCA9IGl0ZW1baV0ub2Zmc2V0SGVpZ2h0XHJcbiAgLy8gICAgICAgICAgIGxldCBodG1sID0gYFxyXG4gIC8vICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gIC8vICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiB0eXBlPVwidGV4dFwiPlxyXG4gIC8vICAgICAgICAgICAgIDwvZGl2PlxyXG4gIC8vICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gIC8vICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiaW5wdXQgbGluay1lZGl0XCIgdHlwZT1cInRleHRcIj48L3RleHRhcmVhPlxyXG4gIC8vICAgICAgICAgICAgIDwvZGl2PlxyXG4gIC8vICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gIC8vICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNvbmZpcm1FZGl0XCI+56Gu6K6kPC9idXR0b24+XHJcbiAgLy8gICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY2FuY2VsRWRpdFwiPuWPlua2iDwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgICAgIDwvZGl2PmBcclxuICAvLyAgICAgICAgICAgaXRlbVtpXS5pbm5lckhUTUwgPSBodG1sXHJcbiAgLy8gICAgICAgICAgIGxldCB0ZXh0YXJlYUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluay1lZGl0JylbMF1cclxuICAvLyAgICAgICAgICAgdGV4dGFyZWFFbG0uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0IC0gMTAgKyAncHgnXHJcbiAgLy8gICAgICAgICAgIGxldCB0ZCA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gIC8vICAgICAgICAgICB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICAgICAgICdpbnB1dCdcclxuICAvLyAgICAgICAgICAgKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpbmRleF0ubmFtZVxyXG4gIC8vICAgICAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICAgICAgICdpbnB1dCdcclxuICAvLyAgICAgICAgICAgKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpbmRleF0udXJsXHJcbiAgLy8gICAgICAgICAgIGxldCBidG4gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gIC8vICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ0bi5sZW5ndGg7IG4rKykge1xyXG4gIC8vICAgICAgICAgICAgIGlmICghYnRuW25dIHx8ICFidG5bbl0uYXR0cmlidXRlcykge1xyXG4gIC8vICAgICAgICAgICAgICAgY29udGludWVcclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gIC8vICAgICAgICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5bbS52YWx1ZV0gPT09ICdmdW5jdGlvbicpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXShcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUsXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIGlcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIClcclxuICAvLyAgICAgICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgLy8gICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgLy8gICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGJyZWFrXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICB2ckRlbGV0ZTogaSA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50LnNwbGljZShpLCAxKVxyXG4gIC8vICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgICAgfSxcclxuXHJcbiAgLy8gICAgIGNvbmZpcm1FZGl0OiAodmFsdWUsIGkpID0+IHtcclxuICAvLyAgICAgICBsZXQgbmFtZSA9IHZhbHVlLm5hbWUgJiYgdmFsdWUubmFtZS5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgLy8gICAgICAgbGV0IHVybCA9IHZhbHVlLnVybCAmJiB2YWx1ZS51cmwucmVwbGFjZSgvXFxzL2csICcnKVxyXG4gIC8vICAgICAgIGlmIChuYW1lICYmIHVybCkge1xyXG4gIC8vICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldID0gdmFsdWVcclxuICAvLyAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgd2luZG93LkVMRU1FTlQgJiZcclxuICAvLyAgICAgICAgICAgd2luZG93LkVMRU1FTlQuTWVzc2FnZSh7XHJcbiAgLy8gICAgICAgICAgICAgbWVzc2FnZTogJ+WQjeensOaIlumTvuaOpeS4jeiDveS4uuepuu+8gScsXHJcbiAgLy8gICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gIC8vICAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgLy8gICAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgICAgfSxcclxuICAvLyAgICAgY2FuY2VsRWRpdDogKCkgPT4ge1xyXG4gIC8vICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgICAgfSxcclxuICAvLyAgICAgZmlsZVNlbGVjdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgLy8gICAgICAgbGV0IGZpbGVFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ZpbGUtc2VsZWN0JylbMF1cclxuICAvLyAgICAgICBmaWxlRWxtLmNsaWNrKClcclxuICAvLyAgICAgICBmaWxlRWxtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgLy8gICAgICAgZmlsZUVsbS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgZmlsZVNlbGVjdCA9IGV2ZW50ID0+IHtcclxuICAvLyAgICAgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSkge1xyXG4gIC8vICAgICAgIGxldCB0ZCA9IGl0ZW1bXHJcbiAgLy8gICAgICAgICBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdpbmRleCcpXHJcbiAgLy8gICAgICAgXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgLy8gICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZVxyXG4gIC8vICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IG51bGxcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgIGxldCBidG4gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gIC8vICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ0bi5sZW5ndGg7IG4rKykge1xyXG4gIC8vICAgICAgIGlmICghYnRuW25dIHx8ICFidG5bbl0uYXR0cmlidXRlcykge1xyXG4gIC8vICAgICAgICAgY29udGludWVcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gIC8vICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAvLyAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5bbS52YWx1ZV0gPT09ICdmdW5jdGlvbicpIHtcclxuICAvLyAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXShpKVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgfSlcclxuICAvLyAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAvLyAgICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBhdHRyaWJ1dGVHb29kcygpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnRcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBhdHRyaWJ1dGVHb29kcyh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgPSB2XHJcbiAgLy8gfVxyXG5cclxuICBzdGF0aWMgYXN5bmMgY3JlYXRlTGFiZWwodGhhdCkge1xyXG4gICAgbGV0IGhlaWdodFxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgIHN3aXRjaCAodGhhdC5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodCA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodCA9IGF3YWl0IHRoYXQuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgbGF0OiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdFxyXG4gICAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpICsgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBoZWlnaHQgPSBhd2FpdCB0aGF0LmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgICBpZiAoIXRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbikge1xyXG4gICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICBsYXQ6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgIGFsdDogaGVpZ2h0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoYXQubGFiZWwgPSBuZXcgTGFiZWxPYmplY3QodGhhdC5zZGssIHtcclxuICAgICAgaWQ6IHRoYXQub3B0aW9ucy5pZCxcclxuICAgICAgc2hvdzogdGhhdC5vcHRpb25zLnNob3cgPyB0aGF0Lm9wdGlvbnMubGFiZWwuc2hvdyA6IGZhbHNlLFxyXG4gICAgICBwb3NpdGlvbjogW1xyXG4gICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0XHJcbiAgICAgIF0sXHJcbiAgICAgIHRleHQ6IHRoYXQub3B0aW9ucy5uYW1lLFxyXG4gICAgICBmb250U2l6ZTogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRTaXplLFxyXG4gICAgICBmb250RmFtaWx5OiB0aGF0Lm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSxcclxuICAgICAgY29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5jb2xvcixcclxuICAgICAgcGl4ZWxPZmZzZXQ6IHRoYXQub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yLFxyXG4gICAgICBsaW5lQ29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5saW5lQ29sb3IsXHJcbiAgICAgIGxpbmVXaWR0aDogdGhhdC5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCxcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiB0aGF0Lm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlLFxyXG4gICAgICBuZWFyOiB0aGF0Lm9wdGlvbnMubGFiZWwubmVhcixcclxuICAgICAgZmFyOiB0aGF0Lm9wdGlvbnMubGFiZWwuZmFyLFxyXG4gICAgICBncm91bmQ6IGdyb3VuZFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGUodGhhdCkge1xyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgaWYgKHRoYXQuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGF0LnJlbmV3UG9zaXRpb25zKHBvc2l0aW9ucylcclxuICAgIHRoYXQuZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgIGlkOiB0aGF0Lm9wdGlvbnMuaWQsXHJcbiAgICAgIHNob3c6IHRoYXQub3B0aW9ucy5zaG93LFxyXG4gICAgICBwb2x5bGluZToge1xyXG4gICAgICAgIHBvc2l0aW9uczogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSksXHJcbiAgICAgICAgd2lkdGg6IHRoYXQub3B0aW9ucy53aWR0aCxcclxuICAgICAgICBjbGFtcFRvR3JvdW5kOiBncm91bmQsXHJcbiAgICAgICAgLy8gbWF0ZXJpYWw6IHRoYXQuZ2V0TWF0ZXJpYWwodGhhdC5vcHRpb25zLmNvbG9yLCB0aGF0Lm9wdGlvbnMudHlwZSksXHJcbiAgICAgICAgekluZGV4OiB0aGF0LnNkay5fZW50aXR5WkluZGV4XHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgdGhhdC5lbnRpdHkucG9seWxpbmUub3JpV2lkdGggPSB0aGF0Lm9wdGlvbnMud2lkdGhcclxuICAgIHRoYXQuanVkZ2VMaW5lKHRoYXQuZW50aXR5LCB0aGF0Lm9wdGlvbnMpXHJcblxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhhdC5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoYXQuaW5wdXRTcGVlZFxyXG4gICAgdGhhdC5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGF0LmdldE1hdGVyaWFsKFxyXG4gICAgICB0aGF0Lm9wdGlvbnMuY29sb3IsXHJcbiAgICAgIHRoYXQub3B0aW9ucy50eXBlLFxyXG4gICAgICB0aGF0LmVudGl0eSxcclxuICAgICAgcGFyYW1zXHJcbiAgICApXHJcblxyXG4gICAgdGhhdC5zZGsuX2VudGl0eVpJbmRleCsrXHJcbiAgICBDdXJ2ZWxpbmVPYmplY3QuY3JlYXRlTGFiZWwodGhhdClcclxuICAgIC8vIHRoYXQuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9uc0xuZ0xhdCA9IHBvc2l0aW9uc1xyXG4gICAgdGhhdC5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgIC8vIHRoYXQub3B0aW9ucy5sZW5ndGhCeU1ldGVyID0gdGhhdC5jb21wdXRlRGlzdGFuY2UyKHRoYXQuc21vb3RoSGFuZGxlKHBvc2l0aW9ucyksIDIsIGdyb3VuZClcclxuICAgIC8vIHRoYXQubGVuZ3RoVW5pdCA9IHRoYXQub3B0aW9uc1snbGVuZ3RoLXVuaXQnXVxyXG4gICAgLy8gc3luY0RhdGEodGhhdC5zZGssIHRoYXQub3B0aW9ucy5pZClcclxuICAgIC8vIGlmICh0aGF0Lm9wdGlvbnMuc2hvdykge1xyXG4gICAgLy8gICBzZXRTcGxpdERpcmVjdGlvbigwLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICAvLyB9XHJcblxyXG4gICAgdGhhdC5jb21wdXRlRGlzdGFuY2UoXHJcbiAgICAgIHRoYXQuc21vb3RoSGFuZGxlKHBvc2l0aW9ucyksXHJcbiAgICAgIDIsXHJcbiAgICAgIHRoYXQub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICkudGhlbihyZXMgPT4ge1xyXG4gICAgICB0aGF0Lmxlbmd0aEJ5TWV0ZXIgPSByZXNcclxuICAgICAgdGhhdC5sZW5ndGhDaGFuZ2VDYWxsQmFjayAmJiB0aGF0Lmxlbmd0aENoYW5nZUNhbGxCYWNrKClcclxuICAgICAgc3luY0RhdGEodGhhdC5zZGssIHRoYXQub3B0aW9ucy5pZClcclxuICAgIH0pXHJcbiAgICBpZiAodGhhdC5vcHRpb25zLnNob3cpIHtcclxuICAgICAgc2V0U3BsaXREaXJlY3Rpb24oMCwgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmICh0aGlzLm9wdGlvbnMubm9zZVRvVGFpbCkge1xyXG4gICAgLy8gICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb21EZWdyZWVzQXJyYXkubGVuZ3RoOyBpICs9IDIpIHtcclxuICAgIC8vICAgICBhcnJheS5wdXNoKHsgbG5nOiBmcm9tRGVncmVlc0FycmF5W2ldLCBsYXQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDFdIH0pXHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmZpdF9sZW5ndGggPSB0b29sLmNvbXB1dGVEaXN0YW5jZTIoYXJyYXkpXHJcbiAgICAvLyB9XHJcbiAgICAvLyBlbHNlIHtcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmZpdF9sZW5ndGggPSB0b29sLmNvbXB1dGVEaXN0YW5jZTIocG9zaXRpb25zKVxyXG4gICAgLy8gfVxyXG4gICAgLy8gaWYgKHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoX3VuaXQgPT09ICdrbScpIHtcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmZpdF9sZW5ndGggPSB0aGlzLm9wdGlvbnMuZml0X2xlbmd0aCAvIDEwMDBcclxuICAgIC8vIH1cclxuXHJcbiAgICBsZXQgc2NlbmUgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmVcclxuICB9XHJcbiAganVkZ2VMaW5lKGVudGl0eSwgbmV3UGFyYW0pIHtcclxuICAgIGlmICghZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdCkge1xyXG4gICAgICBsZXQgcGFyYW0gPSB7XHJcbiAgICAgICAgY29sb3I6IG5ld1BhcmFtLmNvbG9yLFxyXG4gICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyBgL2ltZy9hcnJvdy8xLnBuZ2AsXHJcbiAgICAgICAgc3BhY2U6IG5ld1BhcmFtLnNwYWNlLFxyXG4gICAgICAgIHNwZWVkOiBuZXdQYXJhbS5zcGVlZFxyXG4gICAgICB9XHJcblxyXG4gICAgICBwYXJhbS5zcGVlZCA9IG5ld1BhcmFtLnJvdGF0ZSA/IHBhcmFtLnNwZWVkIDogMCAtIHBhcmFtLnNwZWVkXHJcblxyXG4gICAgICBjb25zdCBjYW52YXNFbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgY29uc3QgY3R4ID0gY2FudmFzRWxlLmdldENvbnRleHQoJzJkJylcclxuICAgICAgY29uc3QgbXlJbWcgPSBuZXcgSW1hZ2UoKVxyXG4gICAgICAvLyBteUltZy5zcmMgPSB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9hcnJvdy8xLnBuZydcclxuICAgICAgbXlJbWcuc3JjID0gcGFyYW0uaW1hZ2VcclxuICAgICAgbGV0IHRoYXQgPSB0aGlzXHJcbiAgICAgIG15SW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjYW52YXNFbGUud2lkdGggPSBteUltZy53aWR0aCAqIChwYXJhbS5zcGFjZSArIDEpXHJcbiAgICAgICAgY2FudmFzRWxlLmhlaWdodCA9IG15SW1nLmhlaWdodFxyXG5cclxuICAgICAgICBsZXQgb3JpUmVwZWF0ID0gdGhhdC5nZXRTY2VlbkxpbmUoZW50aXR5LCBwYXJhbSwgY2FudmFzRWxlKVxyXG4gICAgICAgIG9yaVJlcGVhdCAmJiAoZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdCA9IG9yaVJlcGVhdClcclxuXHJcblxyXG4gICAgICAgIHZhciBwb3NpdGlvblByb3BlcnR5ID0gZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucztcclxuICAgICAgICB2YXIgcG9zaXRpb25zID0gcG9zaXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSh0aGF0LnNkay52aWV3ZXIuY2xvY2suY3VycmVudFRpbWUpO1xyXG5cclxuICAgICAgICBpZiAoIUNlc2l1bS5kZWZpbmVkKHBvc2l0aW9ucykpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMS4wLCAxLjApO1xyXG4gICAgICAgICAgLy8gcmV0dXJuIDEuMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoIC0gMTsgKytpKSB7XHJcbiAgICAgICAgICBkaXN0YW5jZSArPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHJlcGVhdFggPSBkaXN0YW5jZSAvIGVudGl0eS5wb2x5bGluZS53aWR0aC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIC8vIOagueaNruWcsOWbvue8qeaUvueoi+W6puiwg+aVtHJlcGVhdFhcclxuICAgICAgICB2YXIgY2FtZXJhSGVpZ2h0ID0gdGhhdC5zZGsudmlld2VyLmNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYy5oZWlnaHQ7XHJcbiAgICAgICAgdmFyIGJvdW5kaW5nU3BoZXJlID0gbmV3IENlc2l1bS5Cb3VuZGluZ1NwaGVyZShcclxuICAgICAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygtMTAwMDAwMCwgMCwgMCksIC8vIOS4reW/g+eCueWdkOagh1xyXG4gICAgICAgICAgNTAwMDAwIC8vIOWNiuW+hO+8iOi3neemu++8iVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICAgIHZhciBkcmF3aW5nQnVmZmVyV2lkdGggPSB0aGF0LnNkay52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoO1xyXG4gICAgICAgIHZhciBkcmF3aW5nQnVmZmVySGVpZ2h0ID0gdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgICAgdmFyIGdyb3VuZFJlc29sdXRpb24gPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUuY2FtZXJhLmdldFBpeGVsU2l6ZShib3VuZGluZ1NwaGVyZSwgZHJhd2luZ0J1ZmZlcldpZHRoLCBkcmF3aW5nQnVmZmVySGVpZ2h0KVxyXG4gICAgICAgIHJlcGVhdFggKj0gZ3JvdW5kUmVzb2x1dGlvbiAvIGNhbWVyYUhlaWdodCAvIChwYXJhbS5zcGFjZSAqIChjYW52YXNFbGUud2lkdGggLyBjYW52YXNFbGUuaGVpZ2h0ICogNSkgKyAxKTtcclxuICAgICAgICAvLyBpZiAoZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsLm9yaVJlcGVhdCkge1xyXG5cclxuICAgICAgICBpZiAodGhhdC5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IENlc2l1bS5TY2VuZU1vZGUuU0NFTkUzRCkge1xyXG4gICAgICAgICAgbGV0IHNwZWVkID0gcmVwZWF0WCAvIGVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlTcGVlZCA9IHNwZWVkXHJcbiAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCA9IHJlcGVhdFhcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHNkazNkID0gZ2V0M0RWaWV3KClcclxuICAgICAgICAgIGxldCBzZGszZEVudGl0eSA9IHNkazNkLnZpZXdlci5lbnRpdGllcy5nZXRCeUlkKHRoYXQub3B0aW9ucy5pZClcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlTcGVlZCA9IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkXHJcbiAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCA9IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFhcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKuiOt+WPluW9k+WJjea7oeWxj+aoque6v+mAn+W6piAqL1xyXG4gIGdldFNjZWVuTGluZShlbnRpdHksIG9wdGlvbnMsIGNhbnZhc0VsZSkge1xyXG4gICAgbGV0IHBvaW50MSA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMigwLCB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodClcclxuICAgIGxldCBwb2ludDIgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIodGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aCAvIDIsIHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0KVxyXG4gICAgLy8gdmFyIGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MSlcclxuICAgIC8vIHZhciBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLnBpY2tQb3NpdGlvbihwb2ludDIpXHJcblxyXG4gICAgbGV0IHJheSA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDEpO1xyXG4gICAgbGV0IGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXksIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcblxyXG4gICAgbGV0IHJheTIgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmdldFBpY2tSYXkocG9pbnQyKTtcclxuICAgIGxldCBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5MiwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuICAgIC8vIGlmICghY2FydGVzaWFuMSB8fCAhY2FydGVzaWFuMikge1xyXG4gICAgLy8gICBsZXQgcmF5ID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5nZXRQaWNrUmF5KHBvaW50MSk7XHJcbiAgICAvLyAgIGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXksIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcblxyXG4gICAgLy8gICBsZXQgcmF5MiA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDIpO1xyXG4gICAgLy8gICBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5MiwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuICAgIC8vIH1cclxuICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuXHJcblxyXG4gICAgICB2YXIgZGlzdGFuY2UgPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShjYXJ0ZXNpYW4xLCBjYXJ0ZXNpYW4yKTtcclxuXHJcbiAgICAgIHZhciByZXBlYXRYID0gZGlzdGFuY2UgLyBlbnRpdHkucG9seWxpbmUud2lkdGguZ2V0VmFsdWUoKTtcclxuICAgICAgLy8g5qC55o2u5Zyw5Zu+57yp5pS+56iL5bqm6LCD5pW0cmVwZWF0WFxyXG4gICAgICB2YXIgY2FtZXJhSGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYy5oZWlnaHQ7XHJcbiAgICAgIHZhciBib3VuZGluZ1NwaGVyZSA9IG5ldyBDZXNpdW0uQm91bmRpbmdTcGhlcmUoXHJcbiAgICAgICAgbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKC0xMDAwMDAwLCAwLCAwKSwgLy8g5Lit5b+D54K55Z2Q5qCHXHJcbiAgICAgICAgNTAwMDAwIC8vIOWNiuW+hO+8iOi3neemu++8iVxyXG4gICAgICApO1xyXG5cclxuXHJcbiAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICB2YXIgZHJhd2luZ0J1ZmZlcldpZHRoID0gdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aDtcclxuICAgICAgdmFyIGRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgIHZhciBncm91bmRSZXNvbHV0aW9uID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmNhbWVyYS5nZXRQaXhlbFNpemUoYm91bmRpbmdTcGhlcmUsIGRyYXdpbmdCdWZmZXJXaWR0aCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgICAgLy8gcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKChteUltZy53aWR0aCAvIG15SW1nLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIGlmIChncm91bmRSZXNvbHV0aW9uID4gNzAwKSB7XHJcbiAgICAgICAgcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKG9wdGlvbnMuc3BhY2UgKiAoY2FudmFzRWxlLndpZHRoIC8gY2FudmFzRWxlLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVwZWF0WCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FM0QpIHtcclxuICAgICAgICByZXR1cm4gcmVwZWF0WFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBzZGszZCA9IGdldDNEVmlldygpXHJcbiAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIHJldHVybiBzZGszZEVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICog57yW6L6R5qGGXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdGF0ZSB0cnVl5omT5byA77yMZmFsc2XlhbPpl61cclxuICAgKi9cclxuICBhc3luYyBlZGl0KHN0YXRlKSB7XHJcbiAgICByZXR1cm5cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBpZiAoc3RhdGUpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gYXdhaXQgbmV3IERpYWxvZyh0aGlzLnNkaywgdGhpcy5vcHRpb25zLCB7XHJcbiAgICAgICAgdGl0bGU6ICfmm7Lnur/lsZ7mgKcnLFxyXG4gICAgICAgIGxlZnQ6ICcxODBweCcsXHJcbiAgICAgICAgdG9wOiAnMTAwcHgnLFxyXG4gICAgICAgIGNvbmZpcm1DYWxsQmFjazogb3B0aW9ucyA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUudHJpbSgpXHJcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBsbmc6IHRoaXMubGFiZWwucG9zaXRpb25bMF0sXHJcbiAgICAgICAgICAgIGxhdDogdGhpcy5sYWJlbC5wb3NpdGlvblsxXSxcclxuICAgICAgICAgICAgYWx0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzJdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcHRpb25zKVxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayAmJlxyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICAgICAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgc3luY1NwbGl0RGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzZXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlc2V0Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVtb3ZlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsb3NlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5jbG9zZUNhbGxCYWNrKClcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDYWxsQmFjazogc2hvdyA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRyYW5zbGF0aW9uYWxDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSAhdGhpcy5wb3NpdGlvbkVkaXRpbmdcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOS6jOasoee8lui+keWbnuiwg1xyXG4gICAgICAgIHNlY29uZGFyeUVkaXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgdGhpcy5ub3NlVG9UYWlsID0gZmFsc2VcclxuICAgICAgICAgIHRoaXMuaGVpZ2h0TW9kZSA9IDBcclxuICAgICAgICAgIHRoaXMubm9kZUVkaXQoKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lID1cclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuYm9keS5jbGFzc05hbWUgKyAnIHBvbHlsaW5lJ1xyXG4gICAgICBsZXQgY29udGVudEVsbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXHJcbiAgICAgIGNvbnRlbnRFbG0uaW5uZXJIVE1MID0gaHRtbCh0aGlzKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY29udGVudEFwcENoaWxkKGNvbnRlbnRFbG0pXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlXHJcbiAgICAgIC8vIHRoaXMuYXR0cmlidXRlQ2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudFxyXG4gICAgICAvLyB0aGlzLmF0dHJpYnV0ZUdvb2RzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50XHJcbiAgICAgIGZ1bmN0aW9uIHRhYkNsaWNrKGUpIHtcclxuICAgICAgICBpZiAoZSA9PT0gJzInIHx8IGUgPT09IDIpIHsvL+eCueWHu+e6v+adoeagt+W8j1xyXG4gICAgICAgICAgaWYgKDIgPCBfdGhpcy5vcHRpb25zLnR5cGUgJiYgX3RoaXMub3B0aW9ucy50eXBlIDwgMTMpIHsvL+i0tOWbvuWPguaVsFxyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8g5Yib5bu65qCH562+6aG1XHJcbiAgICAgIGxldCB0YWJzRWxtID0gbmV3IGN5X3RhYnMoXHJcbiAgICAgICAgJ3BvbHlsaW5lLW9iamVjdC1lZGl0LXRhYnMnLFxyXG4gICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICB0aGlzLnNka1xyXG4gICAgICApXHJcbiAgICAgIC8vIOminOiJsue7hOS7tlxyXG4gICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmNvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxhYmVsQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGFiZWxDb2xvcicpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgZXh0ZW5kQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZXh0ZW5kQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmV4dGVuZENvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5leHRlbmRDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5leHRlbmRDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbExpbmVDb2xvcicpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxMaW5lQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0JylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLFxyXG4gICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsXHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvckVuZCcpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JyxcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgYWxsX2VsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKVxyXG4gICAgICBFdmVudEJpbmRpbmcub24odGhpcywgYWxsX2VsbSlcclxuICAgICAgdGhpcy5fZWxtcyA9IEV2ZW50QmluZGluZy5lbGVtZW50XHJcbiAgICAgIHRoaXMuX2VsbXMuY29sb3IgPSBbY29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvciA9IFtsYWJlbENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmV4dGVuZENvbG9yID0gW2V4dGVuZENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yID0gW2xpbmVDb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gW2xhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXJdXHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIC8vIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgICAgICAvLyB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAgICAgLy8gdGhpcy5nb29kc1NlbGVjdCAmJiB0aGlzLmdvb2RzU2VsZWN0KClcclxuICAgICAgICBsZXQgdGFnRGF0YSA9IHRoaXMuYXR0cmlidXRlU2VsZWN0XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZUVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnYXR0cmlidXRlLXNlbGVjdC1ib3gnXHJcbiAgICAgICAgKVswXVxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVFbG0pIHtcclxuICAgICAgICAgIGxldCBsZWdwT2JqZWN0ID0gbGVncChhdHRyaWJ1dGVFbG0sICcuYXR0cmlidXRlLXNlbGVjdCcpXHJcbiAgICAgICAgICBsZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKHRhZ0RhdGEpXHJcbiAgICAgICAgICBsZXQgYXR0cmlidXRlU2VsZWN0RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGFnRGF0YVtpXS5rZXkgPT09IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlU2VsZWN0RWxtLnZhbHVlID0gdGFnRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUodGFnRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLnZhbHVlID09PSBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRhZ0RhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuYW1lRGF0YSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+epuumXtOmVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn56m66Ze06ZW/5bqmJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+aKleW9semVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5oqV5b2x6ZW/5bqmJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+WcsOihqOmVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5Zyw6KGo6ZW/5bqmJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgbGV0IG5hbWVEYXRhTGVncE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnaW5wdXQtc2VsZWN0LXVuaXQtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaW5wdXQtc2VsZWN0LXVuaXQnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChuYW1lRGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIG5hbWVEYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaChuYW1lRGF0YSlcclxuICAgICAgICAgIGxldCBuYW1lRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHRoaXMuX2VsbXMud29yZHNOYW1lID0gW25hbWVEYXRhTGVncEVsbV1cclxuICAgICAgICAgIG5hbWVEYXRhTGVncEVsbS52YWx1ZSA9IHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKG5hbWVEYXRhW2ldLnZhbHVlID09PSBuYW1lRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBuYW1lRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUobmFtZURhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbmFtZURhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5hbWVEYXRhW2ldLnZhbHVlID09PSBuYW1lRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud29yZHNOYW1lID0gbmFtZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5Y6f5aeL6ZW/5bqm5Y2V5L2NXHJcbiAgICAgICAgbGV0IHVuaXREYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn57GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfnsbMnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5Y2D57GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfljYPnsbMnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICBsZXQgdW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdpbnB1dC1zZWxlY3QtdW5pdC1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5pbnB1dC1zZWxlY3QtdW5pdCcsXHJcbiAgICAgICAgICAxXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmICh1bml0RGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaCh1bml0RGF0YSlcclxuICAgICAgICAgIGxldCB1bml0RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHRoaXMuX2VsbXMubGVuZ3RoVW5pdCA9IFt1bml0RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVuaXREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh1bml0RGF0YVtpXS52YWx1ZSA9PT0gdW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgdW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKHVuaXREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHVuaXREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmICh1bml0RGF0YVtpXS52YWx1ZSA9PT0gdW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlbmd0aFVuaXQgPSB1bml0RGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDmi5/lkIjplb/luqbljZXkvY1cclxuICAgICAgICAvLyBsZXQgZml0VW5pdERhdGEgPSBbXHJcbiAgICAgICAgLy8gICB7XHJcbiAgICAgICAgLy8gICAgIG5hbWU6ICfnsbMnLFxyXG4gICAgICAgIC8vICAgICB2YWx1ZTogJ+exsydcclxuICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgLy8gICB7XHJcbiAgICAgICAgLy8gICAgIG5hbWU6ICfljYPnsbMnLFxyXG4gICAgICAgIC8vICAgICB2YWx1ZTogJ+WNg+exsydcclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyBdXHJcblxyXG4gICAgICAgIC8vIGxldCBmaXRVbml0RGF0YUxlZ3BPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgIC8vICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAvLyAgICAgJ2lucHV0LXNlbGVjdC1maXQtdW5pdC1ib3gnXHJcbiAgICAgICAgLy8gICApWzBdLFxyXG4gICAgICAgIC8vICAgJy5pbnB1dC1zZWxlY3QtZml0LXVuaXQnXHJcbiAgICAgICAgLy8gKVxyXG4gICAgICAgIC8vIGlmIChmaXRVbml0RGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAvLyAgIGZpdFVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaChmaXRVbml0RGF0YSlcclxuICAgICAgICAvLyAgIGxldCBmaXRVbml0RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgIC8vICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LWZpdC11bml0JylbMF1cclxuICAgICAgICAvLyAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgLy8gICB0aGlzLl9lbG1zLmZpdExlbmd0aFVuaXQgPSBbZml0VW5pdERhdGFMZWdwRWxtXVxyXG4gICAgICAgIC8vICAgZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlID0gdGhpcy5vcHRpb25zWydmaXQtbGVuZ3RoLXVuaXQnXVxyXG4gICAgICAgIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXRVbml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vICAgICBpZiAoZml0VW5pdERhdGFbaV0udmFsdWUgPT09IGZpdFVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgIGZpdFVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShmaXRVbml0RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAvLyAgICAgICBicmVha1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gICBmaXRVbml0RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZml0VW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyAgICAgICBpZiAoZml0VW5pdERhdGFbaV0udmFsdWUgPT09IGZpdFVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5maXRMZW5ndGhVbml0ID0gZml0VW5pdERhdGFbaV0udmFsdWVcclxuICAgICAgICAvLyAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgLy8gICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICB9KVxyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgbGV0IGxpbmVUeXBlRGF0YSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBsaW5lXCI+PC9pPuWunue6vycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5a6e57q/JyxcclxuICAgICAgICAgICAga2V5OiAwLFxyXG4gICAgICAgICAgICBpY29uOiAnbGluZSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZGFzaC1saW5lXCI+PC9pPuiZmue6vycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn6Jma57q/JyxcclxuICAgICAgICAgICAga2V5OiAxLFxyXG4gICAgICAgICAgICBpY29uOiAnZGFzaC1saW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBsaWdodC1saW5lXCI+PC9pPuazm+WFiScsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rOb5YWJJyxcclxuICAgICAgICAgICAga2V5OiAyLFxyXG4gICAgICAgICAgICBpY29uOiAnbGlnaHQtbGluZSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gdGFpbC1saW5lXCI+PC9pPuWwvui/ueWFiee6vycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAga2V5OiAzLFxyXG4gICAgICAgICAgICBpY29uOiAndGFpbC1saW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBtdWx0LXRhaWwtbGluZVwiPjwvaT7lpJrlsL7ov7nlhYnnur8nLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+WkmuWwvui/ueWFiee6vycsXHJcbiAgICAgICAgICAgIGtleTogNCxcclxuICAgICAgICAgICAgaWNvbjogJ211bHQtdGFpbC1saW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBmbG93LWRhc2gtbGluZTFcIj48L2k+5rWB5Yqo6Jma57q/MScsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MScsXHJcbiAgICAgICAgICAgIGtleTogNSxcclxuICAgICAgICAgICAgaWNvbjogJ2Zsb3ctZGFzaC1saW5lMSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZmxvdy1kYXNoLWxpbmUyXCI+PC9pPua1geWKqOiZmue6vzInLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOiZmue6vzInLFxyXG4gICAgICAgICAgICBrZXk6IDYsXHJcbiAgICAgICAgICAgIGljb246ICdmbG93LWRhc2gtbGluZTInXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lMVwiPjwvaT7mtYHliqjnrq3lpLQxJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQxJyxcclxuICAgICAgICAgICAga2V5OiA3LFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmUxJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTJcIj48L2k+5rWB5Yqo566t5aS0MicsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MicsXHJcbiAgICAgICAgICAgIGtleTogOCxcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lMidcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUzXCI+PC9pPua1geWKqOeureWktDMnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDMnLFxyXG4gICAgICAgICAgICBrZXk6IDksXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTMnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNFwiPjwvaT7mtYHliqjnrq3lpLQ0JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ0JyxcclxuICAgICAgICAgICAga2V5OiAxMCxcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lNCdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU1XCI+PC9pPua1geWKqOeureWktDUnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDUnLFxyXG4gICAgICAgICAgICBrZXk6IDExLFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmU1J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTZcIj48L2k+5rWB5Yqo566t5aS0NicsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NicsXHJcbiAgICAgICAgICAgIGtleTogMTIsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTYnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICAgIGxldCBsaW5lVHlwZURhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdpbnB1dC1zZWxlY3QtbGluZS10eXBlLWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmlucHV0LXNlbGVjdC1saW5lLXR5cGUnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChsaW5lVHlwZURhdGFMZWdwT2JqZWN0KSB7XHJcbiAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKGxpbmVUeXBlRGF0YSlcclxuXHJcbiAgICAgICAgICBsZXQgaUFjdGl2ZUVsbTIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJylcclxuICAgICAgICAgIGlBY3RpdmVFbG0yLmNsYXNzTmFtZSA9ICdpY29uIGljb24tYWN0aXZlJ1xyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LWxpbmUtdHlwZScpWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2N5X2RhdGFsaXN0JylbMF0uYXBwZW5kQ2hpbGQoaUFjdGl2ZUVsbTIpXHJcblxyXG4gICAgICAgICAgbGV0IGxpbmVUeXBlRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LWxpbmUtdHlwZScpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5saW5lVHlwZSA9IFtsaW5lVHlwZURhdGFMZWdwRWxtXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVHlwZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGxpbmVUeXBlRGF0YVtpXS5rZXkgPT09IHRoaXMub3B0aW9ucy50eXBlKSB7XHJcbiAgICAgICAgICAgICAgbGluZVR5cGVEYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShsaW5lVHlwZURhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgbGluZVR5cGVEYXRhTGVncEVsbS52YWx1ZSA9IGxpbmVUeXBlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGlBY3RpdmVFbG0yLmNsYXNzTmFtZSA9IGBpY29uIGljb24tYWN0aXZlICR7bGluZVR5cGVEYXRhW2ldLmljb259YFxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxpbmVUeXBlRGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZVR5cGVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGxpbmVUeXBlRGF0YVtpXS52YWx1ZSA9PT0gbGluZVR5cGVEYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lVHlwZSA9IGxpbmVUeXBlRGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGlBY3RpdmVFbG0yLmNsYXNzTmFtZSA9IGBpY29uIGljb24tYWN0aXZlICR7bGluZVR5cGVEYXRhW2ldLmljb259YFxyXG5cclxuICAgICAgICAgICAgICAgIC8v5o6n5Yi25Y+C5pWw5pi+6ZqQXHJcbiAgICAgICAgICAgICAgICBpZiAoMiA8IHRoaXMubGluZVR5cGUgJiYgdGhpcy5saW5lVHlwZSA8IDEzKSB7Ly/otLTlm77lj4LmlbBcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykgJiYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdub25lJylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgyIDwgdGhpcy5saW5lVHlwZSAmJiB0aGlzLmxpbmVUeXBlIDwgNSkgey8v5bC+6L+55Y+C5pWwXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMV0uc3R5bGUuZGlzcGxheSA9ICdub25lJylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMV0uc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGhlaWdodEJveEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1ib3gnKVswXVxyXG4gICAgICAgIGxldCBoZWlnaHRFbG0gPSBoZWlnaHRCb3hFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0JylbMF1cclxuICAgICAgICBsZXQgaGVpZ2h0Q29uZmlybUVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1jb25maXJtJylbMF1cclxuICAgICAgICBoZWlnaHRFbG0udmFsdWUgPSAxMFxyXG4gICAgICAgIGlmICh0aGlzLmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICAgICAgaGVpZ2h0Qm94RWxtICYmIChoZWlnaHRCb3hFbG0uY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3ggZGlzYWJsZWQnKTtcclxuICAgICAgICAgIGhlaWdodENvbmZpcm1FbG0gJiYgaGVpZ2h0Q29uZmlybUVsbS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaGVpZ2h0Qm94RWxtICYmIChoZWlnaHRCb3hFbG0uY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3gnKTtcclxuICAgICAgICAgIGhlaWdodENvbmZpcm1FbG0gJiYgaGVpZ2h0Q29uZmlybUVsbS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBoZWlnaHRNb2RlRGF0YSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+a1t+aLlOmrmOW6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rW35ouU6auY5bqmJyxcclxuICAgICAgICAgICAga2V5OiAnMCcsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn55u45a+55Zyw6KGoJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfnm7jlr7nlnLDooagnLFxyXG4gICAgICAgICAgICBrZXk6ICcxJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfkvp3pmYTmqKHlnosnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+S+nemZhOaooeWeiycsXHJcbiAgICAgICAgICAgIGtleTogJzInLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgICBsZXQgaGVpZ2h0TW9kZU9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnaGVpZ2h0LW1vZGUtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaGVpZ2h0LW1vZGUnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChoZWlnaHRNb2RlT2JqZWN0KSB7XHJcbiAgICAgICAgICBoZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoKGhlaWdodE1vZGVEYXRhKVxyXG4gICAgICAgICAgbGV0IGhlaWdodE1vZGVEYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtbW9kZScpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHRNb2RlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0TW9kZURhdGFbaV0ua2V5ID09IHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgICAgICAgIGhlaWdodE1vZGVEYXRhTGVncEVsbS52YWx1ZSA9IGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgaGVpZ2h0TW9kZU9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShcclxuICAgICAgICAgICAgICAgIGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGhlaWdodE1vZGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHRNb2RlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZSA9PT0gaGVpZ2h0TW9kZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSBoZWlnaHRNb2RlRGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIGhlaWdodEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodCA9IGhlaWdodEVsbVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRCb3ggPSBoZWlnaHRCb3hFbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSA9IGhlaWdodE1vZGVEYXRhTGVncEVsbVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtID0gaGVpZ2h0Q29uZmlybUVsbVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlT2JqZWN0ID0gaGVpZ2h0TW9kZU9iamVjdFxyXG5cclxuICAgICAgICAgIGhlaWdodENvbmZpcm1FbG0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQgPSBOdW1iZXIoKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ICsgTnVtYmVyKGhlaWdodEVsbS52YWx1ZSkpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgICAgdGhpcy5fZWxtcy5hbHRbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICAgICAgICApXHJcblxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRhYmxlRWxtID0gY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzcGF0aWFsLWluZm8tdGFibGUnKVswXVxyXG4gICAgICAgIGxldCB0Qm9keUVsbSA9IHRhYmxlRWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gICAgICAgIHRoaXMuX2VsbXMubG5nID0gW11cclxuICAgICAgICB0aGlzLl9lbG1zLmxuZ0lucHV0ID0gW11cclxuICAgICAgICB0aGlzLl9lbG1zLmxhdCA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYXRJbnB1dCA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5hbHQgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMuYWx0SW5wdXQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgICAgICAgIHRyLmNsYXNzTmFtZSA9ICd0cidcclxuICAgICAgICAgIHRyLmlubmVySFRNTCA9IGBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+JHtpICsgMX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGxuZyBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGxhdCBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGFsdCBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICAgIGBcclxuICAgICAgICAgIGxldCBsbmdCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsbmcnKVswXVxyXG4gICAgICAgICAgbGV0IGxuZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgbG5nLmlubmVySFRNTCA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KVxyXG4gICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZylcclxuICAgICAgICAgIGxldCBsbmdJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGxuZ0lucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGxuZ0lucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgbG5nSW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgbG5nSW5wdXQubWluID0gLTE4MFxyXG4gICAgICAgICAgbG5nSW5wdXQubWF4ID0gMTgwXHJcbiAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KVxyXG5cclxuICAgICAgICAgIGxldCBsYXRCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYXQnKVswXVxyXG4gICAgICAgICAgbGV0IGxhdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgbGF0LmlubmVySFRNTCA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KVxyXG4gICAgICAgICAgbGF0Qm94LmFwcGVuZENoaWxkKGxhdClcclxuICAgICAgICAgIGxldCBsYXRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGxhdElucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGxhdElucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgbGF0SW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgbGF0SW5wdXQubWluID0gLTkwXHJcbiAgICAgICAgICBsYXRJbnB1dC5tYXggPSA5MFxyXG4gICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOClcclxuXHJcbiAgICAgICAgICBsZXQgYWx0Qm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYWx0JylbMF1cclxuICAgICAgICAgIGxldCBhbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGFsdC5pbm5lckhUTUwgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQpLnRvRml4ZWQoMilcclxuICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHQpXHJcbiAgICAgICAgICBsZXQgYWx0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBhbHRJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBhbHRJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGFsdElucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGFsdElucHV0Lm1pbiA9IC05OTk5OTk5XHJcbiAgICAgICAgICBhbHRJbnB1dC5tYXggPSA5OTk5OTk5OTlcclxuICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KS50b0ZpeGVkKDIpXHJcblxyXG4gICAgICAgICAgbG5nQm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsbmdCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZ0lucHV0KVxyXG4gICAgICAgICAgICBsbmdJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmdCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZylcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcgPSBOdW1iZXIoTnVtYmVyKGxuZ0lucHV0LnZhbHVlKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmcuaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFt0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZywgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsIGZyb21EZWdyZWVzQXJyYXlbMl1dXHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIGxhdEJveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgbGF0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXRJbnB1dClcclxuICAgICAgICAgICAgbGF0SW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGF0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbGF0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXQpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGF0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0ID0gTnVtYmVyKE51bWJlcihsYXRJbnB1dC52YWx1ZSkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbGF0LmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOClcclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LCBmcm9tRGVncmVlc0FycmF5WzJdXVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBhbHRCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhbHRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdElucHV0KVxyXG4gICAgICAgICAgICBhbHRJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBhbHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBhbHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQgPSBOdW1iZXIoTnVtYmVyKGFsdElucHV0LnZhbHVlKS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHQuaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQudG9GaXhlZCgyKVxyXG4gICAgICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFt0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZywgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsIGZyb21EZWdyZWVzQXJyYXlbMl1dXHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIHRoaXMuX2VsbXMubG5nLnB1c2gobG5nKVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sbmdJbnB1dC5wdXNoKGxuZ0lucHV0KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYXQucHVzaChsYXQpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhdElucHV0LnB1c2gobGF0SW5wdXQpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmFsdC5wdXNoKGFsdClcclxuICAgICAgICAgIHRoaXMuX2VsbXMuYWx0SW5wdXQucHVzaChhbHRJbnB1dClcclxuICAgICAgICAgIHRCb2R5RWxtLmFwcGVuZENoaWxkKHRyKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGZvbnREYXRhID0gZ2V0Rm9udExpc3QoKVxyXG4gICAgICAgIGxldCBmb250T2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdmb250LXNlbGVjdC1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5mb250LXNlbGVjdCdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGZvbnRPYmplY3QpIHtcclxuICAgICAgICAgIGZvbnRPYmplY3QubGVncF9zZWFyY2goZm9udERhdGEpXHJcbiAgICAgICAgICBsZXQgZm9udERhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ZvbnQtc2VsZWN0JylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBmb250RGF0YUxlZ3BFbG0udmFsdWUgPSBmb250RGF0YVt0aGlzLmxhYmVsRm9udEZhbWlseV0udmFsdWVcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGZvbnREYXRhW2ldLnZhbHVlID09IGZvbnREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGZvbnRPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoZm9udERhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZm9udERhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGZvbnREYXRhW2ldLnZhbHVlID09PSBmb250RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxGb250RmFtaWx5ID0gZm9udERhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGFiZWxGb250RmFtaWx5ID0gW2ZvbnREYXRhTGVncEVsbV1cclxuICAgICAgICB9XHJcbiAgICAgIH0sIDApXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDlubPmu5HlpITnkIZcclxuICBzbW9vdGhIYW5kbGUocG9zaXRpb25zKSB7XHJcbiAgICBsZXQgbmV3UG9zaXRpb25zID0gW11cclxuICAgIGxldCB0aW1lID0gW11cclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5SGVpZ2h0cyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmcm9tRGVncmVlc0FycmF5SGVpZ2h0cy5wdXNoKFxyXG4gICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgcG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICBwb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgIClcclxuICAgICAgdGltZS5wdXNoKGkgLyAocG9zaXRpb25zLmxlbmd0aCAtIDEpKVxyXG4gICAgfVxyXG4gICAgbGV0IHNwbGluZSA9IG5ldyBDZXNpdW0uQ2F0bXVsbFJvbVNwbGluZSh7XHJcbiAgICAgIHRpbWVzOiB0aW1lLFxyXG4gICAgICBwb2ludHM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKVxyXG4gICAgfSlcclxuICAgIGxldCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoICogMjBcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBjYXJ0ZXNpYW4zID0gc3BsaW5lLmV2YWx1YXRlKGkgLyBsZW5ndGgpXHJcbiAgICAgIG5ld1Bvc2l0aW9ucy5wdXNoKHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuMywgdGhpcy5zZGsudmlld2VyKSlcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdQb3NpdGlvbnNcclxuICB9XHJcblxyXG4gIC8vIOabtOaWsOWdkOagh1xyXG4gIHJlbmV3UG9zaXRpb25zKHBvc2l0aW9uc0FycmF5LCBjZCkge1xyXG4gICAgaWYgKHRoaXMuX2Vycm9yKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocG9zaXRpb25zQXJyYXkpKVxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgc3dpdGNoICh0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICBjYXNlICcwJzpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUuZ2V0SGVpZ2h0KENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdCkpXHJcbiAgICAgICAgICBwb3NpdGlvbnNbaV0uYWx0ID0gaGVpZ2h0ID8gTnVtYmVyKChwb3NpdGlvbnNbaV0uYWx0ICsgTnVtYmVyKGhlaWdodCkpLnRvRml4ZWQoMikpIDogTnVtYmVyKChwb3NpdGlvbnNbaV0uYWx0KS50b0ZpeGVkKDIpKVxyXG4gICAgICAgIH1cclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgICBsZXQgbmV3UG9zaXRpb25zXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsICYmXHJcbiAgICAgIHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsICE9PSAnZmFsc2UnXHJcbiAgICApIHtcclxuICAgICAgbmV3UG9zaXRpb25zID0gWy4uLnBvc2l0aW9ucywgcG9zaXRpb25zWzBdXVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbmV3UG9zaXRpb25zID0gWy4uLnBvc2l0aW9uc11cclxuICAgIH1cclxuICAgIG5ld1Bvc2l0aW9ucyA9IHRoaXMuc21vb3RoSGFuZGxlKG5ld1Bvc2l0aW9ucylcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3UG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAgICAgICBuZXdQb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgIG5ld1Bvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgbmV3UG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIOiuoeeul+mVv+W6plxyXG4gICAgLy8gbGV0IGFycmF5ID0gW11cclxuICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgZnJvbURlZ3JlZXNBcnJheS5sZW5ndGg7IGkgKz0gMykge1xyXG4gICAgLy8gICBhcnJheS5wdXNoKHtcclxuICAgIC8vICAgICBsbmc6IGZyb21EZWdyZWVzQXJyYXlbaV0sXHJcbiAgICAvLyAgICAgbGF0OiBmcm9tRGVncmVlc0FycmF5W2kgKyAxXSxcclxuICAgIC8vICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDJdXHJcbiAgICAvLyAgIH0pXHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuZml0TGVuZ3RoQnlNZXRlciA9IHRoaXMuY29tcHV0ZURpc3RhbmNlMihcclxuICAgIC8vICAgYXJyYXksXHJcbiAgICAvLyAgIDIsXHJcbiAgICAvLyAgIGdyb3VuZFxyXG4gICAgLy8gKVxyXG4gICAgLy8gdGhpcy5maXRMZW5ndGhVbml0ID0gdGhpcy5vcHRpb25zWydmaXQtbGVuZ3RoLXVuaXQnXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmxlbmd0aEJ5TWV0ZXIgPSB0aGlzLmNvbXB1dGVEaXN0YW5jZTIodGhpcy5zbW9vdGhIYW5kbGUocG9zaXRpb25zKSwgMiwgZ3JvdW5kKVxyXG4gICAgLy8gdGhpcy5sZW5ndGhVbml0ID0gdGhpcy5vcHRpb25zWydsZW5ndGgtdW5pdCddXHJcblxyXG5cclxuICAgIGlmIChcclxuICAgICAgKHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsICYmXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgIT09ICdmYWxzZScpIHx8XHJcbiAgICAgICh0aGlzLm9wdGlvbnMuc21vb3RoICYmIHRoaXMub3B0aW9ucy5zbW9vdGggIT09ICdmYWxzZScpXHJcbiAgICApIHtcclxuICAgICAgbGV0IGFycmF5ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcm9tRGVncmVlc0FycmF5Lmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgICAgYXJyYXkucHVzaCh7XHJcbiAgICAgICAgICBsbmc6IGZyb21EZWdyZWVzQXJyYXlbaV0sXHJcbiAgICAgICAgICBsYXQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDFdLFxyXG4gICAgICAgICAgYWx0OiBmcm9tRGVncmVlc0FycmF5W2kgKyAyXVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIgPSB0aGlzLmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgLy8gICBhcnJheSxcclxuICAgICAgLy8gICAyLFxyXG4gICAgICAvLyAgIGdyb3VuZFxyXG4gICAgICAvLyApXHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgICAgdGhpcy5jb21wdXRlRGlzdGFuY2UoXHJcbiAgICAgICAgYXJyYXksXHJcbiAgICAgICAgMixcclxuICAgICAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lXHJcbiAgICAgICkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIF90aGlzLmxlbmd0aEJ5TWV0ZXIgPSByZXNcclxuICAgICAgICB0aGlzLmxlbmd0aENoYW5nZUNhbGxCYWNrICYmIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2soKVxyXG4gICAgICAgIGNkICYmIGNkKClcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgICAgdGhpcy5jb21wdXRlRGlzdGFuY2UoXHJcbiAgICAgICAgX3RoaXMuc21vb3RoSGFuZGxlKHBvc2l0aW9ucyksXHJcbiAgICAgICAgMixcclxuICAgICAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lXHJcbiAgICAgICkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIF90aGlzLmxlbmd0aEJ5TWV0ZXIgPSByZXNcclxuICAgICAgICB0aGlzLmxlbmd0aENoYW5nZUNhbGxCYWNrICYmIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2soKVxyXG4gICAgICAgIGNkICYmIGNkKClcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZnJvbURlZ3JlZXNBcnJheVxyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5aSa6L655b2i77yI57q/5omp5bGV77yJXHJcbiAgcmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpIHtcclxuICAgIGxldCBsaW5lUG9zaXRpb25zID0gW11cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5kICYmIHRoaXMub3B0aW9ucy5leHRlbmQgIT09ICdmYWxzZScpIHtcclxuICAgICAgbGV0IG91dGVySG9sZSA9IFtdXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJvbURlZ3JlZXNBcnJheS5sZW5ndGg7IGkgKz0gMykge1xyXG4gICAgICAgIGxpbmVQb3NpdGlvbnMucHVzaChbZnJvbURlZ3JlZXNBcnJheVtpXSwgZnJvbURlZ3JlZXNBcnJheVtpICsgMV1dKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBsaW5lc3RyaW5nID0gdHVyZi5saW5lU3RyaW5nKGxpbmVQb3NpdGlvbnMpXHJcbiAgICAgIGxldCBidWZmZXJlZCA9IHR1cmYuYnVmZmVyKFxyXG4gICAgICAgIGxpbmVzdHJpbmcsXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuZFdpZHRoIC8gMTAwMCxcclxuICAgICAgICB7IHVuaXRzOiAna2lsb21ldGVycycgfVxyXG4gICAgICApXHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgb3V0ZXJIb2xlLnB1c2goXHJcbiAgICAgICAgICBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXVtpXVswXSxcclxuICAgICAgICAgIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdW2ldWzFdXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBob2xlcyA9IFtdIC8vIOWtlFxyXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGFycmF5ID0gW11cclxuICAgICAgICBmb3IgKGxldCBtID0gMDsgbSA8IGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzW2ldLmxlbmd0aDsgbSsrKSB7XHJcbiAgICAgICAgICBhcnJheS5wdXNoKFxyXG4gICAgICAgICAgICBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1tpXVttXVswXSxcclxuICAgICAgICAgICAgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbaV1bbV1bMV1cclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgaG9sZXMucHVzaCh7IHBvc2l0aW9uczogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShhcnJheSkgfSlcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uID0gbmV3IENlc2l1bS5Qb2x5Z29uR3JhcGhpY3Moe1xyXG4gICAgICAgIGhpZXJhcmNoeToge1xyXG4gICAgICAgICAgcG9zaXRpb25zOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KG91dGVySG9sZSksXHJcbiAgICAgICAgICBob2xlczogaG9sZXNcclxuICAgICAgICB9LFxyXG4gICAgICAgIG1hdGVyaWFsOiBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKHRoaXMub3B0aW9ucy5leHRlbmRDb2xvcilcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24gPSB1bmRlZmluZWRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHJlc2V0KCkge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICB0aGlzLm5hbWUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5uYW1lXHJcbiAgICB0aGlzLmNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuY29sb3JcclxuICAgIHRoaXMubGluZVdpZHRoID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMud2lkdGhcclxuICAgIHRoaXMubGluZVR5cGUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy50eXBlXHJcbiAgICB0aGlzLm5vc2VUb1RhaWwgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5ub3NlVG9UYWlsXHJcbiAgICB0aGlzLmV4dGVuZCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmV4dGVuZFxyXG4gICAgdGhpcy5leHRlbmRXaWR0aCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmV4dGVuZFdpZHRoXHJcbiAgICB0aGlzLmV4dGVuZENvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuZXh0ZW5kQ29sb3JcclxuICAgIHRoaXMubGFiZWxTaG93ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuc2hvd1xyXG4gICAgdGhpcy5sYWJlbENvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuY29sb3JcclxuICAgIHRoaXMubGFiZWxGb250U2l6ZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgICB0aGlzLmxhYmVsRm9udEZhbWlseSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRGYW1pbHlcclxuICAgIHRoaXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2VcclxuICAgIHRoaXMubGFiZWxOZWFyID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubmVhclxyXG4gICAgdGhpcy5sYWJlbEZhciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZhclxyXG4gICAgdGhpcy5sYWJlbExpbmVXaWR0aCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gICAgdGhpcy5sYWJlbFBpeGVsT2Zmc2V0ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXRcclxuICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5saW5lQ29sb3JcclxuICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXVxyXG4gICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXVxyXG4gICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgIC8vIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgIC8vIHRoaXMuYXR0cmlidXRlQ2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudFxyXG4gICAgLy8gdGhpcy5hdHRyaWJ1dGVHb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG4gICAgdGhpcy5yb3RhdGUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5yb3RhdGVcclxuICAgIHRoaXMuc3BlZWQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5zcGVlZFxyXG4gICAgLy8gdGhpcy5kYXNoU2l6ZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmRhc2hTaXplXHJcbiAgICB0aGlzLnNwYWNlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc3BhY2VcclxuICAgIC8vIHRoaXMuY2FtZXJhU2VsZWN0ICYmIHRoaXMuY2FtZXJhU2VsZWN0KClcclxuICAgIC8vIHRoaXMuZ29vZHNTZWxlY3QgJiYgdGhpcy5nb29kc1NlbGVjdCgpXHJcblxyXG4gICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5vcHRpb25zLmhlaWdodE1vZGVcclxuXHJcbiAgICAvLyBsZXQgaGVpZ2h0XHJcbiAgICAvLyBpZiAodGhpcy5ncm91bmQpIHtcclxuICAgIC8vICAgaGVpZ2h0ID0gYXdhaXQgdGhhdC5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgIC8vICAgICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgLy8gICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgIC8vICAgfSlcclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgIGhlaWdodCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAvLyAgIGxuZzogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAvLyAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAvLyAgIGFsdDogaGVpZ2h0XHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24ubG5nLFxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24ubGF0LFxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0XHJcbiAgICAvLyBdXHJcbiAgfVxyXG5cclxuICBfYWRkTGluaygpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGlua19hZGQnKVswXVxyXG4gICAgICAgIC52YWx1ZVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50LnB1c2goe1xyXG4gICAgICAgIG5hbWU6ICfpk77mjqUnLFxyXG4gICAgICAgIHVybDogdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICdsaW5rX2FkZCdcclxuICAgICAgICApWzBdLnZhbHVlXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgJ2xpbmtfYWRkJ1xyXG4gICAgICApWzBdLnZhbHVlID0gJydcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuRGlhbG9nLmNsaWNrQWRkTGluayAmJiB0aGlzLkRpYWxvZy5jbGlja0FkZExpbmsoKVxyXG4gICAgICAvLyBsZXQgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICAvLyBpbnB1dC50eXBlID0gXCJmaWxlXCI7XHJcbiAgICAgIC8vIGlucHV0LmFjY2VwdCA9IFwiLm1wNCwgLnBkZlwiXHJcbiAgICAgIC8vIGlucHV0LmNsaWNrKClcclxuICAgICAgLy8gaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgIC8vICAgaWYgKGlucHV0LnZhbHVlKSB7XHJcbiAgICAgIC8vICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5wdXNoKHtcclxuICAgICAgLy8gICAgICAgbmFtZTogJ+mTvuaOpScsXHJcbiAgICAgIC8vICAgICAgIHVybDogaW5wdXQudmFsdWVcclxuICAgICAgLy8gICAgIH0pXHJcbiAgICAgIC8vICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfSlcclxuICAgIH1cclxuICB9XHJcbiAgYWRkQXR0cmlidXRlTGluayhsaW5rKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5wdXNoKHtcclxuICAgICAgbmFtZTogJ+mTvuaOpScsXHJcbiAgICAgIHVybDogbGlua1xyXG4gICAgfSlcclxuICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgfVxyXG5cclxuICAvLyBfYWRkUnIoKSB7XHJcbiAgLy8gICBpZiAoXHJcbiAgLy8gICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgJ3ZyX2FkZCdcclxuICAvLyAgICAgKVswXS52YWx1ZVxyXG4gIC8vICAgKSB7XHJcbiAgLy8gICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5wdXNoKHtcclxuICAvLyAgICAgICBuYW1lOiAn5YWo5pmv5Zu+JyxcclxuICAvLyAgICAgICB1cmw6IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgICAndnJfYWRkJ1xyXG4gIC8vICAgICAgIClbMF0udmFsdWVcclxuICAvLyAgICAgfSlcclxuICAvLyAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAvLyAgICAgICAndnJfYWRkJ1xyXG4gIC8vICAgICApWzBdLnZhbHVlID0gJydcclxuICAvLyAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgdGhpcy5EaWFsb2cuY2xpY2tBZGRWciAmJiB0aGlzLkRpYWxvZy5jbGlja0FkZFZyKClcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGFkZEF0dHJpYnV0ZVJyKHZyKSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQucHVzaCh7XHJcbiAgLy8gICAgIG5hbWU6ICflhajmma/lm74nLFxyXG4gIC8vICAgICB1cmw6IHZyXHJcbiAgLy8gICB9KVxyXG4gIC8vICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vIH1cclxuXHJcbiAgLyoqXHJcbiAgICog6aOe5YiwXHJcbiAgICovXHJcbiAgYXN5bmMgZmx5VG8ob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBjbG9zZVJvdGF0ZUFyb3VuZCh0aGlzLnNkaylcclxuICAgIGNsb3NlVmlld0ZvbGxvdyh0aGlzLnNkaylcclxuXHJcbiAgICBzZXRBY3RpdmVWaWV3ZXIoMClcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldykge1xyXG4gICAgICBsZXQgb3JpZW50YXRpb24gPSB7XHJcbiAgICAgICAgaGVhZGluZzogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLmhlYWRpbmcgfHwgMC4wKSxcclxuICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHx8IC02MC4wKSxcclxuICAgICAgICByb2xsOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB8fCAwLjApXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBsbmcgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZ1xyXG4gICAgICBsZXQgbGF0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXRcclxuICAgICAgbGV0IGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0XHJcbiAgICAgIGxldCBkZXN0aW5hdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGxuZywgbGF0LCBhbHQpXHJcblxyXG4gICAgICBsZXQgcG9zaXRpb24gPSB7IGxuZzogMCwgbGF0OiAwIH1cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb24gfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXSB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmNlbnRlcikge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMuY2VudGVyIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc3RhcnQpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnN0YXJ0IH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdsbmcnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24ubG5nID0gdGhpcy5vcHRpb25zLmxuZ1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdsYXQnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24ubGF0ID0gdGhpcy5vcHRpb25zLmxhdFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdhbHQnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24uYWx0ID0gdGhpcy5vcHRpb25zLmFsdFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyDlpoLmnpzmsqHmnInpq5jluqblgLzvvIzliJnojrflj5bntKfotLTpq5jluqborqHnrpdcclxuICAgICAgaWYgKCFwb3NpdGlvbi5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICBwb3NpdGlvbi5hbHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQocG9zaXRpb24pXHJcbiAgICAgIH1cclxuICAgICAgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmcgKyBwb3NpdGlvbi5sbmdcclxuICAgICAgbGF0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXQgKyBwb3NpdGlvbi5sYXRcclxuICAgICAgYWx0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQgKyBwb3NpdGlvbi5hbHRcclxuICAgICAgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmZseVRvKHtcclxuICAgICAgICBkZXN0aW5hdGlvbjogZGVzdGluYXRpb24sXHJcbiAgICAgICAgb3JpZW50YXRpb246IG9yaWVudGF0aW9uXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHBvc2l0aW9uQXJyYXkgPSBbXVxyXG4gICAgICBsZXQgaGVpZ2h0XHJcbiAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaChhLngsIGEueSwgYS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBoZWlnaHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXSlcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgYSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgICAgIGhlaWdodCArIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgcG9zaXRpb25BcnJheS5wdXNoKGEueCwgYS55LCBhLnopXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgIGhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodCh0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdKVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBhID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgICAgaGVpZ2h0XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgcG9zaXRpb25BcnJheS5wdXNoKGEueCwgYS55LCBhLnopXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBCb3VuZGluZ1NwaGVyZSA9IENlc2l1bS5Cb3VuZGluZ1NwaGVyZS5mcm9tVmVydGljZXMocG9zaXRpb25BcnJheSlcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUb0JvdW5kaW5nU3BoZXJlKEJvdW5kaW5nU3BoZXJlLCB7XHJcbiAgICAgICAgb2Zmc2V0OiBvcHRpb25zLm9yaWVudGF0aW9uIHx8IHtcclxuICAgICAgICAgIGhlYWRpbmc6IENlc2l1bS5NYXRoLnRvUmFkaWFucygwLjApLFxyXG4gICAgICAgICAgcGl0Y2g6IENlc2l1bS5NYXRoLnRvUmFkaWFucygtOTAuMCksXHJcbiAgICAgICAgICByb2xsOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoMC4wKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOaJk+W8gOWvjOaWh+acrOahhlxyXG4gICAqL1xyXG4gIG9wZW5SaWNoVGV4dEVkaXRvcihlKSB7XHJcbiAgICAvLyB2YXIgdWUgPSBVRS5nZXRFZGl0b3IoJ2FwcCcpO1xyXG4gICAgcmljaFRleHQub3BlbihcclxuICAgICAgdGhpcy5vcHRpb25zLmlkLFxyXG4gICAgICB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgdGhpcy5vcHRpb25zLnJpY2hUZXh0Q29udGVudFxyXG4gICAgKVxyXG4gICAgcmljaFRleHQucHJpbWFyeUNhbGxCYWNrID0gY29udGVudCA9PiB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5yaWNoVGV4dENvbnRlbnQgPSBjb250ZW50XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBzdGF0aWMgbm9kZUVkaXQyKHRoYXQsIGNiID0gKCkgPT4geyB9KSB7XHJcbiAgLy8gICB0aGF0LnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgLy8gICBpZiAoWUouTWVhc3VyZS5HZXRNZWFzdXJlU3RhdHVzKCkpIHtcclxuICAvLyAgICAgY2IoJ+S4iuS4gOasoea1i+mHj+acque7k+adnycpXHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXModHJ1ZSlcclxuICAvLyAgICAgdGhhdC50aXAgPSBuZXcgTW91c2VUaXAoJ+ivt+mAieaLqeS4gOS4qumhtueCue+8jOWPs+mUruWPlua2iCcsIHRoYXQuc2RrKVxyXG4gIC8vICAgICB0aGF0LmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhhdC5zZGspXHJcbiAgLy8gICAgIHRoYXQubm9kZVBvaW50cyA9IFtdXHJcbiAgLy8gICAgIGxldCBzZWxlY3RQb2ludFxyXG4gIC8vICAgICBsZXQgb3JpZ2luYWxQb3NpdGlvblxyXG4gIC8vICAgICBsZXQgbmV3cG9zaXRpb25zID0gW11cclxuICAvLyAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2goXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAvLyAgICAgICApXHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgbmV3cG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSlcclxuXHJcbiAgLy8gICAgIHRoYXQuZXZlbnQubW91c2VfbGVmdCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gIC8vICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gIC8vICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgLy8gICAgICAgICAgIHRoYXQuc2RrLnZpZXdlclxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgb3JpZ2luYWxQb3NpdGlvbiA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdXHJcbiAgLy8gICAgICAgICBsZXQgZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgLy8gICAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAvLyAgICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gIC8vICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxuZyxcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sYXQsXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0uYWx0XHJcbiAgLy8gICAgICAgICAgICksXHJcbiAgLy8gICAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gIC8vICAgICAgICAgICAgIGltYWdlOiB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gIC8vICAgICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAvLyAgICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gIC8vICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgICB0aGF0Lm5vZGVQb2ludHMuc3BsaWNlKHNlbGVjdFBvaW50LmluZGV4LCAwLCBlbnRpdHkpXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLnNwbGljZShcclxuICAvLyAgICAgICAgICAgc2VsZWN0UG9pbnQuaW5kZXgsXHJcbiAgLy8gICAgICAgICAgIDAsXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoYXQucmVuZXdQb3NpdGlvbnModGhhdC5vcHRpb25zLnBvc2l0aW9ucylcclxuICAvLyAgICAgICAgIHRoYXQucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9IHRoYXQuY29tcHV0ZURpc3RhbmNlMihcclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucyxcclxuICAvLyAgICAgICAgICAgMixcclxuICAvLyAgICAgICAgICAgdGhhdC5ncm91bmRcclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIHRoYXQubGVuZ3RoVW5pdCA9IHRoYXQub3B0aW9uc1snbGVuZ3RoLXVuaXQnXVxyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICB2YXIgcGljayA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5waWNrKG1vdmVtZW50LnBvc2l0aW9uKVxyXG4gIC8vICAgICAgICAgaWYgKFxyXG4gIC8vICAgICAgICAgICBwaWNrICYmXHJcbiAgLy8gICAgICAgICAgIHBpY2suaWQgJiZcclxuICAvLyAgICAgICAgICAgcGljay5pZC5uYW1lICYmXHJcbiAgLy8gICAgICAgICAgIHBpY2suaWQubmFtZSA9PT0gJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnXHJcbiAgLy8gICAgICAgICApIHtcclxuICAvLyAgICAgICAgICAgc2VsZWN0UG9pbnQgPSBwaWNrLmlkXHJcbiAgLy8gICAgICAgICAgIHRoYXQubm9kZVBvaW50cy5zcGxpY2UocGljay5pZC5pbmRleCwgMSlcclxuICAvLyAgICAgICAgICAgdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZShwaWNrLmlkKVxyXG4gIC8vICAgICAgICAgICB0aGF0LnRpcC5zZXRfdGV4dCgn5bem6ZSu5byA5aeL77yM5Y+z6ZSu57uT5p2f77yMQ1RSTCvlj7PplK7mkqTplIAnKVxyXG4gIC8vICAgICAgICAgICBvcmlnaW5hbFBvc2l0aW9uID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAvLyAgICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5zZGsudmlld2VyXHJcbiAgLy8gICAgICAgICAgIClcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pXHJcblxyXG4gIC8vICAgICB0aGF0LmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IG9yaWdpbmFsUG9zaXRpb25cclxuICAvLyAgICAgICAgIGNiKG51bGwsIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIGxldCBwb3NpdGlvbnMgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zXHJcbiAgLy8gICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gIC8vICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2goXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uc1tpXS5hbHRcclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgbmV3cG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgLy8gICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgLy8gICAgICAgKVxyXG4gIC8vICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoYXQubm9kZVBvaW50c1tpXSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgdGhhdC5ub2RlUG9pbnRzID0gW11cclxuICAvLyAgICAgICB0aGF0LmV2ZW50LmRlc3Ryb3koKVxyXG4gIC8vICAgICAgIHRoYXQudGlwLmRlc3Ryb3koKVxyXG4gIC8vICAgICB9KVxyXG5cclxuICAvLyAgICAgdGhhdC5ldmVudC5tb3VzZV9tb3ZlKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgLy8gICAgICAgICAgIGNhcnRlc2lhbixcclxuICAvLyAgICAgICAgICAgdGhhdC5zZGsudmlld2VyXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gIC8vICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gIC8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gIC8vICAgICAgICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICAgICAgcG9zaXRpb25zW2ldLmxhdCxcclxuICAvLyAgICAgICAgICAgICBwb3NpdGlvbnNbaV0uYWx0XHJcbiAgLy8gICAgICAgICAgIClcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIG5ld3Bvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gIC8vICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBpZiAodGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGggPT09IDEpIHtcclxuICAvLyAgICAgICAgICAgdGhhdC5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gIC8vICAgICAgICAgICBdXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAvLyAgICAgICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gIC8vICAgICAgICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgLy8gICAgICAgICAgICAgYWx0OiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHRoYXQudGlwLnNldFBvc2l0aW9uKFxyXG4gIC8vICAgICAgICAgY2FydGVzaWFuLFxyXG4gIC8vICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAvLyAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAvLyAgICAgICApXHJcbiAgLy8gICAgIH0pXHJcblxyXG4gIC8vICAgICB0aGF0LmV2ZW50Lm1vdXNlX3JpZ2h0X2tleWJvYXJkX2N0cmwoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAvLyAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMucG9wKClcclxuICAvLyAgICAgICAgIHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUoXHJcbiAgLy8gICAgICAgICAgIHRoYXQubm9kZVBvaW50c1t0aGF0Lm5vZGVQb2ludHMubGVuZ3RoIC0gMV1cclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIHRoYXQubm9kZVBvaW50cy5wb3AoKVxyXG4gIC8vICAgICAgICAgaWYgKHNlbGVjdFBvaW50LmluZGV4ID09PSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgICBpZiAodGhhdC5ub2RlUG9pbnRzW3NlbGVjdFBvaW50LmluZGV4IC0gMV0pIHtcclxuICAvLyAgICAgICAgICAgICBzZWxlY3RQb2ludCA9IHRoYXQubm9kZVBvaW50c1tzZWxlY3RQb2ludC5pbmRleCAtIDFdXHJcbiAgLy8gICAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgICAgc2VsZWN0UG9pbnQuaW5kZXggPSAwXHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pXHJcblxyXG4gIC8vICAgICB0aGF0LmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gIC8vICAgICAgIHJldHVybiBuZXdwb3NpdGlvbnNcclxuICAvLyAgICAgfSwgZmFsc2UpXHJcblxyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICBsZXQgZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgLy8gICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgLy8gICAgICAgICBpbmRleDogaSxcclxuICAvLyAgICAgICAgIHBvc2l0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gIC8vICAgICAgICAgKSxcclxuICAvLyAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gIC8vICAgICAgICAgICBpbWFnZTogdGhhdC5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvcG9pbnQucG5nJyxcclxuICAvLyAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gIC8vICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gIC8vICAgICAgICAgICBkaXNhYmxlRGVwdGhUZXN0RGlzdGFuY2U6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pXHJcbiAgLy8gICAgICAgdGhhdC5ub2RlUG9pbnRzLnB1c2goZW50aXR5KVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBub2RlRWRpdChjZCkge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpKSB7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICB0aGlzLnRpcCA9IG5ldyBNb3VzZVRpcCgn6K+36YCJ5oup5LiA5Liq6aG254K577yM5Y+z6ZSu5Y+W5raIJywgdGhpcy5zZGspXHJcbiAgICAgIHRoaXMuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGlzLnNkaylcclxuICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0ID0gbmV3IENvbnRyb2xsZXIodGhpcy5zZGspXHJcblxyXG4gICAgICB0aGlzLl9ub2RlRWRpdENhbGxiYWNrID0gY2RcclxuICAgICAgbGV0IHNlbGVjdFBvaW50XHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHZhciBwaWNrID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLnBpY2sobW92ZW1lbnQucG9zaXRpb24pXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgcGljayAmJlxyXG4gICAgICAgICAgcGljay5pZCAmJlxyXG4gICAgICAgICAgcGljay5pZC5uYW1lICYmXHJcbiAgICAgICAgICBwaWNrLmlkLm5hbWUgPT09ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50J1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgc2VsZWN0UG9pbnQgPSBwaWNrLmlkXHJcbiAgICAgICAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QucG9zaXRpb24gPVxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gICAgICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0LmVkaXRUcmFuc2xhdGlvbmFsKClcclxuICAgICAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0LmNvbnRyb2xsZXJDYWxsQmFjayA9IHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RQb2ludC5pbmRleCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24ubG5nLFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5hbHRcclxuICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICAgICAgbG5nOiBwYXJhbXMucG9zaXRpb24ubG5nLFxyXG4gICAgICAgICAgICAgICAgbGF0OiBwYXJhbXMucG9zaXRpb24ubGF0LFxyXG4gICAgICAgICAgICAgICAgYWx0OiBwYXJhbXMucG9zaXRpb24uYWx0XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gcGFyYW1zLnBvc2l0aW9uXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubG5nICYmICh0aGlzLl9lbG1zLmxuZ1tzZWxlY3RQb2ludC5pbmRleF0uaW5uZXJIVE1MID0gcGFyYW1zLnBvc2l0aW9uLmxuZy50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxuZ0lucHV0ICYmICh0aGlzLl9lbG1zLmxuZ0lucHV0W3NlbGVjdFBvaW50LmluZGV4XS52YWx1ZSA9IHBhcmFtcy5wb3NpdGlvbi5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sYXQgJiYgKHRoaXMuX2VsbXMubGF0W3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSBwYXJhbXMucG9zaXRpb24ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubGF0SW5wdXQgJiYgKHRoaXMuX2VsbXMubGF0SW5wdXRbc2VsZWN0UG9pbnQuaW5kZXhdLnZhbHVlID0gcGFyYW1zLnBvc2l0aW9uLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmFsdCAmJiAodGhpcy5fZWxtcy5hbHRbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHBhcmFtcy5wb3NpdGlvbi5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5hbHRJbnB1dCAmJiAodGhpcy5fZWxtcy5hbHRJbnB1dFtzZWxlY3RQb2ludC5pbmRleF0udmFsdWUgPSBwYXJhbXMucG9zaXRpb24uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIHNlbGVjdFBvaW50LnBvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24ubGF0LFxyXG4gICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5hbHRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLm5vZGVQb2ludHNbaV0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICAgICAgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgICB0aGlzLnRpcCA9IG51bGxcclxuICAgICAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QuZGVzdHJveSgpXHJcblxyXG4gICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgICAgIHRoaXMuX25vZGVFZGl0Q2FsbGJhY2sgPSBudWxsXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB0aGlzLnRpcC5zZXRQb3NpdGlvbihcclxuICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgICAgICAgKVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCAoKSA9PiB7XHJcbiAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgdGhpcy5fbm9kZUVkaXRDYWxsYmFjayh0aGlzLm9wdGlvbnMucG9zaXRpb25zLCB0aGlzLmxlbmd0aEJ5TWV0ZXIpXHJcbiAgICAgICAgcmV0dXJuIENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgIH0sIGZhbHNlKVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGVudGl0eSA9IHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAgICAgICAgICAgaW1hZ2U6IHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICAgICAgICAgIGNvbG9yOiBDZXNpdW0uQ29sb3IuV0hJVEUud2l0aEFscGhhKDAuOTkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLm5vZGVQb2ludHMucHVzaChlbnRpdHkpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlTm9kZUVkaXQoKSB7XHJcbiAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QgJiYgdGhpcy5Db250cm9sbGVyT2JqZWN0LmRlc3Ryb3koKVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCA9IG51bGxcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgIH1cclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICB0aGlzLl9ub2RlRWRpdENhbGxiYWNrID0gbnVsbFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5Yig6ZmkXHJcbiAgICovXHJcbiAgYXN5bmMgcmVtb3ZlKCkge1xyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLmxhYmVsICYmIHRoaXMubGFiZWwucmVtb3ZlKClcclxuICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5lbnRpdHkpXHJcbiAgICB0aGlzLmVudGl0eSA9IG51bGxcclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgIXRoaXMuX0RpYWxvZ09iamVjdC5pc0Rlc3Ryb3kpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5zZGsucmVtb3ZlSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZClcclxuICAgIGF3YWl0IHN5bmNEYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgfVxyXG5cclxuICAvKipAZGVzYyDmiZPlvIDlubPnp7vlip/og71cclxuICAgKlxyXG4gICAqIEBtZW1iZXJPZiBTb3VyY2VcclxuICAgKiBAcGFyYW0gc3RhdHVzIHtib29sZWFufVxyXG4gICAqXHJcbiAgICogKi9cclxuICBzZXQgcG9zaXRpb25FZGl0aW5nKHN0YXR1cykge1xyXG4gICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpIHx8ICF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcgPSBzdGF0dXNcclxuICAgIGlmIChzdGF0dXMgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICB0aGlzLnRpcCA9IG5ldyBNb3VzZVRpcCgn54K55Ye76byg5qCH5bem6ZSu56Gu6K6k77yM5Y+z6ZSu5Y+W5raIJywgdGhpcy5zZGspXHJcbiAgICAgIHRoaXMubGFiZWwgJiZcclxuICAgICAgICAodGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhcclxuICAgICAgICAgIGByZ2JhKDI1NSwyNTUsMjU1LDAuOSlgXHJcbiAgICAgICAgKSlcclxuICAgICAgdGhpcy5waWNraW5nID0gZmFsc2VcclxuICAgICAgbGV0IHBvc2l0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLnBvc2l0aW9ucykpXHJcbiAgICAgIGxldCBwb3NpdGlvbnMyID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAvLyBsZXQgcG9zaXRpb25zMiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocG9zaXRpb25zKSlcclxuICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vICAgbGV0IGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbnMyW2ldLmxuZywgcG9zaXRpb25zMltpXS5sYXQpKVxyXG4gICAgICAvLyAgIHBvc2l0aW9uczJbaV0gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgLy8gICAgIHBvc2l0aW9uczJbaV0ubG5nLFxyXG4gICAgICAvLyAgICAgcG9zaXRpb25zMltpXS5sYXQsXHJcbiAgICAgIC8vICAgICBOdW1iZXIoKHBvc2l0aW9uczJbaV0uYWx0ICsgTnVtYmVyKGhlaWdodCkpLnRvRml4ZWQoMikpXHJcbiAgICAgIC8vICAgKVxyXG4gICAgICAvLyB9XHJcbiAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgcG9zaXRpb25zOiBbLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uc11cclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHBvc2l0aW9uc1tpXSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgcG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICBwb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBjZW50ZXIgPSBwb3NpdGlvbnNbTWF0aC5mbG9vcihwb3NpdGlvbnMubGVuZ3RoIC8gMildXHJcbiAgICAgIGxldCBkaXNwYXJpdHkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGRpc3Bhcml0eS5wdXNoKHtcclxuICAgICAgICAgIHg6IGNlbnRlci54IC0gcG9zaXRpb25zW2ldLngsXHJcbiAgICAgICAgICB5OiBjZW50ZXIueSAtIHBvc2l0aW9uc1tpXS55LFxyXG4gICAgICAgICAgejogY2VudGVyLnogLSBwb3NpdGlvbnNbaV0uelxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgIGxldCBuZXdwb3NpdGlvbnM4NCA9IFtdXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgbmV3cG9zaXRpb25zODQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgbmV3UCA9IHtcclxuICAgICAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0uelxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHBvczg0ID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAgICAgICAgICAgbmV3UCxcclxuICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICBwb3M4NC5hbHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgLy8gbGV0IGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3M4NC5sbmcsIHBvczg0LmxhdCkpXHJcbiAgICAgICAgICAvLyBwb3M4NC5hbHQgPSBOdW1iZXIoKHBvczg0LmFsdCArIE51bWJlcihoZWlnaHQpKS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgLy8gbmV3UCA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgLy8gICBwb3M4NC5sbmcsXHJcbiAgICAgICAgICAvLyAgIHBvczg0LmxhdCxcclxuICAgICAgICAgIC8vICAgcG9zODQuYWx0XHJcbiAgICAgICAgICAvLyApXHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaChuZXdQKVxyXG4gICAgICAgICAgbmV3cG9zaXRpb25zODQucHVzaChwb3M4NClcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uODQgPSBuZXdwb3NpdGlvbnM4NFswXVxyXG4gICAgICAgIHBvc2l0aW9uczIgPSB0aGlzLnJlbmV3UG9zaXRpb25zKG5ld3Bvc2l0aW9uczg0KVxyXG4gICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbcG9zaXRpb244NC5sbmcsIHBvc2l0aW9uODQubGF0LCBwb3NpdGlvbjg0LmFsdF1cclxuICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICBsbmc6IHBvc2l0aW9uODQubG5nLFxyXG4gICAgICAgICAgbGF0OiBwb3NpdGlvbjg0LmxhdCxcclxuICAgICAgICAgIGFsdDogcG9zaXRpb244NC5hbHRcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi54LFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgIClcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgbmV3cG9zaXRpb25zODQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgbmV3UCA9IHtcclxuICAgICAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0uelxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHBvczg0ID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAgICAgICAgICAgbmV3UCxcclxuICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICBwb3M4NC5hbHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgbmV3cG9zaXRpb25zLnB1c2gobmV3UClcclxuICAgICAgICAgIG5ld3Bvc2l0aW9uczg0LnB1c2gocG9zODQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwb3NpdGlvbnNMbmdMYXQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3cG9zaXRpb25zODQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBwb3NpdGlvbiA9IG5ld3Bvc2l0aW9uczg0W2ldXHJcbiAgICAgICAgICBwb3NpdGlvbnNMbmdMYXQucHVzaChwb3NpdGlvbilcclxuXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxuZyAmJiAodGhpcy5fZWxtcy5sbmdbaV0uaW5uZXJIVE1MID0gcG9zaXRpb24ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxuZ0lucHV0ICYmICh0aGlzLl9lbG1zLmxuZ0lucHV0W2ldLnZhbHVlID0gcG9zaXRpb24ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhdCAmJiAodGhpcy5fZWxtcy5sYXRbaV0uaW5uZXJIVE1MID0gcG9zaXRpb24ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhdElucHV0ICYmICh0aGlzLl9lbG1zLmxhdElucHV0W2ldLnZhbHVlID0gcG9zaXRpb24ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmFsdCAmJiAodGhpcy5fZWxtcy5hbHRbaV0uaW5uZXJIVE1MID0gcG9zaXRpb24uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmFsdElucHV0ICYmICh0aGlzLl9lbG1zLmFsdElucHV0W2ldLnZhbHVlID0gcG9zaXRpb24uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zID0gcG9zaXRpb25zTG5nTGF0XHJcbiAgICAgICAgdGhpcy5wcmV2aW91cy5wb3NpdGlvbnMgPSBwb3NpdGlvbnNMbmdMYXRcclxuXHJcbiAgICAgICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zTG5nTGF0ID0gcG9zaXRpb25zTG5nTGF0XHJcbiAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMsICgpPT57XHJcbiAgICAgICAgICBpZih0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjaykge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjaygpXHJcbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrID0gbnVsbFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgICAgICAgKVxyXG4gICAgICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX2VuZCgoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICAgIGxldCBwb3MgPSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgICAgICAgICAgeDogKG1vdmVtZW50LnBvc2l0aW9uMS54ICsgbW92ZW1lbnQucG9zaXRpb24yLngpIC8gMixcclxuICAgICAgICAgICAgICB5OiAobW92ZW1lbnQucG9zaXRpb24xLnkgKyBtb3ZlbWVudC5wb3NpdGlvbjIueSkgLyAyXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlbmRUaW1lIC0gc3RhcnRUaW1lID49IDUwMCkge1xyXG4gICAgICAgICAgICAvLyDplb/mjInlj5bmtohcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnRFdmVudChwb3MsIGNhcnRlc2lhbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgICBwb3NpdGlvbnMyXHJcbiAgICAgICAgKVxyXG4gICAgICB9LCBmYWxzZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5sYWJlbCB8fCAhdGhpcy5sYWJlbC5lbnRpdHkpIHtcclxuICAgICAgICB0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQuY29sb3IgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKFxyXG4gICAgICAgICAgYHJnYmEoMjU1LDI1NSwyNTUsMSlgXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucGlja2luZyA9IHRydWVcclxuICAgICAgaWYgKHRoaXMuZXZlbnQpIHtcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgKVxyXG4gICAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5WzJdXHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICAgIGxuZzogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICAgIGFsdDogZnJvbURlZ3JlZXNBcnJheVsyXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgXVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgcG9zaXRpb25FZGl0aW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmdcclxuICB9XHJcbiAgb3BlblBvc2l0aW9uRWRpdGluZyhjZCkge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSB0cnVlXHJcbiAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjayA9IGNkXHJcbiAgfVxyXG4gIFxyXG4gIGdldCBsZW5ndGhDaGFuZ2VDYWxsQmFjaygpIHtcclxuICAgIHJldHVybiB0aGlzLl9sZW5ndGhDaGFuZ2VDYWxsQmFja1xyXG4gIH1cclxuXHJcbiAgc2V0IGxlbmd0aENoYW5nZUNhbGxCYWNrIChjZCkge1xyXG4gICAgdGhpcy5fbGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgPSBjZFxyXG4gIH1cclxuXHJcbiAgc2V0RElWKG9wdGlvbnMgPSB7IGRvbWlkOiAnJywgeDogMTAsIHk6IDEwIH0pIHtcclxuICAgIG9wdGlvbnMueCA9IG9wdGlvbnMueCB8fCBvcHRpb25zLnggPT09IDAgPyBvcHRpb25zLnggOiAxMFxyXG4gICAgb3B0aW9ucy55ID0gb3B0aW9ucy55IHx8IG9wdGlvbnMueSA9PT0gMCA/IG9wdGlvbnMueSA6IDEwXHJcblxyXG4gICAgbGV0IHBvaW50cyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcG9pbnRzLnB1c2goW1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0XHJcbiAgICAgIF0pXHJcbiAgICB9XHJcbiAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhwb2ludHMpXHJcbiAgICBsZXQgbGVuZ3RoID0gdHVyZi5sZW5ndGgobGluZSwgeyB1bml0czogJ2tpbG9tZXRlcnMnIH0pXHJcbiAgICBsZXQgc2xpY2VkID0gdHVyZi5saW5lU2xpY2VBbG9uZyhsaW5lLCAwLCBsZW5ndGggLyAyLCB7XHJcbiAgICAgIHVuaXRzOiAna2lsb21ldGVycydcclxuICAgIH0pXHJcblxyXG4gICAgbGV0IHNpdGVJbmZvRG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3B0aW9ucy5kb21pZClcclxuICAgIGxldCBzaXRlSW5mb1Bvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgIC4uLnNsaWNlZC5nZW9tZXRyeS5jb29yZGluYXRlc1tzbGljZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV1cclxuICAgIClcclxuICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS5wb3N0UmVuZGVyLmFkZEV2ZW50TGlzdGVuZXIocGVyY2VudGFnZSA9PiB7XHJcbiAgICAgIC8v6L2s5o2i5Yiw5bGP5bmV5Z2Q5qCHXHJcbiAgICAgIGlmIChcclxuICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snIHx8XHJcbiAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJydcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHdpbnBvcyA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jYXJ0ZXNpYW5Ub0NhbnZhc0Nvb3JkaW5hdGVzKFxyXG4gICAgICAgICAgc2l0ZUluZm9Qb3NpdGlvblxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAod2lucG9zKSB7XHJcbiAgICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5sZWZ0ID0gKHdpbnBvcy54ICsgb3B0aW9ucy54KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUudG9wID0gKHdpbnBvcy55ICsgb3B0aW9ucy55KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgQ3VydmVsaW5lT2JqZWN0XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBSUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFwQkE7QUFBQTtBQWtCQTtBQUdBO0FBQ0E7QUFDQTtBQVFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBakJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF6QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtEQTtBQXpEQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBVkE7QUFBQTtBQVFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFsQkE7QUFBQTtBQUFBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBcUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQTtBQXNEQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQU1BO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQU9BO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdEhBO0FBQUE7QUFBQTtBQXdIQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQXh0QkE7QUFBQTtBQUFBO0FBQUE7QUEwdEJBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUdBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBekRBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNERBO0FBSUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUVBO0FBeUJBO0FBQUE7QUF0QkE7QUFDQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQTFHQTtBQUFBO0FBQUE7QUFBQTtBQTRHQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFaQTtBQUFBO0FBQUE7QUFBQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFBQTtBQUFBO0FBb09BO0FBQ0E7QUFBQTtBQS9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFJQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEvOURBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUNBO0FBZUE7QUFBQTtBQVpBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSEE7QUFBQTtBQUFBO0FBT0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFIQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQXZEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBZzJEQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Obj/Base/CurvelineObject/index.js\n"); /***/ }), @@ -2435,7 +2435,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _bab /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/PolylineObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _eventBinding__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./eventBinding */ \"./src/Obj/Base/PolylineObject/eventBinding.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Controller_index__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../Controller/index */ \"./src/Controller/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * @description 线\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar PolylineObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 折线\r\n * @param options {object} 线属性\r\n * @param options.name{string} 名称\r\n * @param options.width=3{number} 线宽\r\n * @param options.color=#ff0000 {string} 颜色\r\n * @param options.type=0 {number} 材质类型 0-实线 1-虚线 2-泛光...\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对高度;2:依附模式)\r\n * @param options.noseToTail=false {boolean} 首尾相连\r\n * @param options.smooth=false {boolean} 线段圆滑\r\n * @param options.extend=false {boolean} 线缓冲\r\n * @param options.extendWidth=10 {number} 线缓冲宽度\r\n * @param options.extendColor=rgba(255,255,80,0.3) {number} 线缓冲颜色\r\n * @param options.show=true {boolean} 显隐\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * \r\n * \r\n * @param options.noseToTail=false {boolean} 是否首尾相连\r\n * \r\n * \r\n * \r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {string} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * \r\n * \r\n * @param _Dialog {object} 弹框事件\r\n * @param _Dialog.confirmCallBack {function} 弹框确认时的回调\r\n * */\n function PolylineObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, PolylineObject);\n _this2 = _callSuper(this, PolylineObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.width = options.width || options.width === 0 ? options.width : 3;\n _this2.options.color = options.color || '#ff0000';\n _this2.options.type = options.type ? Number(options.type) : 0;\n _this2.options.noseToTail = options.noseToTail || false;\n _this2.options.smooth = options.smooth || false;\n _this2.options.extend = options.extend || false;\n _this2.options.rotate = options.rotate || options.rotate === false ? options.rotate : true;\n _this2.options.space = options.space || 1;\n _this2.options.speed = options.speed || 10;\n // this.options.dashSize = options.dashSize || 0.03\n _this2.options.wordsName = options.wordsName || '空间长度';\n _this2.options.extendWidth = options.extendWidth || options.extendWidth === 0 ? options.extendWidth : 10;\n _this2.options.extendColor = options.extendColor || 'rgba(255,255,80,0.3)';\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2._elms = [];\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n // this.options.attribute.camera = this.options.attribute.camera || {}\n // this.options.attribute.camera.content =\n // this.options.attribute.camera.content || []\n // this.options.attribute.vr = this.options.attribute.vr || {}\n // this.options.attribute.vr.content =\n // this.options.attribute.vr.content || []\n // this.options.attribute.goods = this.options.attribute.goods || {}\n // this.options.attribute.goods.content =\n // this.options.attribute.goods.content || []\n\n delete _this2.options.attribute.camera;\n delete _this2.options.attribute.vr;\n delete _this2.options.attribute.goods;\n _this2.operate = {};\n _this2.nodePoints = [];\n _this2.unitNum = 0;\n _this2.inputSpeed = options.speed && Math.pow(options.speed, -1) * 100 || 10;\n _this2.Dialog = _Dialog;\n if (!_this2.options.positions || _this2.options.positions.length < 2) {\n _this2._error = '线段最少需要两个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n for (var i = 0; i < _this2.options.positions.length; i++) {\n _this2.options.positions[i].lng = Number(Number(_this2.options.positions[i].lng).toFixed(8));\n _this2.options.positions[i].lat = Number(Number(_this2.options.positions[i].lat).toFixed(8));\n _this2.options.positions[i].alt = Number(Number(_this2.options.positions[i].alt).toFixed(2));\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n PolylineObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(PolylineObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(PolylineObject, [{\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || '#ff0000';\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,1)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"speed\",\n get: function get() {\n return this.options.speed;\n },\n set: function set(v) {\n this.options.speed = v;\n this.inputSpeed = v !== 0 ? Math.pow(v, -1) * 100 : 0;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.options.speed = v !== 0 ? Math.pow(v, -1) * 100 : 0\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n // get dashSize() {\n // return this.options.dashSize\n // }\n\n // set dashSize(v) {\n // this.options.dashSize = v\n // let params = { ...this.options }\n // params.speed = this.inputSpeed\n // // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params)\n // }\n }, {\n key: \"rotate\",\n get: function get() {\n return this.options.rotate;\n },\n set: function set(v) {\n this.options.rotate = v;\n this.closeNodeEdit();\n this._elms.rotate && this._elms.rotate.forEach(function (item) {\n item.checked = v;\n });\n this.options.rotate = v;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n }, {\n key: \"space\",\n get: function get() {\n return this.options.space;\n },\n set: function set(v) {\n this.options.space = v;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n }, {\n key: \"wordsName\",\n get: function get() {\n return this.options.wordsName;\n },\n set: function set(v) {\n this.options.wordsName = v;\n this._elms.wordsName && this._elms.wordsName.forEach(function (item) {\n item.value = v;\n });\n var _this = this;\n if (!this.noseToTail) {\n this.computeDistance(this.options.positions, 2, v).then(function (res) {\n // _this.options.lengthByMeter = res\n // if (res > 1000 || res == 1000) {\n // _this.length = (res / 1000).toFixed(5)\n // _this.lengthUnit = '千米'\n // } else {\n // _this.length = res\n // _this.lengthUnit = '米'\n // }\n _this.lengthByMeter = res;\n });\n } else {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n }\n }\n\n // get fitLengthUnit() {\n // return this.options.fitLengthUnit\n // }\n // set fitLengthUnit(v) {\n // this.options.fitLengthUnit = v\n // this._elms.fitLengthUnit &&\n // this._elms.fitLengthUnit.forEach(item => {\n // item.value = v\n // })\n // if (this.fitLengthByMeter) {\n // switch (v) {\n // case '米':\n // this.fitLength = this.fitLengthByMeter\n // break\n // case '千米':\n // this.fitLength = Number(\n // (this.fitLengthByMeter / 1000).toFixed(5)\n // )\n // break\n // default:\n // this.fitLength = this.fitLengthByMeter\n // }\n // }\n // }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.width;\n },\n set: function set(v) {\n var _this4 = this;\n this.options.width = v || v == 0 ? v : 3;\n this._elms.lineWidth && this._elms.lineWidth.forEach(function (item) {\n item.value = _this4.options.width;\n });\n if (this.entity && this.entity.polyline) {\n this.entity.polyline.width = this.entity.polyline.width + v - this.entity.polyline.oriWidth;\n this.entity.polyline.oriWidth = this.options.width;\n }\n // this.entity &&\n // this.entity.polyline &&\n // (this.entity.polyline.width = this.options.width) && (this.entity.polyline.oriWidth = this.options.width)\n }\n }, {\n key: \"lineType\",\n get: function get() {\n return this.options.type;\n },\n set: function set(v) {\n var _this5 = this;\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n this.options.type = Number(v);\n var _loop = function _loop(i) {\n if (lineTypeData[i].key === Number(v)) {\n _this5._elms.lineType && _this5._elms.lineType.forEach(function (item) {\n item.value = lineTypeData[i].value;\n if (2 < item.value && item.value < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < item.value && item.value < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n });\n return 1; // break\n }\n };\n for (var i = 0; i < lineTypeData.length; i++) {\n if (_loop(i)) break;\n }\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n this.entity && this.entity.polyline && (this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params));\n }\n }, {\n key: \"noseToTail\",\n get: function get() {\n return this.options.noseToTail;\n },\n set: function set(v) {\n this.options.noseToTail = v;\n this.closeNodeEdit();\n this._elms.noseToTail && this._elms.noseToTail.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n }\n // if (v) {\n // if (this.options.fitLengthByMeter > 1000 || this.options.fitLengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n\n // } else {\n // if (this.options.lengthByMeter > 1000 || this.options.lengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n // }\n }\n }, {\n key: \"smooth\",\n get: function get() {\n return this.options.smooth;\n },\n set: function set(v) {\n this.options.smooth = v;\n this.closeNodeEdit();\n this._elms.smooth && this._elms.smooth.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this6 = this;\n this.positionEditing = false;\n this.options.heightMode = v || v == 0 ? v : 2;\n var heightModeName = '';\n this.closeNodeEdit();\n var ground = false;\n var disabled = false;\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n this.entity.polyline.clampToGround = ground;\n heightModeName = '依附模型';\n break;\n }\n setTimeout(function () {\n if (ground) {\n _this6.label.ground = ground;\n _this6._elms.heightMode && (_this6._elms.heightMode.value = '依附模型');\n _this6.label.position = [_this6.options.positions[0].lng, _this6.options.positions[0].lat];\n } else {\n _this6.label.ground = ground;\n _this6.label.position = [_this6.options.positions[0].lng, _this6.options.positions[0].lat, fromDegreesArray[2]];\n _this6.options.label.position = {\n lng: _this6.options.positions[0].lng,\n lat: _this6.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n }\n }, 0);\n }\n }, {\n key: \"extend\",\n get: function get() {\n return this.options.extend;\n },\n set: function set(v) {\n this.options.extend = v;\n this.closeNodeEdit();\n if (v) {\n this.heightMode = 2;\n }\n this._elms.extend && this._elms.extend.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n if (this.options.extend) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n } else {\n this.entity.polygon = undefined;\n }\n }\n }\n }, {\n key: \"extendWidth\",\n get: function get() {\n return this.options.extendWidth;\n },\n set: function set(v) {\n this.options.extendWidth = v;\n this.heightMode = this.heightMode;\n this._elms.extendWidth && this._elms.extendWidth.forEach(function (item) {\n item.value = v;\n });\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n }\n }, {\n key: \"extendColor\",\n get: function get() {\n return this.options.extendColor;\n },\n set: function set(v) {\n var _this7 = this;\n this.options.extendColor = v;\n if (this._elms.extendColor) {\n this._elms.extendColor.forEach(function (item, i) {\n var extendColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this7.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this7.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this7.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this7._elms.extendColor[i] = extendColorPicker;\n });\n }\n this.entity && this.entity.polygon && (this.entity.polygon.material = Cesium.Color.fromCssColorString(this.options.extendColor));\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n setTimeout(function () {\n _this8.label.position = [_this8.options.positions[0].lng, _this8.options.positions[0].lat, _this8.options.positions[0].alt];\n }, 0);\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this9.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this9.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this9.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this9._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this11 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this11.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this11._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this12 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this12.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this12._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"attributeType\",\n get: function get() {\n return this.options.attributeType;\n },\n set: function set(v) {\n this.options.attributeType = v;\n this._elms.attributeType && this._elms.attributeType.forEach(function (item) {\n item.value = v;\n });\n var attributeContent = this._DialogObject._element.content.getElementsByClassName('attribute-content');\n for (var i = 0; i < attributeContent.length; i++) {\n if (attributeContent[i].className.indexOf('attribute-content-' + v) > -1) {\n attributeContent[i].style.display = 'block';\n } else {\n attributeContent[i].style.display = 'none';\n }\n }\n }\n }, {\n key: \"attributeLink\",\n get: function get() {\n return this.options.attribute.link.content;\n },\n set: function set(v) {\n var _this13 = this;\n this.options.attribute.link.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-link').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.link.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.link.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.link.content[i].name + \"
\\n
\" + this.options.attribute.link.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n linkEdit: function () {\n var _linkEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(index) {\n var table, tableContent, item, _loop2, _i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return _this13.options.attribute.link.content;\n case 2:\n _this13.attributeLink = _context3.sent;\n table = _this13._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop2 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop2(_i) {\n var height, _html, textareaElm, td, btn, n, _iterator, _step, _loop3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(index === _i)) {\n _context2.next = 36;\n break;\n }\n height = item[_i].offsetHeight;\n _html = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i].innerHTML = _html;\n textareaElm = item[_i].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this13.options.attribute.link.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this13.options.attribute.link.content[index].url;\n btn = item[_i].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context2.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context2.next = 14;\n break;\n }\n return _context2.abrupt(\"continue\", 32);\n case 14:\n _iterator = _createForOfIteratorHelper(btn[n].attributes);\n _context2.prev = 15;\n _loop3 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop3() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop3$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n m = _step.value;\n if (!(m.name === '@click')) {\n _context.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _loop3);\n });\n _iterator.s();\n case 18:\n if ((_step = _iterator.n()).done) {\n _context2.next = 24;\n break;\n }\n return _context2.delegateYield(_loop3(), \"t0\", 20);\n case 20:\n if (!_context2.t0) {\n _context2.next = 22;\n break;\n }\n return _context2.abrupt(\"break\", 24);\n case 22:\n _context2.next = 18;\n break;\n case 24:\n _context2.next = 29;\n break;\n case 26:\n _context2.prev = 26;\n _context2.t1 = _context2[\"catch\"](15);\n _iterator.e(_context2.t1);\n case 29:\n _context2.prev = 29;\n _iterator.f();\n return _context2.finish(29);\n case 32:\n n++;\n _context2.next = 11;\n break;\n case 35:\n return _context2.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context2.stop();\n }\n }, _loop2, null, [[15, 26, 29, 32]]);\n });\n _i = 0;\n case 8:\n if (!(_i < item.length)) {\n _context3.next = 15;\n break;\n }\n return _context3.delegateYield(_loop2(_i), \"t0\", 10);\n case 10:\n if (!_context3.t0) {\n _context3.next = 12;\n break;\n }\n return _context3.abrupt(\"break\", 15);\n case 12:\n _i++;\n _context3.next = 8;\n break;\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }, _callee);\n }));\n function linkEdit(_x) {\n return _linkEdit.apply(this, arguments);\n }\n return linkEdit;\n }(),\n linkDelete: function linkDelete(i) {\n _this13.options.attribute.link.content.splice(i, 1);\n _this13.attributeLink = _this13.options.attribute.link.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, '');\n var url = value.url && value.url.replace(/\\s/g, '');\n if (name && url) {\n _this13.options.attribute.link.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this13.attributeLink = _this13.options.attribute.link.content;\n },\n cancelEdit: function cancelEdit() {\n _this13.attributeLink = _this13.options.attribute.link.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect);\n fileElm.addEventListener('change', _fileSelect);\n }\n };\n var _fileSelect = function _fileSelect(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop4 = function _loop4(_i2) {\n var btn = item[_i2].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator2 = _createForOfIteratorHelper(btn[n].attributes),\n _step2;\n try {\n var _loop5 = function _loop5() {\n var m = _step2.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i2);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n if (_loop5()) break;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n };\n for (var _i2 = 0; _i2 < item.length; _i2++) {\n _loop4(_i2);\n }\n }\n\n // get attributeCamera() {\n // return this.options.attribute.camera.content\n // }\n\n // set attributeCamera(v) {\n // this.options.attribute.camera.content = v\n // }\n\n // get attributeVr() {\n // return this.options.attribute.vr.content\n // }\n\n // set attributeVr(v) {\n // this.options.attribute.vr.content = v\n // if (\n // !this._DialogObject ||\n // !this._DialogObject._element ||\n // !this._DialogObject._element.content ||\n // this._DialogObject._element.content.getElementsByClassName(\n // 'attribute-content-vr'\n // ).length == 0\n // ) {\n // return\n // }\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // tableContent.innerHTML = ''\n // if (this.options.attribute.vr.content.length > 0) {\n // table.getElementsByClassName('table-empty')[0].style.display = 'none'\n // } else {\n // table.getElementsByClassName('table-empty')[0].style.display = 'flex'\n // }\n // for (let i = 0; i < this.options.attribute.vr.content.length; i++) {\n // let tr =\n // `\n //
\n //
` +\n // this.options.attribute.vr.content[i].name +\n // `
\n //
` +\n // this.options.attribute.vr.content[i].url +\n // `
\n //
\n // \n // \n //
\n //
`\n // let trElm = document.createRange().createContextualFragment(tr)\n // tableContent.appendChild(trElm)\n // }\n // let item = tableContent.getElementsByClassName('tr')\n // let fun = {\n // vrEdit: async index => {\n // this.attributeVr = await this.options.attribute.vr.content\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // let item = tableContent.getElementsByClassName('tr')\n // for (let i = 0; i < item.length; i++) {\n // if (index === i) {\n // let height = item[i].offsetHeight\n // let html = `\n //
\n // \n //
\n //
\n // \n //
\n //
\n // \n // \n //
`\n // item[i].innerHTML = html\n // let textareaElm = item[i].getElementsByClassName('link-edit')[0]\n // textareaElm.style.height = height - 10 + 'px'\n // let td = item[i].getElementsByClassName('td')\n // td[0].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].name\n // td[1].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].url\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](\n // {\n // name: td[0].getElementsByClassName('input')[0].value,\n // url: td[1].getElementsByClassName('input')[0].value\n // },\n // i\n // )\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // break\n // }\n // }\n // },\n // vrDelete: i => {\n // this.options.attribute.vr.content.splice(i, 1)\n // this.attributeVr = this.options.attribute.vr.content\n // },\n\n // confirmEdit: (value, i) => {\n // let name = value.name && value.name.replace(/\\s/g, '')\n // let url = value.url && value.url.replace(/\\s/g, '')\n // if (name && url) {\n // this.options.attribute.vr.content[i] = value\n // } else {\n // window.ELEMENT &&\n // window.ELEMENT.Message({\n // message: '名称或链接不能为空!',\n // type: 'warning',\n // duration: 1500\n // })\n // }\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // cancelEdit: () => {\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // fileSelect: (value, i) => {\n // let fileElm = item[i].getElementsByClassName('file-select')[0]\n // fileElm.click()\n // fileElm.removeEventListener('change', fileSelect)\n // fileElm.addEventListener('change', fileSelect)\n // }\n // }\n // let fileSelect = event => {\n // if (event.target.value) {\n // let td = item[\n // event.target.getAttribute('index')\n // ].getElementsByClassName('td')\n // td[1].getElementsByClassName('input')[0].value = event.target.value\n // event.target.value = null\n // }\n // }\n // for (let i = 0; i < item.length; i++) {\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](i)\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // }\n // }\n\n // get attributeGoods() {\n // return this.options.attribute.goods.content\n // }\n\n // set attributeGoods(v) {\n // this.options.attribute.goods.content = v\n // }\n }, {\n key: \"positions\",\n get: function get() {\n return this.options.positions;\n }\n }, {\n key: \"judgeLine\",\n value: function judgeLine(entity, newParam) {\n if (!entity.polyline.oriRepeat) {\n var param = {\n color: newParam.color,\n image: this.getSourceRootPath() + \"/img/arrow/1.png\",\n space: newParam.space,\n speed: newParam.speed\n };\n param.speed = newParam.rotate ? param.speed : 0 - param.speed;\n var canvasEle = document.createElement('canvas');\n var ctx = canvasEle.getContext('2d');\n var myImg = new Image();\n // myImg.src = that.getSourceRootPath() + '/img/arrow/1.png'\n myImg.src = param.image;\n var _that = this;\n myImg.onload = function () {\n canvasEle.width = myImg.width * (param.space + 1);\n canvasEle.height = myImg.height;\n var oriRepeat = _that.getSceenLine(entity, param, canvasEle);\n oriRepeat && (entity.polyline.oriRepeat = oriRepeat);\n var positionProperty = entity.polyline.positions;\n var positions = positionProperty.getValue(_that.sdk.viewer.clock.currentTime);\n if (!Cesium.defined(positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < positions.length - 1; ++i) {\n distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]);\n }\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = _that.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = _that.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = _that.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = _that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n repeatX *= groundResolution / cameraHeight / (param.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n\n if (_that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var speed = repeatX / entity.polyline.oriRepeat;\n entity.polyline.oriSpeed = speed;\n entity.polyline.oriRepeatX = repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(_that.options.id);\n entity.polyline.oriSpeed = sdk3dEntity.polyline.oriSpeed;\n entity.polyline.oriRepeatX = sdk3dEntity.polyline.oriRepeatX;\n }\n };\n }\n }\n /**获取当前满屏横线速度 */\n }, {\n key: \"getSceenLine\",\n value: function getSceenLine(entity, options, canvasEle) {\n var point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight);\n // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1)\n // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2)\n\n var ray = this.sdk.viewer.camera.getPickRay(point1);\n var cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n var ray2 = this.sdk.viewer.camera.getPickRay(point2);\n var cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // if (!cartesian1 || !cartesian2) {\n // let ray = this.sdk.viewer.camera.getPickRay(point1);\n // cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n\n // let ray2 = this.sdk.viewer.camera.getPickRay(point2);\n // cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // }\n if (cartesian1 && cartesian2) {\n var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = this.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = this.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = this.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = this.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n // repeatX *= groundResolution / cameraHeight / ((myImg.width / myImg.height * 5) + 1);\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n } else {\n repeatX = undefined;\n }\n if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id);\n return sdk3dEntity.polyline.oriRepeatX;\n }\n }\n }\n /**\r\n * 编辑框\r\n * @param {boolean} state true打开,false关闭\r\n */\n }, {\n key: \"edit\",\n value: (function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2(state) {\n var _this14 = this;\n var _this, tabClick, contentElm, tabsElm, colorPicker, labelColorPicker, extendColorPicker, lineColorPicker, labelBackgroundColorEndPicker, all_elm;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n _this = this;\n this.originalOptions = this.deepCopyObj(this.options);\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n if (!state) {\n _context4.next = 32;\n break;\n }\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n tabClick = function tabClick(e) {\n if (e === '2' || e === 2) {\n //点击线条样式\n if (2 < _this.options.type && _this.options.type < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n }\n }; // 创建标签页\n _context4.next = 7;\n return new _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__[\"default\"](this.sdk, this.options, {\n title: '线属性',\n left: '180px',\n top: '100px',\n confirmCallBack: function confirmCallBack(options) {\n _this14.name = _this14.name.trim();\n if (!_this14.name) {\n _this14.name = '未命名对象';\n }\n _this14.options.label.position = {\n lng: _this14.label.position[0],\n lat: _this14.label.position[1],\n alt: _this14.label.position[2]\n };\n _this14.originalOptions = _this14.deepCopyObj(_this14.options);\n _this14._DialogObject.close();\n _this14.Dialog.confirmCallBack && _this14.Dialog.confirmCallBack(_this14.originalOptions);\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(_this14.sdk, _this14.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__[\"syncSplitData\"])(_this14.sdk, _this14.options.id);\n },\n resetCallBack: function resetCallBack() {\n _this14.reset();\n _this14.Dialog.resetCallBack && _this14.Dialog.resetCallBack();\n },\n removeCallBack: function removeCallBack() {\n _this14.Dialog.removeCallBack && _this14.Dialog.removeCallBack();\n },\n closeCallBack: function closeCallBack() {\n _this14.reset();\n _this14.Dialog.closeCallBack && _this14.Dialog.closeCallBack();\n for (var i = 0; i < _this14.nodePoints.length; i++) {\n _this14.sdk.viewer.entities.remove(_this14.nodePoints[i]);\n }\n _this14.nodePoints = [];\n _this14.positionEditing = false;\n YJ.Measure.SetMeasureStatus(false);\n _this14.event && _this14.event.destroy();\n _this14.tip && _this14.tip.destroy();\n },\n showCallBack: function showCallBack(show) {\n _this14.options.show = show;\n _this14.originalOptions.show = show;\n _this14.show = show;\n _this14.Dialog.showCallBack && _this14.Dialog.showCallBack();\n },\n translationalCallBack: function translationalCallBack() {\n _this14.positionEditing = !_this14.positionEditing;\n },\n // 二次编辑回调\n secondaryEditCallBack: function secondaryEditCallBack() {\n _this14.nodeEdit();\n }\n });\n case 7:\n this._DialogObject = _context4.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' polyline';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_10__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__[\"default\"]('polyline-object-edit-tabs', tabClick, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('color')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n extendColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('extendColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n lineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelLineColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this.labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorStart')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this14.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this14.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorEnd')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this14.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this14.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName('*');\n _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].on(this, all_elm);\n this._elms = _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].element;\n this._elms.color = [colorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.extendColor = [extendColorPicker];\n this._elms.labelLineColor = [lineColorPicker];\n this._elms.labelBackgroundColorStart = [_this.labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n setTimeout(function () {\n _this14.attributeLink = _this14.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n var tagData = _this14.attributeSelect;\n var attributeElm = _this14._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(attributeElm, '.attribute-select');\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this14._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var i = 0; i < tagData.length; i++) {\n if (tagData[i].key === _this14.options.attributeType) {\n attributeSelectElm.value = tagData[i].value;\n legpObject.legp_searchActive(tagData[i].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i3 = 0; _i3 < tagData.length; _i3++) {\n if (tagData[_i3].value === attributeSelectElm.value) {\n _this14.attributeType = tagData[_i3].key;\n break;\n }\n }\n });\n }\n var nameData = [{\n name: '空间长度',\n value: '空间长度'\n }, {\n name: '投影长度',\n value: '投影长度'\n }, {\n name: '地表长度',\n value: '地表长度'\n }];\n var nameDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit');\n if (nameDataLegpObject) {\n nameDataLegpObject.legp_search(nameData);\n var nameDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n _this14._elms.wordsName = [nameDataLegpElm];\n nameDataLegpElm.value = _this14.options.wordsName;\n for (var _i4 = 0; _i4 < nameData.length; _i4++) {\n if (nameData[_i4].value === nameDataLegpElm.value) {\n nameDataLegpObject.legp_searchActive(nameData[_i4].value);\n break;\n }\n }\n nameDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < nameData.length; _i5++) {\n if (nameData[_i5].value === nameDataLegpElm.value) {\n _this14.wordsName = nameData[_i5].value;\n break;\n }\n }\n });\n }\n\n // 原始长度单位\n var unitData = [{\n name: '米',\n value: '米'\n }, {\n name: '千米',\n value: '千米'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit', 1);\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-unit')[1].getElementsByTagName('input')[0];\n _this14._elms.lengthUnit = [unitDataLegpElm];\n unitDataLegpElm.value = _this14.options.lengthUnit;\n for (var _i6 = 0; _i6 < unitData.length; _i6++) {\n if (unitData[_i6].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i6].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < unitData.length; _i7++) {\n if (unitData[_i7].value === unitDataLegpElm.value) {\n _this14.lengthUnit = unitData[_i7].value;\n break;\n }\n }\n });\n }\n //\n\n // 拟合长度单位\n // let fitUnitData = [\n // {\n // name: '米',\n // value: '米'\n // },\n // {\n // name: '千米',\n // value: '千米'\n // }\n // ]\n\n // let fitUnitDataLegpObject = legp(\n // this._DialogObject._element.content.getElementsByClassName(\n // 'input-select-fit-unit-box'\n // )[0],\n // '.input-select-fit-unit'\n // )\n // if (fitUnitDataLegpObject) {\n // fitUnitDataLegpObject.legp_search(fitUnitData)\n // let fitUnitDataLegpElm = this._DialogObject._element.content\n // .getElementsByClassName('input-select-fit-unit')[0]\n // .getElementsByTagName('input')[0]\n // this._elms.fitLengthUnit = [fitUnitDataLegpElm]\n // fitUnitDataLegpElm.value = this.options.fitLengthUnit\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // fitUnitDataLegpObject.legp_searchActive(fitUnitData[i].value)\n // break\n // }\n // }\n // fitUnitDataLegpElm.addEventListener('input', () => {\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // this.fitLengthUnit = fitUnitData[i].value\n // break\n // }\n // }\n // })\n // }\n\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n var lineTypeDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-line-type-box')[0], '.input-select-line-type');\n if (lineTypeDataLegpObject) {\n lineTypeDataLegpObject.legp_search(lineTypeData);\n var iActiveElm2 = document.createElement('i');\n iActiveElm2.className = 'icon icon-active';\n _this14._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByClassName('cy_datalist')[0].appendChild(iActiveElm2);\n var lineTypeDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByTagName('input')[0];\n _this14._elms.lineType = [lineTypeDataLegpElm];\n for (var _i8 = 0; _i8 < lineTypeData.length; _i8++) {\n if (lineTypeData[_i8].key === _this14.options.type) {\n lineTypeDataLegpObject.legp_searchActive(lineTypeData[_i8].value);\n lineTypeDataLegpElm.value = lineTypeData[_i8].value;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i8].icon);\n break;\n }\n }\n lineTypeDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < lineTypeData.length; _i9++) {\n if (lineTypeData[_i9].value === lineTypeDataLegpElm.value) {\n _this14.lineType = lineTypeData[_i9].key;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i9].icon);\n\n //控制参数显隐\n if (2 < _this14.lineType && _this14.lineType < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < _this14.lineType && _this14.lineType < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n break;\n }\n }\n });\n }\n var heightBoxElm = _this14._DialogObject._element.content.getElementsByClassName('height-box')[0];\n var heightElm = heightBoxElm.getElementsByClassName('height')[0];\n var heightConfirmElm = _this14._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (_this14.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n var heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n var heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (heightModeObject) {\n heightModeObject.legp_search(heightModeData);\n var heightModeDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n for (var _i10 = 0; _i10 < heightModeData.length; _i10++) {\n if (heightModeData[_i10].key == _this14.heightMode) {\n heightModeDataLegpElm.value = heightModeData[_i10].value;\n heightModeObject.legp_searchActive(heightModeData[_i10].value);\n break;\n }\n }\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i11 = 0; _i11 < heightModeData.length; _i11++) {\n if (heightModeData[_i11].value === heightModeDataLegpElm.value) {\n _this14.heightMode = heightModeData[_i11].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this14.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n _this14._elms.height = heightElm;\n _this14._elms.heightBox = heightBoxElm;\n _this14._elms.heightMode = heightModeDataLegpElm;\n _this14._elms.heightConfirm = heightConfirmElm;\n _this14._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n _this14.positionEditing = false;\n for (var _i12 = 0; _i12 < _this14.options.positions.length; _i12++) {\n _this14.options.positions[_i12].alt = Number((_this14.options.positions[_i12].alt + Number(heightElm.value)).toFixed(2));\n _this14._elms.alt[_i12].innerHTML = _this14.options.positions[_i12].alt;\n }\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n }\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n _this14._elms.lng = [];\n _this14._elms.lngInput = [];\n _this14._elms.lat = [];\n _this14._elms.latInput = [];\n _this14._elms.alt = [];\n _this14._elms.altInput = [];\n var _loop6 = function _loop6(_i13) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(_i13 + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this14.options.positions[_i13].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this14.options.positions[_i13].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this14.options.positions[_i13].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this14.options.positions[_i13].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this14.options.positions[_i13].alt.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this14.options.positions[_i13].alt.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this14.options.positions[_i13].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this14.options.positions[_i13].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this14.options.positions[_i13].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this14.options.positions[_i13].lng.toFixed(8);\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.label.position = [_this14.options.positions[0].lng, _this14.options.positions[0].lat, fromDegreesArray[2]];\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this14.options.positions[_i13].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this14.options.positions[_i13].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this14.options.positions[_i13].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this14.options.positions[_i13].lat.toFixed(8);\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.label.position = [_this14.options.positions[0].lng, _this14.options.positions[0].lat, fromDegreesArray[2]];\n });\n altBox.addEventListener('dblclick', function () {\n if (_this14.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this14.options.positions[_i13].alt.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this14.options.positions[_i13].alt.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this14.options.positions[_i13].alt = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = _this14.options.positions[_i13].alt.toFixed(2);\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.label.position = [_this14.options.positions[0].lng, _this14.options.positions[0].lat, fromDegreesArray[2]];\n });\n _this14._elms.lng.push(lng);\n _this14._elms.lngInput.push(lngInput);\n _this14._elms.lat.push(lat);\n _this14._elms.latInput.push(latInput);\n _this14._elms.alt.push(alt);\n _this14._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var _i13 = 0; _i13 < _this14.options.positions.length; _i13++) {\n _loop6(_i13);\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this14.labelFontFamily].value;\n for (var _i14 = 0; _i14 < fontData.length; _i14++) {\n if (fontData[_i14].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i14].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i15 = 0; _i15 < fontData.length; _i15++) {\n if (fontData[_i15].value === fontDataLegpElm.value) {\n _this14.labelFontFamily = fontData[_i15].key;\n break;\n }\n }\n });\n _this14._elms.labelFontFamily = [fontDataLegpElm];\n }\n }, 0);\n _context4.next = 33;\n break;\n case 32:\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n case 33:\n case \"end\":\n return _context4.stop();\n }\n }, _callee2, this);\n }));\n function edit(_x2) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }() // 平滑处理\n )\n }, {\n key: \"smoothHandle\",\n value: function smoothHandle(positions) {\n var newPositions = [];\n var time = [];\n var fromDegreesArrayHeights = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArrayHeights.push(positions[i].lng, positions[i].lat, positions[i].alt);\n time.push(i / (positions.length - 1));\n }\n var spline = new Cesium.CatmullRomSpline({\n times: time,\n points: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArrayHeights)\n });\n var length = positions.length * 20;\n for (var _i16 = 0; _i16 <= length; _i16++) {\n var cartesian3 = spline.evaluate(_i16 / length);\n newPositions.push(this.cartesian3Towgs84(cartesian3, this.sdk.viewer));\n }\n return newPositions;\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(positionsArray, cd) {\n if (this._error) {\n return;\n }\n var positions = JSON.parse(JSON.stringify(positionsArray));\n var ground;\n switch (this.heightMode) {\n case 0:\n case '0':\n ground = false;\n break;\n case 1:\n case '1':\n for (var i = 0; i < positions.length; i++) {\n var height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions[i].lng, positions[i].lat));\n positions[i].alt = height ? Number((positions[i].alt + Number(height)).toFixed(2)) : Number(positions[i].alt.toFixed(2));\n }\n ground = false;\n break;\n case 2:\n case '2':\n ground = true;\n break;\n }\n var newPositions;\n var fromDegreesArray = [];\n if (this.options.noseToTail && this.options.noseToTail !== 'false') {\n newPositions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions), [positions[0]]);\n } else {\n newPositions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions);\n }\n if (this.options.smooth && this.options.smooth !== 'false') {\n newPositions = this.smoothHandle(newPositions);\n for (var _i17 = 0; _i17 < newPositions.length; _i17++) {\n fromDegreesArray.push(newPositions[_i17].lng, newPositions[_i17].lat, newPositions[_i17].alt);\n }\n } else {\n for (var _i18 = 0; _i18 < newPositions.length; _i18++) {\n fromDegreesArray.push(newPositions[_i18].lng, newPositions[_i18].lat, newPositions[_i18].alt);\n }\n }\n\n // 计算长度\n if (this.options.noseToTail && this.options.noseToTail !== 'false' || this.options.smooth && this.options.smooth !== 'false') {\n var array = [];\n for (var _i19 = 0; _i19 < fromDegreesArray.length; _i19 += 3) {\n array.push({\n lng: fromDegreesArray[_i19],\n lat: fromDegreesArray[_i19 + 1],\n alt: fromDegreesArray[_i19 + 2]\n });\n }\n var _this15 = this;\n this.computeDistance(array, 2, this.options.wordsName).then(function (res) {\n _this15.lengthByMeter = res;\n cd && cd();\n });\n } else {\n var _this16 = this;\n this.computeDistance(positions, 2, this.options.wordsName).then(function (res) {\n _this16.lengthByMeter = res;\n cd && cd();\n });\n }\n return fromDegreesArray;\n }\n\n // 更新多边形(线扩展)\n }, {\n key: \"renewPolygon\",\n value: function renewPolygon(fromDegreesArray) {\n var linePositions = [];\n if (this.options.extend && this.options.extend !== 'false') {\n var outerHole = [];\n for (var i = 0; i < fromDegreesArray.length; i += 3) {\n linePositions.push([fromDegreesArray[i], fromDegreesArray[i + 1]]);\n }\n var linestring = turf.lineString(linePositions);\n var buffered = turf.buffer(linestring, this.options.extendWidth / 1000, {\n units: 'kilometers'\n });\n for (var _i20 = 0; _i20 < buffered.geometry.coordinates[0].length; _i20++) {\n outerHole.push(buffered.geometry.coordinates[0][_i20][0], buffered.geometry.coordinates[0][_i20][1]);\n }\n var holes = []; // 孔\n for (var _i21 = 1; _i21 < buffered.geometry.coordinates.length; _i21++) {\n var array = [];\n for (var m = 0; m < buffered.geometry.coordinates[_i21].length; m++) {\n array.push(buffered.geometry.coordinates[_i21][m][0], buffered.geometry.coordinates[_i21][m][1]);\n }\n holes.push({\n positions: Cesium.Cartesian3.fromDegreesArray(array)\n });\n }\n this.entity.polygon = new Cesium.PolygonGraphics({\n hierarchy: {\n positions: Cesium.Cartesian3.fromDegreesArray(outerHole),\n holes: holes\n },\n material: Cesium.Color.fromCssColorString(this.options.extendColor)\n });\n } else {\n this.entity.polygon = undefined;\n }\n }\n }, {\n key: \"reset\",\n value: function () {\n var _reset = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (this.entity) {\n _context5.next = 2;\n break;\n }\n return _context5.abrupt(\"return\");\n case 2:\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineWidth = this.originalOptions.width;\n this.lineType = this.originalOptions.type;\n this.noseToTail = this.originalOptions.noseToTail;\n this.smooth = this.originalOptions.smooth;\n this.extend = this.originalOptions.extend;\n this.extendWidth = this.originalOptions.extendWidth;\n this.extendColor = this.originalOptions.extendColor;\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n this.attributeLink = this.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n this.rotate = this.originalOptions.rotate;\n this.speed = this.originalOptions.speed;\n // this.dashSize = this.originalOptions.dashSize\n this.space = this.originalOptions.space;\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n\n this.heightMode = this.options.heightMode;\n\n // let height\n // if (this.ground) {\n // height = await that.getClampToHeight({\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat\n // })\n // } else {\n // height = this.options.positions[0].alt\n // }\n // this.options.label.position = {\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat,\n // alt: height\n // }\n // this.label.position = [\n // this.options.label.position.lng,\n // this.options.label.position.lat,\n // this.options.label.position.alt\n // ]\n case 26:\n case \"end\":\n return _context5.stop();\n }\n }, _callee3, this);\n }));\n function reset() {\n return _reset.apply(this, arguments);\n }\n return reset;\n }()\n }, {\n key: \"_addLink\",\n value: function _addLink() {\n if (this._DialogObject._element.content.getElementsByClassName('link_add')[0].value) {\n this.options.attribute.link.content.push({\n name: '链接' + (this.options.attribute.link.content.length + 1),\n url: this._DialogObject._element.content.getElementsByClassName('link_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('link_add')[0].value = '';\n this.attributeLink = this.options.attribute.link.content;\n } else {\n this.Dialog.clickAddLink && this.Dialog.clickAddLink();\n // let input = document.createElement('input');\n // input.type = \"file\";\n // input.accept = \".mp4, .pdf\"\n // input.click()\n // input.addEventListener('change', (event) => {\n // if (input.value) {\n // this.options.attribute.link.content.push({\n // name: '链接' + (this.options.attribute.link.content.length + 1),\n // url: input.value\n // })\n // this.attributeLink = this.options.attribute.link.content\n // }\n // })\n }\n }\n }, {\n key: \"addAttributeLink\",\n value: function addAttributeLink(link) {\n this.options.attribute.link.content.push({\n name: '链接' + (this.options.attribute.link.content.length + 1),\n url: link\n });\n this.attributeLink = this.options.attribute.link.content;\n }\n\n // _addRr() {\n // if (\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // ) {\n // this.options.attribute.vr.content.push({\n // name: '全景图' + (this.options.attribute.vr.content.length + 1),\n // url: this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // })\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value = ''\n // this.attributeVr = this.options.attribute.vr.content\n // } else {\n // this.Dialog.clickAddVr && this.Dialog.clickAddVr()\n // }\n // }\n\n // addAttributeRr(vr) {\n // this.options.attribute.vr.content.push({\n // name: '全景图' + (this.options.attribute.vr.content.length + 1),\n // url: vr\n // })\n // this.attributeVr = this.options.attribute.vr.content\n // }\n\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n height,\n i,\n a,\n _i22,\n _a,\n _i23,\n _a2,\n BoundingSphere,\n _args6 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n options = _args6.length > 0 && _args6[0] !== undefined ? _args6[0] : {};\n if (!this._error) {\n _context6.next = 3;\n break;\n }\n return _context6.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context6.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context6.next = 18;\n break;\n }\n _context6.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context6.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context6.next = 43;\n break;\n case 25:\n positionArray = [];\n _context6.t0 = this.options.heightMode;\n _context6.next = _context6.t0 === '0' ? 29 : _context6.t0 === 0 ? 29 : _context6.t0 === '1' ? 31 : _context6.t0 === 1 ? 31 : _context6.t0 === '2' ? 36 : _context6.t0 === 2 ? 36 : 41;\n break;\n case 29:\n for (i = 0; i < this.options.positions.length; i++) {\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt);\n positionArray.push(a.x, a.y, a.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 31:\n _context6.next = 33;\n return this.getClampToHeight(this.options.positions[0]);\n case 33:\n height = _context6.sent;\n for (_i22 = 0; _i22 < this.options.positions.length; _i22++) {\n _a = Cesium.Cartesian3.fromDegrees(this.options.positions[_i22].lng, this.options.positions[_i22].lat, height + this.options.positions[_i22].alt);\n positionArray.push(_a.x, _a.y, _a.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 36:\n _context6.next = 38;\n return this.getClampToHeight(this.options.positions[0]);\n case 38:\n height = _context6.sent;\n for (_i23 = 0; _i23 < this.options.positions.length; _i23++) {\n _a2 = Cesium.Cartesian3.fromDegrees(this.options.positions[_i23].lng, this.options.positions[_i23].lat, height);\n positionArray.push(_a2.x, _a2.y, _a2.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 41:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 43:\n case \"end\":\n return _context6.stop();\n }\n }, _callee4, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 打开富文本框\r\n */\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this17 = this;\n // var ue = UE.getEditor('app');\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].primaryCallBack = function (content) {\n _this17.options.richTextContent = content;\n };\n }\n\n // static nodeEdit2(that, cb = () => { }) {\n // that.positionEditing = false\n // if (YJ.Measure.GetMeasureStatus()) {\n // cb('上一次测量未结束')\n // } else {\n // YJ.Measure.SetMeasureStatus(true)\n // that.tip = new MouseTip('请选择一个顶点,右键取消', that.sdk)\n // that.event = new MouseEvent(that.sdk)\n // that.nodePoints = []\n // let selectPoint\n // let originalPosition\n // let newpositions = []\n // let fromDegreesArray = []\n // for (let i = 0; i < that.options.positions.length; i++) {\n // fromDegreesArray.push(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray)\n\n // that.event.mouse_left((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // originalPosition = that.options.positions[selectPoint.index]\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[selectPoint.index].lng,\n // that.options.positions[selectPoint.index].lat,\n // that.options.positions[selectPoint.index].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.splice(selectPoint.index, 0, entity)\n // that.options.positions.splice(\n // selectPoint.index,\n // 0,\n // that.options.positions[selectPoint.index]\n // )\n // let fromDegreesArray = that.renewPositions(that.options.positions)\n // that.renewPolygon(fromDegreesArray)\n // that.options.lengthByMeter = that.computeDistance(\n // that.options.positions,\n // 2,\n // that.ground\n // )\n // that.lengthUnit = that.options.lengthUnit\n // } else {\n // var pick = that.sdk.viewer.scene.pick(movement.position)\n // if (\n // pick &&\n // pick.id &&\n // pick.id.name &&\n // pick.id.name === 'node-secondary-edit-point'\n // ) {\n // selectPoint = pick.id\n // that.nodePoints.splice(pick.id.index, 1)\n // that.sdk.viewer.entities.remove(pick.id)\n // that.tip.set_text('左键开始,右键结束,CTRL+右键撤销')\n // originalPosition = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // }\n // }\n // })\n\n // that.event.mouse_right((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = originalPosition\n // cb(null, that.options.positions)\n // }\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // for (let i = 0; i < that.nodePoints.length; i++) {\n // that.sdk.viewer.entities.remove(that.nodePoints[i])\n // }\n // that.nodePoints = []\n // that.event.destroy()\n // that.tip.destroy()\n // })\n\n // that.event.mouse_move((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // if (that.options.positions.length === 1) {\n // that.label.position = [\n // that.options.positions[0].lng,\n // that.options.positions[0].lat,\n // that.options.positions[0].alt\n // ]\n // that.options.label.position = {\n // lng: that.options.positions[0].lng,\n // lat: that.options.positions[0].lat,\n // alt: that.options.positions[0].alt\n // }\n // }\n // }\n // that.tip.setPosition(\n // cartesian,\n // movement.endPosition.x,\n // movement.endPosition.y\n // )\n // })\n\n // that.event.mouse_right_keyboard_ctrl((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions.pop()\n // that.sdk.viewer.entities.remove(\n // that.nodePoints[that.nodePoints.length - 1]\n // )\n // that.nodePoints.pop()\n // if (selectPoint.index === that.options.positions.length) {\n // if (that.nodePoints[selectPoint.index - 1]) {\n // selectPoint = that.nodePoints[selectPoint.index - 1]\n // } else {\n // selectPoint.index = 0\n // }\n // }\n // }\n // })\n\n // that.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n // return newpositions\n // }, false)\n\n // for (let i = 0; i < that.options.positions.length; i++) {\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // index: i,\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.push(entity)\n // }\n // }\n // }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit(cd) {\n var _this18 = this;\n this.positionEditing = false;\n this.noseToTail = false;\n // this.smooth = false\n this.heightMode = 0;\n if (YJ.Measure.GetMeasureStatus()) {} else {\n this.closeNodeEdit();\n YJ.Measure.SetMeasureStatus(true);\n this._nodeEditCallback = cd;\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('请选择一个顶点,右键取消', this.sdk);\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.ControllerObject = new _Controller_index__WEBPACK_IMPORTED_MODULE_18__[\"default\"](this.sdk);\n var selectPoint;\n this.event.mouse_left(function (movement, cartesian) {\n var pick = _this18.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n _this18.ControllerObject.position = _this18.options.positions[selectPoint.index];\n _this18.ControllerObject.editTranslational();\n _this18.tip && _this18.tip.destroy();\n _this18.ControllerObject.controllerCallBack = function (params) {\n if (selectPoint.index === 0) {\n _this18.label.position = [params.position.lng, params.position.lat, params.position.alt];\n _this18.options.label.position = {\n lng: params.position.lng,\n lat: params.position.lat,\n alt: params.position.alt\n };\n }\n _this18.options.positions[selectPoint.index] = params.position;\n _this18._elms.lng && (_this18._elms.lng[selectPoint.index].innerHTML = params.position.lng.toFixed(8));\n _this18._elms.lngInput && (_this18._elms.lngInput[selectPoint.index].value = params.position.lng.toFixed(8));\n _this18._elms.lat && (_this18._elms.lat[selectPoint.index].innerHTML = params.position.lat.toFixed(8));\n _this18._elms.latInput && (_this18._elms.latInput[selectPoint.index].value = params.position.lat.toFixed(8));\n _this18._elms.alt && (_this18._elms.alt[selectPoint.index].innerHTML = params.position.alt.toFixed(2));\n _this18._elms.altInput && (_this18._elms.altInput[selectPoint.index].value = params.position.alt.toFixed(2));\n selectPoint.position = Cesium.Cartesian3.fromDegrees(params.position.lng, params.position.lat, params.position.alt);\n };\n }\n });\n this.event.mouse_right(function (movement, cartesian) {\n for (var i = 0; i < _this18.nodePoints.length; i++) {\n _this18.sdk.viewer.entities.remove(_this18.nodePoints[i]);\n }\n _this18.nodePoints = [];\n _this18.event.destroy();\n _this18.tip && _this18.tip.destroy();\n _this18.tip = null;\n _this18.ControllerObject.destroy();\n var fromDegreesArray = _this18.renewPositions(_this18.options.positions);\n _this18.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n YJ.Measure.SetMeasureStatus(false);\n _this18._nodeEditCallback = null;\n });\n this.event.mouse_move(function (movement, cartesian) {\n _this18.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n var fromDegreesArray = _this18.renewPositions(_this18.options.positions);\n _this18._nodeEditCallback(_this18.options.positions, _this18.lengthByMeter);\n return Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n }, false);\n for (var i = 0; i < this.options.positions.length; i++) {\n var entity = this.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: i,\n position: Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt),\n billboard: {\n image: this.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n this.nodePoints.push(entity);\n }\n }\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit() {\n YJ.Measure.SetMeasureStatus(false);\n this.ControllerObject && this.ControllerObject.destroy();\n this.event && that.event.destroy();\n this.tip && that.tip.destroy();\n this.tip = null;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n this._nodeEditCallback = null;\n }\n\n /**\r\n * 删除\r\n */\n }, {\n key: \"remove\",\n value: (function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.label && this.label.remove();\n this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context7.next = 8;\n return this.sdk.removeIncetance(this.options.id);\n case 8:\n _context7.next = 10;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(this.sdk, this.options.id);\n case 10:\n case \"end\":\n return _context7.stop();\n }\n }, _callee5, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n )\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this19 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.operate.positionEditing = status;\n if (status === true) {\n this.closeNodeEdit();\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var positions = JSON.parse(JSON.stringify(this.options.positions));\n // let positions2 = JSON.parse(JSON.stringify(positions))\n // for (let i = 0; i < positions2.length; i++) {\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions2[i].lng, positions2[i].lat))\n // positions2[i] = Cesium.Cartesian3.fromDegrees(\n // positions2[i].lng,\n // positions2[i].lat,\n // Number((positions2[i].alt + Number(height)).toFixed(2))\n // )\n // }\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(this.options.positions)\n };\n for (var i = 0; i < positions.length; i++) {\n positions[i] = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n }\n var center = positions[Math.floor(positions.length / 2)];\n var disparity = [];\n for (var _i24 = 0; _i24 < positions.length; _i24++) {\n center.x - positions[_i24].x;\n disparity.push({\n x: center.x - positions[_i24].x,\n y: center.y - positions[_i24].y,\n z: center.z - positions[_i24].z\n });\n }\n var newpositions = [];\n this.event.mouse_move(function (movement, cartesian) {\n newpositions = [];\n for (var _i25 = 0; _i25 < disparity.length; _i25++) {\n var newP = {\n x: cartesian.x - disparity[_i25].x,\n y: cartesian.y - disparity[_i25].y,\n z: cartesian.z - disparity[_i25].z\n };\n // let pos84 = this.cartesian3Towgs84(\n // newP,\n // this.sdk.viewer\n // )\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(pos84.lng, pos84.lat))\n // pos84.alt = Number((pos84.alt + Number(height)).toFixed(2))\n // newP = Cesium.Cartesian3.fromDegrees(\n // pos84.lng,\n // pos84.lat,\n // pos84.alt\n // )\n newpositions.push(newP);\n }\n var position84 = _this19.cartesian3Towgs84(newpositions[0], _this19.sdk.viewer);\n _this19.label.position = [position84.lng, position84.lat, position84.alt];\n _this19.options.label.position = {\n lng: position84.lng,\n lat: position84.lat,\n alt: position84.alt\n };\n _this19.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this19.event.mouse_move(function () {});\n _this19.event.mouse_left(function () {});\n _this19.event.mouse_right(function () {});\n newpositions = [];\n for (var _i26 = 0; _i26 < disparity.length; _i26++) {\n newpositions.push({\n x: cartesian.x - disparity[_i26].x,\n y: cartesian.y - disparity[_i26].y,\n z: cartesian.z - disparity[_i26].z\n });\n }\n var positionsLngLat = [];\n for (var _i27 = 0; _i27 < newpositions.length; _i27++) {\n var position = _this19.cartesian3Towgs84(newpositions[_i27], _this19.sdk.viewer);\n position.alt = _this19.options.positions[_i27].alt;\n positionsLngLat.push(position);\n _this19._elms.lng && (_this19._elms.lng[_i27].innerHTML = position.lng.toFixed(8));\n _this19._elms.lngInput && (_this19._elms.lngInput[_i27].value = position.lng.toFixed(8));\n _this19._elms.lat && (_this19._elms.lat[_i27].innerHTML = position.lat.toFixed(8));\n _this19._elms.latInput && (_this19._elms.latInput[_i27].value = position.lat.toFixed(8));\n _this19._elms.alt && (_this19._elms.alt[_i27].innerHTML = position.alt.toFixed(2));\n _this19._elms.altInput && (_this19._elms.altInput[_i27].value = position.alt.toFixed(2));\n }\n _this19.options.positions = positionsLngLat;\n _this19.previous.positions = positionsLngLat;\n\n // this.entity.polyline.positionsLngLat = positionsLngLat\n var fromDegreesArray = _this19.renewPositions(_this19.options.positions, function () {\n if (_this19._positionEditingCallback) {\n _this19._positionEditingCallback();\n _this19._positionEditingCallback = null;\n }\n });\n _this19.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this19.renewPolygon(fromDegreesArray);\n _this19.positionEditing = false;\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this19.event.mouse_move(function () {});\n _this19.event.mouse_left(function () {});\n _this19.event.mouse_right(function () {});\n _this19.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this19.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n // 长按取消\n _this19.event.mouse_move(function () {});\n _this19.event.mouse_left(function () {});\n _this19.event.mouse_right(function () {});\n _this19.positionEditing = false;\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (newpositions.length > 0) {\n return newpositions;\n } else {\n return positions;\n }\n }, false);\n } else {\n if (!this.sdk || !this.sdk.viewer || !this.label || !this.label.entity) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.heightMode) {\n case 0:\n case '0':\n case 1:\n case '1':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat, fromDegreesArray[2]];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n case 2:\n case '2':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n }\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n this._positionEditingCallback = cd;\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _Cesium$Cartesian,\n _this20 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: '',\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var points = [];\n for (var i = 0; i < this.options.positions.length; i++) {\n points.push([this.options.positions[i].lng, this.options.positions[i].lat]);\n }\n var line = turf.lineString(points);\n var length = turf.length(line, {\n units: 'kilometers'\n });\n var sliced = turf.lineSliceAlong(line, 0, length / 2, {\n units: 'kilometers'\n });\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(sliced.geometry.coordinates[sliced.geometry.coordinates.length - 1]));\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this20.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }], [{\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee6(that) {\n var height, ground;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee6$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n _context8.t0 = that.options.heightMode;\n _context8.next = _context8.t0 === '0' ? 3 : _context8.t0 === 0 ? 3 : _context8.t0 === '1' ? 6 : _context8.t0 === 1 ? 6 : _context8.t0 === '2' ? 13 : _context8.t0 === 2 ? 13 : 18;\n break;\n case 3:\n ground = false;\n height = that.options.positions[0].alt;\n return _context8.abrupt(\"break\", 18);\n case 6:\n ground = false;\n _context8.next = 9;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n });\n case 9:\n _context8.t1 = _context8.sent;\n _context8.t2 = that.options.positions[0].alt;\n height = _context8.t1 + _context8.t2;\n return _context8.abrupt(\"break\", 18);\n case 13:\n ground = true;\n _context8.next = 16;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n });\n case 16:\n height = _context8.sent;\n return _context8.abrupt(\"break\", 18);\n case 18:\n if (!that.options.label.position) {\n that.options.label.position = {\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat,\n alt: height\n };\n }\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_15__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far,\n ground: ground\n });\n case 20:\n case \"end\":\n return _context8.stop();\n }\n }, _callee6);\n }));\n function createLabel(_x3) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }, {\n key: \"create\",\n value: function create(that) {\n var ground;\n if (that.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n var positions = that.options.positions;\n var fromDegreesArray = that.renewPositions(positions);\n that.entity = that.sdk.viewer.entities.add({\n id: that.options.id,\n show: that.options.show,\n polyline: {\n positions: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray),\n width: that.options.width,\n clampToGround: ground,\n // material: that.getMaterial(that.options.color, that.options.type, that.entity, that.options),\n zIndex: that.sdk._entityZIndex\n }\n });\n that.entity.polyline.oriWidth = that.options.width;\n that.judgeLine(that.entity, that.options);\n var params = _objectSpread({}, that.options);\n params.speed = that.inputSpeed;\n that.entity.polyline.material = that.getMaterial(that.options.color, that.options.type, that.entity, params);\n that.sdk._entityZIndex++;\n PolylineObject.createLabel(that);\n // that.entity.polyline.positionsLngLat = positions\n that.renewPolygon(fromDegreesArray);\n that.computeDistance(positions, 2, that.options.wordsName).then(function (res) {\n that.lengthByMeter = res;\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(that.sdk, that.options.id);\n });\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__[\"setSplitDirection\"])(0, that.options.id);\n }\n\n // if (this.options.noseToTail) {\n // let array = []\n // for (let i = 0; i < fromDegreesArray.length; i += 2) {\n // array.push({ lng: fromDegreesArray[i], lat: fromDegreesArray[i + 1] })\n // }\n // this.options.fit_length = tool.computeDistance(array)\n // }\n // else {\n // this.options.fit_length = tool.computeDistance(positions)\n // }\n // if (this.options.fit_length_unit === 'km') {\n // this.options.fit_length = this.options.fit_length / 1000\n // }\n\n var scene = that.sdk.viewer.scene;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_11__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (PolylineObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvUG9seWxpbmVPYmplY3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvT2JqL0Jhc2UvUG9seWxpbmVPYmplY3QvaW5kZXguanM/YmM3OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQGRlc2NyaXB0aW9uIOe6v1xyXG4gKi9cclxuaW1wb3J0IERpYWxvZyBmcm9tICcuLi8uLi9FbGVtZW50L0RpYWxvZydcclxuaW1wb3J0IHsgaHRtbCB9IGZyb20gJy4vX2VsZW1lbnQnXHJcbmltcG9ydCBCYXNlIGZyb20gJy4uL2luZGV4J1xyXG5pbXBvcnQgY3lfdGFicyBmcm9tICcuLi8uLi9FbGVtZW50L2N5X2h0bWxfdGFicydcclxuaW1wb3J0IHJpY2hUZXh0IGZyb20gJy4uLy4uL0VsZW1lbnQvcmljaFRleHQnXHJcbmltcG9ydCBFdmVudEJpbmRpbmcgZnJvbSAnLi9ldmVudEJpbmRpbmcnXHJcbmltcG9ydCBMYWJlbE9iamVjdCBmcm9tICcuLi9MYWJlbE9iamVjdCdcclxuaW1wb3J0IE1vdXNlRXZlbnQgZnJvbSAnLi4vLi4vLi4vRXZlbnQvaW5kZXgnXHJcbmltcG9ydCBNb3VzZVRpcCBmcm9tICcuLi8uLi8uLi9Nb3VzZVRpcCdcclxuaW1wb3J0IENvbnRyb2xsZXIgZnJvbSAnLi4vLi4vLi4vQ29udHJvbGxlci9pbmRleCdcclxuaW1wb3J0IHsgc3luY0RhdGEsIGdldDNEVmlldyB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9NdWx0aVZpZXdwb3J0TW9kZSdcclxuaW1wb3J0IHsgbGVncCB9IGZyb20gJy4uLy4uL0VsZW1lbnQvZGF0YWxpc3QnXHJcbmltcG9ydCB7IGdldEZvbnRMaXN0LCBnZXRGb250RmFtaWx5TmFtZSB9IGZyb20gJy4uLy4uL0VsZW1lbnQvZm9udFNlbGVjdCdcclxuaW1wb3J0IHsgc2V0U3BsaXREaXJlY3Rpb24sIHN5bmNTcGxpdERhdGEsIHNldEFjdGl2ZUlkIH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL1NwbGl0U2NyZWVuJ1xyXG5pbXBvcnQgeyBzZXRBY3RpdmVWaWV3ZXIsIGNsb3NlUm90YXRlQXJvdW5kLCBjbG9zZVZpZXdGb2xsb3cgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvZ2xvYmFsJ1xyXG5cclxuY2xhc3MgUG9seWxpbmVPYmplY3QgZXh0ZW5kcyBCYXNlIHtcclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gc2RrXHJcbiAgICogQGRlc2NyaXB0aW9uIOaKmOe6v1xyXG4gICAqIEBwYXJhbSBvcHRpb25zIHtvYmplY3R9IOe6v+WxnuaAp1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLm5hbWV7c3RyaW5nfSDlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy53aWR0aD0ze251bWJlcn0g57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY29sb3I9I2ZmMDAwMCB7c3RyaW5nfSDpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy50eXBlPTAge251bWJlcn0g5p2Q6LSo57G75Z6LIDAt5a6e57q/IDEt6Jma57q/IDIt5rOb5YWJLi4uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0TW9kZT0ye251bWJlcn0g6auY5bqm5qih5byP77yIMO+8mua1t+aLlOmrmOW6pu+8mzHvvJrnm7jlr7npq5jluqbvvJsy77ya5L6d6ZmE5qih5byP77yJXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubm9zZVRvVGFpbD1mYWxzZSB7Ym9vbGVhbn0g6aaW5bC+55u46L+eXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc21vb3RoPWZhbHNlIHtib29sZWFufSDnur/mrrXlnIbmu5FcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRlbmQ9ZmFsc2Uge2Jvb2xlYW59IOe6v+e8k+WGslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmV4dGVuZFdpZHRoPTEwIHtudW1iZXJ9IOe6v+e8k+WGsuWuveW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmV4dGVuZENvbG9yPXJnYmEoMjU1LDI1NSw4MCwwLjMpIHtudW1iZXJ9IOe6v+e8k+WGsuminOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnNob3c9dHJ1ZSB7Ym9vbGVhbn0g5pi+6ZqQXHJcbiAgICogQHBhcmFtIHtBcnJheS48b2JqZWN0Pn0gb3B0aW9ucy5wb3NpdGlvbnMg5b+F5aGr77yM57uP57qs5bqm5ZKM6auY5bqm55qE5YiX6KGo77yM5YC85Lqk5pu/IFt7bG9uLGxhdCxhbHR9LC4uLl1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBcclxuICAgKiBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5ub3NlVG9UYWlsPWZhbHNlIHtib29sZWFufSDmmK/lkKbpppblsL7nm7jov55cclxuICAgKiBcclxuICAgKiBcclxuICAgKiBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbCB7b2JqZWN0fSDmoIfnrb7lr7nosaFcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC50ZXh0IHtzdHJpbmd9IOagh+etvuaWh+acrFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNob3cge3N0cmluZ30g5qCH562+5pi+6ZqQXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ge3N0cmluZ30g5qCH562+5L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ge29iamVjdH0g5qCH562+5L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZm9udFNpemU9MjAge251bWJlcn0g5a2X5L2T5aSn5bCPXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZm9udEZhbWlseT0wIHtudW1iZXJ9IOWtl+S9k+mhuSAw77ya6buR5L2T77ybMe+8muaAnea6kOm7keS9k++8mzLvvJrlup7pl6jmraPpgZPmoIfpopjkvZPvvJsz77ya5pWw6buR5L2TXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuY29sb3I9I2ZmZmZmZiB7c3RyaW5nfSDlrZfkvZPpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5saW5lV2lkdGg9NCB7bnVtYmVyfSDlvJXnur/lrr1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5saW5lQ29sb3I9IzAwZmZmZjgwIHtzdHJpbmd9IOW8lee6v+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0PTIwIHtudW1iZXJ9IOWtl+S9k+WBj+enuyjlvJXnur/plb/luqYpXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yPVsnIzAwZmZmZjgwJywgJyMwMGZmZmY4MCddIHthcnJheX0g6IOM5pmv6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlIHtib29sZWFufSDot53nprvnvKnmlL5cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5uZWFyPTIwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+R6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZmFyPTEwMDAwMCB7bnVtYmVyfSDop4bph47nvKnmlL7mnIDov5zot53nprtcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUge29iamVjdH0g5bGe5oCn5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbms9e30ge3N0cmluZ30g6ZO+5o6lXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudD1bXV0ge2FycmF5fSDpk77mjqXlhoXlrrlcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W10ubmFtZSB7c3RyaW5nfSDpk77mjqXlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W10udXJsIHtzdHJpbmd9IOmTvuaOpeWcsOWdgFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnJpY2hUZXh0Q29udGVudCB7c3RyaW5nfSDlr4zmlofmnKzlhoXlrrlcclxuICAgKiBcclxuICAgKiBcclxuICAgKiBAcGFyYW0gX0RpYWxvZyB7b2JqZWN0fSDlvLnmoYbkuovku7ZcclxuICAgKiBAcGFyYW0gX0RpYWxvZy5jb25maXJtQ2FsbEJhY2sge2Z1bmN0aW9ufSDlvLnmoYbnoa7orqTml7bnmoTlm57osINcclxuICAgKiAqL1xyXG4gIGNvbnN0cnVjdG9yKHNkaywgb3B0aW9ucyA9IHt9LCBfRGlhbG9nID0ge30pIHtcclxuICAgIHN1cGVyKHNkaywgb3B0aW9ucylcclxuICAgIHRoaXMub3B0aW9ucy5uYW1lID0gb3B0aW9ucy5uYW1lIHx8ICfmnKrlkb3lkI3lr7nosaEnXHJcbiAgICB0aGlzLm9wdGlvbnMud2lkdGggPSAoKG9wdGlvbnMud2lkdGggfHwgb3B0aW9ucy53aWR0aCA9PT0gMCkgPyBvcHRpb25zLndpZHRoIDogMylcclxuICAgIHRoaXMub3B0aW9ucy5jb2xvciA9IG9wdGlvbnMuY29sb3IgfHwgJyNmZjAwMDAnXHJcbiAgICB0aGlzLm9wdGlvbnMudHlwZSA9IG9wdGlvbnMudHlwZSA/IE51bWJlcihvcHRpb25zLnR5cGUpIDogMFxyXG4gICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgPSBvcHRpb25zLm5vc2VUb1RhaWwgfHwgZmFsc2VcclxuICAgIHRoaXMub3B0aW9ucy5zbW9vdGggPSBvcHRpb25zLnNtb290aCB8fCBmYWxzZVxyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZCA9IG9wdGlvbnMuZXh0ZW5kIHx8IGZhbHNlXHJcbiAgICB0aGlzLm9wdGlvbnMucm90YXRlID0gKG9wdGlvbnMucm90YXRlIHx8IG9wdGlvbnMucm90YXRlID09PSBmYWxzZSkgPyBvcHRpb25zLnJvdGF0ZSA6IHRydWVcclxuICAgIHRoaXMub3B0aW9ucy5zcGFjZSA9IG9wdGlvbnMuc3BhY2UgfHwgMVxyXG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gb3B0aW9ucy5zcGVlZCB8fCAxMFxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmRhc2hTaXplID0gb3B0aW9ucy5kYXNoU2l6ZSB8fCAwLjAzXHJcbiAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lID0gb3B0aW9ucy53b3Jkc05hbWUgfHwgJ+epuumXtOmVv+W6pidcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmRXaWR0aCA9XHJcbiAgICAgIG9wdGlvbnMuZXh0ZW5kV2lkdGggfHwgb3B0aW9ucy5leHRlbmRXaWR0aCA9PT0gMFxyXG4gICAgICAgID8gb3B0aW9ucy5leHRlbmRXaWR0aFxyXG4gICAgICAgIDogMTBcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmRDb2xvciA9IG9wdGlvbnMuZXh0ZW5kQ29sb3IgfHwgJ3JnYmEoMjU1LDI1NSw4MCwwLjMpJ1xyXG4gICAgdGhpcy5vcHRpb25zLnNob3cgPVxyXG4gICAgICBvcHRpb25zLnNob3cgfHwgb3B0aW9ucy5zaG93ID09PSBmYWxzZSA/IG9wdGlvbnMuc2hvdyA6IHRydWVcclxuICAgIHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlID0gKG9wdGlvbnMuaGVpZ2h0TW9kZSB8fCBvcHRpb25zLmhlaWdodE1vZGUgPT0gMCkgPyBvcHRpb25zLmhlaWdodE1vZGUgOiAyXHJcbiAgICB0aGlzLl9lbG1zID0gW11cclxuICAgIG9wdGlvbnMubGFiZWwgPSBvcHRpb25zLmxhYmVsIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwgPSB7XHJcbiAgICAgIHRleHQ6IHRoaXMub3B0aW9ucy5uYW1lLFxyXG4gICAgICBzaG93OiBvcHRpb25zLmxhYmVsLnNob3cgfHwgZmFsc2UsXHJcbiAgICAgIHBvc2l0aW9uOiBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLFxyXG4gICAgICBmb250U2l6ZTpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLmZvbnRTaXplIHx8IG9wdGlvbnMubGFiZWwuZm9udFNpemUgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gICAgICAgICAgOiAyMCxcclxuICAgICAgZm9udEZhbWlseTogb3B0aW9ucy5sYWJlbC5mb250RmFtaWx5ID8gb3B0aW9ucy5sYWJlbC5mb250RmFtaWx5IDogMCxcclxuICAgICAgY29sb3I6IG9wdGlvbnMubGFiZWwuY29sb3IgfHwgJyNmZmZmZmYnLFxyXG4gICAgICBsaW5lV2lkdGg6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5saW5lV2lkdGggfHwgb3B0aW9ucy5sYWJlbC5saW5lV2lkdGggPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICAgICAgICAgIDogNCxcclxuICAgICAgcGl4ZWxPZmZzZXQ6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCB8fCBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0ID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXRcclxuICAgICAgICAgIDogMjAsXHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IgfHwgWycjMDBmZmZmODAnLCAnIzAwZmZmZjgwJ10sXHJcbiAgICAgIGxpbmVDb2xvcjogb3B0aW9ucy5sYWJlbC5saW5lQ29sb3IgfHwgJyMwMGZmZmY4MCcsXHJcbiAgICAgIHNjYWxlQnlEaXN0YW5jZTogb3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgfHwgZmFsc2UsXHJcbiAgICAgIG5lYXI6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5uZWFyIHx8IG9wdGlvbnMubGFiZWwubmVhciA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLm5lYXJcclxuICAgICAgICAgIDogMjAwMCxcclxuICAgICAgZmFyOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwuZmFyIHx8IG9wdGlvbnMubGFiZWwuZmFyID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwuZmFyXHJcbiAgICAgICAgICA6IDEwMDAwMFxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZSA9IG9wdGlvbnMuYXR0cmlidXRlIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50ID1cclxuICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgfHwgW11cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEgfHwge31cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQgPVxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50IHx8IFtdXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ciB8fCB7fVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50ID1cclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50IHx8IFtdXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcyB8fCB7fVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50ID1cclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50IHx8IFtdXHJcblxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmFcclxuICAgICAgZGVsZXRlIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnJcclxuICAgICAgZGVsZXRlIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHNcclxuXHJcblxyXG4gICAgdGhpcy5vcGVyYXRlID0ge31cclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICB0aGlzLnVuaXROdW0gPSAwXHJcbiAgICB0aGlzLmlucHV0U3BlZWQgPSAob3B0aW9ucy5zcGVlZCAmJiBNYXRoLnBvdyhvcHRpb25zLnNwZWVkLCAtMSkgKiAxMDApIHx8IDEwXHJcbiAgICB0aGlzLkRpYWxvZyA9IF9EaWFsb2dcclxuICAgIGlmICghdGhpcy5vcHRpb25zLnBvc2l0aW9ucyB8fCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCA8IDIpIHtcclxuICAgICAgdGhpcy5fZXJyb3IgPSAn57q/5q615pyA5bCR6ZyA6KaB5Lik5Liq5Z2Q5qCH77yBJ1xyXG4gICAgICBjb25zb2xlLndhcm4odGhpcy5fZXJyb3IpXHJcbiAgICAgIHdpbmRvdy5FTEVNRU5UICYmXHJcbiAgICAgICAgd2luZG93LkVMRU1FTlQuTWVzc2FnZSh7XHJcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLl9lcnJvcixcclxuICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyA9IE51bWJlcihOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQgPSBOdW1iZXIoTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpKVxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ID0gTnVtYmVyKE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCkudG9GaXhlZCgyKSlcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZGsuYWRkSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZCwgdGhpcylcclxuICAgICAgUG9seWxpbmVPYmplY3QuY3JlYXRlKHRoaXMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBjb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSB2IHx8ICcjZmYwMDAwJ1xyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCB0aGlzLm9wdGlvbnMpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHBhcmFtcylcclxuICAgIGlmICh0aGlzLl9lbG1zLmNvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMuY29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMub3B0aW9ucy5jb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gY1xyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSAncmdiYSgyNTUsMCwwLDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5jb2xvcltpXSA9IGNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc3BlZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNwZWVkXHJcbiAgfVxyXG5cclxuICBzZXQgc3BlZWQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gdlxyXG4gICAgdGhpcy5pbnB1dFNwZWVkID0gdiAhPT0gMCA/IE1hdGgucG93KHYsIC0xKSAqIDEwMCA6IDBcclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIC8vIHRoaXMub3B0aW9ucy5zcGVlZCA9IHYgIT09IDAgPyBNYXRoLnBvdyh2LCAtMSkgKiAxMDAgOiAwXHJcbiAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gIH1cclxuICAvLyBnZXQgZGFzaFNpemUoKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmRhc2hTaXplXHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXQgZGFzaFNpemUodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmRhc2hTaXplID0gdlxyXG4gIC8vICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAvLyAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gIC8vICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCB0aGlzLm9wdGlvbnMpXHJcbiAgLy8gICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHBhcmFtcylcclxuICAvLyB9XHJcblxyXG4gIGdldCByb3RhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJvdGF0ZVxyXG4gIH1cclxuXHJcbiAgc2V0IHJvdGF0ZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMucm90YXRlID0gdlxyXG4gICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgIHRoaXMuX2VsbXMucm90YXRlICYmXHJcbiAgICAgIHRoaXMuX2VsbXMucm90YXRlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG5cclxuICAgIHRoaXMub3B0aW9ucy5yb3RhdGUgPSB2XHJcbiAgICBsZXQgcGFyYW1zID0geyAuLi50aGlzLm9wdGlvbnMgfVxyXG4gICAgcGFyYW1zLnNwZWVkID0gdGhpcy5pbnB1dFNwZWVkXHJcbiAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNwYWNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zcGFjZVxyXG4gIH1cclxuXHJcbiAgc2V0IHNwYWNlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5zcGFjZSA9IHZcclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCBwYXJhbXMpXHJcbiAgfVxyXG5cclxuICBnZXQgd29yZHNOYW1lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICB9XHJcbiAgc2V0IHdvcmRzTmFtZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lID0gdlxyXG4gICAgdGhpcy5fZWxtcy53b3Jkc05hbWUgJiZcclxuICAgICAgdGhpcy5fZWxtcy53b3Jkc05hbWUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIGlmICghdGhpcy5ub3NlVG9UYWlsKSB7XHJcbiAgICAgIHRoaXMuY29tcHV0ZURpc3RhbmNlKFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnMsXHJcbiAgICAgICAgMixcclxuICAgICAgICB2XHJcbiAgICAgICkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIC8vIF90aGlzLm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9IHJlc1xyXG4gICAgICAgIC8vIGlmIChyZXMgPiAxMDAwIHx8IHJlcyA9PSAxMDAwKSB7XHJcbiAgICAgICAgLy8gICBfdGhpcy5sZW5ndGggPSAocmVzIC8gMTAwMCkudG9GaXhlZCg1KVxyXG4gICAgICAgIC8vICAgX3RoaXMubGVuZ3RoVW5pdCA9ICfljYPnsbMnXHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgIF90aGlzLmxlbmd0aCA9IHJlc1xyXG4gICAgICAgIC8vICAgX3RoaXMubGVuZ3RoVW5pdCA9ICfnsbMnXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIF90aGlzLmxlbmd0aEJ5TWV0ZXIgPSByZXNcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IGZpdExlbmd0aFVuaXQoKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmZpdExlbmd0aFVuaXRcclxuICAvLyB9XHJcbiAgLy8gc2V0IGZpdExlbmd0aFVuaXQodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmZpdExlbmd0aFVuaXQgPSB2XHJcbiAgLy8gICB0aGlzLl9lbG1zLmZpdExlbmd0aFVuaXQgJiZcclxuICAvLyAgICAgdGhpcy5fZWxtcy5maXRMZW5ndGhVbml0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgLy8gICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAvLyAgICAgfSlcclxuICAvLyAgIGlmICh0aGlzLmZpdExlbmd0aEJ5TWV0ZXIpIHtcclxuICAvLyAgICAgc3dpdGNoICh2KSB7XHJcbiAgLy8gICAgICAgY2FzZSAn57GzJzpcclxuICAvLyAgICAgICAgIHRoaXMuZml0TGVuZ3RoID0gdGhpcy5maXRMZW5ndGhCeU1ldGVyXHJcbiAgLy8gICAgICAgICBicmVha1xyXG4gIC8vICAgICAgIGNhc2UgJ+WNg+exsyc6XHJcbiAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aCA9IE51bWJlcihcclxuICAvLyAgICAgICAgICAgKHRoaXMuZml0TGVuZ3RoQnlNZXRlciAvIDEwMDApLnRvRml4ZWQoNSlcclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIGJyZWFrXHJcbiAgLy8gICAgICAgZGVmYXVsdDpcclxuICAvLyAgICAgICAgIHRoaXMuZml0TGVuZ3RoID0gdGhpcy5maXRMZW5ndGhCeU1ldGVyXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIGdldCBsaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLndpZHRoXHJcbiAgfVxyXG5cclxuICBzZXQgbGluZVdpZHRoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy53aWR0aCA9ICh2IHx8IHYgPT0gMCkgPyB2IDogM1xyXG4gICAgdGhpcy5fZWxtcy5saW5lV2lkdGggJiZcclxuICAgICAgdGhpcy5fZWxtcy5saW5lV2lkdGguZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdGhpcy5vcHRpb25zLndpZHRoXHJcbiAgICAgIH0pXHJcbiAgICBpZiAodGhpcy5lbnRpdHkgJiYgdGhpcy5lbnRpdHkucG9seWxpbmUpIHtcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUud2lkdGggPSB0aGlzLmVudGl0eS5wb2x5bGluZS53aWR0aCArIHYgLSB0aGlzLmVudGl0eS5wb2x5bGluZS5vcmlXaWR0aFxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5vcmlXaWR0aCA9IHRoaXMub3B0aW9ucy53aWR0aFxyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5lbnRpdHkgJiZcclxuICAgIC8vICAgdGhpcy5lbnRpdHkucG9seWxpbmUgJiZcclxuICAgIC8vICAgKHRoaXMuZW50aXR5LnBvbHlsaW5lLndpZHRoID0gdGhpcy5vcHRpb25zLndpZHRoKSAmJiAodGhpcy5lbnRpdHkucG9seWxpbmUub3JpV2lkdGggPSB0aGlzLm9wdGlvbnMud2lkdGgpXHJcbiAgfVxyXG5cclxuICBnZXQgbGluZVR5cGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnR5cGVcclxuICB9XHJcblxyXG4gIHNldCBsaW5lVHlwZSh2KSB7XHJcbiAgICBsZXQgbGluZVR5cGVEYXRhID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBsaW5lXCI+PC9pPuWunue6vycsXHJcbiAgICAgICAgdmFsdWU6ICflrp7nur8nLFxyXG4gICAgICAgIGtleTogMCxcclxuICAgICAgICBpY29uOiAnbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZGFzaC1saW5lXCI+PC9pPuiZmue6vycsXHJcbiAgICAgICAgdmFsdWU6ICfomZrnur8nLFxyXG4gICAgICAgIGtleTogMSxcclxuICAgICAgICBpY29uOiAnZGFzaC1saW5lJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBsaWdodC1saW5lXCI+PC9pPuazm+WFiScsXHJcbiAgICAgICAgdmFsdWU6ICfms5vlhYknLFxyXG4gICAgICAgIGtleTogMixcclxuICAgICAgICBpY29uOiAnbGlnaHQtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gdGFpbC1saW5lXCI+PC9pPuWwvui/ueWFiee6vycsXHJcbiAgICAgICAgdmFsdWU6ICflsL7ov7nlhYnnur8nLFxyXG4gICAgICAgIGtleTogMyxcclxuICAgICAgICBpY29uOiAndGFpbC1saW5lJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBtdWx0LXRhaWwtbGluZVwiPjwvaT7lpJrlsL7ov7nlhYnnur8nLFxyXG4gICAgICAgIHZhbHVlOiAn5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICBrZXk6IDQsXHJcbiAgICAgICAgaWNvbjogJ211bHQtdGFpbC1saW5lJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBmbG93LWRhc2gtbGluZTFcIj48L2k+5rWB5Yqo6Jma57q/MScsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjomZrnur8xJyxcclxuICAgICAgICBrZXk6IDUsXHJcbiAgICAgICAgaWNvbjogJ2Zsb3ctZGFzaC1saW5lMSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZmxvdy1kYXNoLWxpbmUyXCI+PC9pPua1geWKqOiZmue6vzInLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAga2V5OiA2LFxyXG4gICAgICAgIGljb246ICdmbG93LWRhc2gtbGluZTInXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lMVwiPjwvaT7mtYHliqjnrq3lpLQxJyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDEnLFxyXG4gICAgICAgIGtleTogNyxcclxuICAgICAgICBpY29uOiAncGljLWxpbmUxJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTJcIj48L2k+5rWB5Yqo566t5aS0MicsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQyJyxcclxuICAgICAgICBrZXk6IDgsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lMidcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUzXCI+PC9pPua1geWKqOeureWktDMnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAga2V5OiA5LFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTMnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNFwiPjwvaT7mtYHliqjnrq3lpLQ0JyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDQnLFxyXG4gICAgICAgIGtleTogMTAsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lNCdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU1XCI+PC9pPua1geWKqOeureWktDUnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAga2V5OiAxMSxcclxuICAgICAgICBpY29uOiAncGljLWxpbmU1J1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTZcIj48L2k+5rWB5Yqo566t5aS0NicsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICBrZXk6IDEyLFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTYnXHJcbiAgICAgIH1cclxuICAgIF1cclxuICAgIHRoaXMub3B0aW9ucy50eXBlID0gTnVtYmVyKHYpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVUeXBlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAobGluZVR5cGVEYXRhW2ldLmtleSA9PT0gTnVtYmVyKHYpKSB7XHJcbiAgICAgICAgdGhpcy5fZWxtcy5saW5lVHlwZSAmJlxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5saW5lVHlwZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpdGVtLnZhbHVlID0gbGluZVR5cGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgIGlmICgyIDwgaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlIDwgMTMpIHsvL+i0tOWbvuWPguaVsFxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgyIDwgaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlIDwgNSkgey8v5bC+6L+55Y+C5pWwXHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMV0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMV0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gICAgdGhpcy5lbnRpdHkgJiZcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUgJiZcclxuICAgICAgKHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbChcclxuICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3IsXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnR5cGUsXHJcbiAgICAgICAgdGhpcy5lbnRpdHksXHJcbiAgICAgICAgcGFyYW1zXHJcbiAgICAgICkpXHJcbiAgfVxyXG4gIGdldCBub3NlVG9UYWlsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsXHJcbiAgfVxyXG5cclxuICBzZXQgbm9zZVRvVGFpbCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbCA9IHZcclxuICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICB0aGlzLl9lbG1zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgdGhpcy5fZWxtcy5ub3NlVG9UYWlsLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG4gICAgaWYgKHRoaXMuZW50aXR5KSB7XHJcbiAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgICAgIClcclxuICAgICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgIH1cclxuICAgIC8vIGlmICh2KSB7XHJcbiAgICAvLyAgIGlmICh0aGlzLm9wdGlvbnMuZml0TGVuZ3RoQnlNZXRlciA+IDEwMDAgfHwgdGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIgPT0gMTAwMCkge1xyXG4gICAgLy8gICAgIGxldCBkb20gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzFdXHJcbiAgICAvLyAgICAgZG9tICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzFdICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzFdLmNsaWNrKClcclxuICAgIC8vICAgfSBlbHNlIHtcclxuICAgIC8vICAgICBsZXQgZG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgLy8gICAgIGRvbSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVswXSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVswXS5jbGljaygpXHJcbiAgICAvLyAgIH1cclxuXHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgLy8gICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aEJ5TWV0ZXIgPiAxMDAwIHx8IHRoaXMub3B0aW9ucy5sZW5ndGhCeU1ldGVyID09IDEwMDApIHtcclxuICAgIC8vICAgICBsZXQgZG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgLy8gICAgIGRvbSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXS5jbGljaygpXHJcbiAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMV1cclxuICAgIC8vICAgICBkb20gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0uY2xpY2soKVxyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBnZXQgc21vb3RoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zbW9vdGhcclxuICB9XHJcblxyXG4gIHNldCBzbW9vdGgodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnNtb290aCA9IHZcclxuICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICB0aGlzLl9lbG1zLnNtb290aCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLnNtb290aC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICAgIGlmICh0aGlzLmVudGl0eSkge1xyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICApXHJcbiAgICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaGVpZ2h0TW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA/IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlIDogMFxyXG4gIH1cclxuICBzZXQgaGVpZ2h0TW9kZSh2KSB7XHJcbiAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9ICh2IHx8IHYgPT0gMCkgPyB2IDogMlxyXG4gICAgbGV0IGhlaWdodE1vZGVOYW1lID0gJydcclxuICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICBsZXQgZ3JvdW5kID0gZmFsc2VcclxuICAgIGxldCBkaXNhYmxlZCA9IGZhbHNlXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgICApXHJcbiAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICBjYXNlICcwJzpcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSBncm91bmRcclxuICAgICAgICB0aGlzLmV4dGVuZCA9IGZhbHNlXHJcbiAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn5rW35ouU6auY5bqmJ1xyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzEnOlxyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUuY2xhbXBUb0dyb3VuZCA9IGdyb3VuZFxyXG4gICAgICAgIHRoaXMuZXh0ZW5kID0gZmFsc2VcclxuICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfnm7jlr7nlnLDooagnXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMic6XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgZGlzYWJsZWQgPSB0cnVlXHJcbiAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUuY2xhbXBUb0dyb3VuZCA9IGdyb3VuZFxyXG4gICAgICAgIGhlaWdodE1vZGVOYW1lID0gJ+S+nemZhOaooeWeiydcclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKGdyb3VuZCkge1xyXG4gICAgICAgIHRoaXMubGFiZWwuZ3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlICYmICh0aGlzLl9lbG1zLmhlaWdodE1vZGUudmFsdWUgPSAn5L6d6ZmE5qih5Z6LJylcclxuICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdFxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmxhYmVsLmdyb3VuZCA9IGdyb3VuZFxyXG4gICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVsyXVxyXG4gICAgICAgIF1cclxuICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgbGF0OiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgIGFsdDogZnJvbURlZ3JlZXNBcnJheVsyXVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZXh0ZW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5leHRlbmRcclxuICB9XHJcblxyXG4gIHNldCBleHRlbmQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZCA9IHZcclxuICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICBpZiAodikge1xyXG4gICAgICB0aGlzLmhlaWdodE1vZGUgPSAyXHJcbiAgICB9XHJcbiAgICB0aGlzLl9lbG1zLmV4dGVuZCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmV4dGVuZC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICAgIGlmICh0aGlzLmVudGl0eSkge1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuZCkge1xyXG4gICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5lbnRpdHkucG9seWdvbiA9IHVuZGVmaW5lZFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZXh0ZW5kV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmV4dGVuZFdpZHRoXHJcbiAgfVxyXG5cclxuICBzZXQgZXh0ZW5kV2lkdGgodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZFdpZHRoID0gdlxyXG4gICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5oZWlnaHRNb2RlXHJcbiAgICB0aGlzLl9lbG1zLmV4dGVuZFdpZHRoICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuZXh0ZW5kV2lkdGguZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGV4dGVuZENvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5leHRlbmRDb2xvclxyXG4gIH1cclxuICBzZXQgZXh0ZW5kQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZENvbG9yID0gdlxyXG4gICAgaWYgKHRoaXMuX2VsbXMuZXh0ZW5kQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5leHRlbmRDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGV4dGVuZENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5leHRlbmRDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leHRlbmRDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leHRlbmRDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5leHRlbmRDb2xvcltpXSA9IGV4dGVuZENvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eSAmJlxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uICYmXHJcbiAgICAgICh0aGlzLmVudGl0eS5wb2x5Z29uLm1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhcclxuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kQ29sb3JcclxuICAgICAgKSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFNob3coKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLnNob3dcclxuICB9XHJcbiAgc2V0IGxhYmVsU2hvdyh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuc2hvdyA9IHZcclxuICAgIGlmICh0aGlzLnNob3cgJiYgIXRoaXMuc2hvd1ZpZXcgfHwgdGhpcy5zaG93VmlldyA9PSAzKSB7XHJcbiAgICAgIHRoaXMubGFiZWwuc2hvdyA9IHZcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gICAgICAgIF1cclxuICAgICAgfSwgMClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubGFiZWwuc2hvdyA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsU2hvdyAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsU2hvdy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRGYW1pbHkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHlcclxuICB9XHJcblxyXG4gIHNldCBsYWJlbEZvbnRGYW1pbHkodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPSB2IHx8IDBcclxuICAgIHRoaXMubGFiZWwgJiYgKHRoaXMubGFiZWwuZm9udEZhbWlseSA9IHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5KVxyXG5cclxuICAgIGxldCBuYW1lID0gZ2V0Rm9udEZhbWlseU5hbWUodGhpcy5sYWJlbEZvbnRGYW1pbHkpIHx8ICcnXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSBuYW1lXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3JcclxuICB9XHJcbiAgc2V0IGxhYmVsQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmNvbG9yID0gdlxyXG4gICAgdGhpcy5sYWJlbC5jb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvcltpXSA9IGxhYmVsQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRTaXplKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gIH1cclxuICBzZXQgbGFiZWxGb250U2l6ZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemUgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmZvbnRTaXplID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRTaXplICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxGb250U2l6ZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxTY2FsZUJ5RGlzdGFuY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZVxyXG4gIH1cclxuICBzZXQgbGFiZWxTY2FsZUJ5RGlzdGFuY2Uodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSA9IHZcclxuICAgIHRoaXMubGFiZWwuc2NhbGVCeURpc3RhbmNlID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFNjYWxlQnlEaXN0YW5jZSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsU2NhbGVCeURpc3RhbmNlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsTmVhcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubmVhclxyXG4gIH1cclxuICBzZXQgbGFiZWxOZWFyKHYpIHtcclxuICAgIGxldCBuZWFyID0gdlxyXG4gICAgaWYgKG5lYXIgPiB0aGlzLmxhYmVsRmFyKSB7XHJcbiAgICAgIG5lYXIgPSB0aGlzLmxhYmVsRmFyXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxOZWFyICYmIHRoaXMuX2VsbXMubGFiZWxOZWFyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IG5lYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGYXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZhclxyXG4gIH1cclxuICBzZXQgbGFiZWxGYXIodikge1xyXG4gICAgbGV0IGZhciA9IHZcclxuICAgIGlmIChmYXIgPCB0aGlzLmxhYmVsTmVhcikge1xyXG4gICAgICBmYXIgPSB0aGlzLmxhYmVsTmVhclxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZhciA9IGZhclxyXG4gICAgdGhpcy5sYWJlbC5mYXIgPSBmYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGYXIgJiYgdGhpcy5fZWxtcy5sYWJlbEZhci5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSBmYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxMaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gIH1cclxuICBzZXQgbGFiZWxMaW5lV2lkdGgodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA9IHZcclxuICAgIHRoaXMubGFiZWwubGluZVdpZHRoID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbExpbmVXaWR0aCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZVdpZHRoLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFBpeGVsT2Zmc2V0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gIH1cclxuICBzZXQgbGFiZWxQaXhlbE9mZnNldCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnBpeGVsT2Zmc2V0ID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFBpeGVsT2Zmc2V0ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxQaXhlbE9mZnNldC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG4gIGdldCBsYWJlbExpbmVDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubGluZUNvbG9yXHJcbiAgfVxyXG4gIHNldCBsYWJlbExpbmVDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubGluZUNvbG9yID0gdlxyXG4gICAgdGhpcy5sYWJlbC5saW5lQ29sb3IgPSB2XHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGluZUNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbExpbmVDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9ICdyZ2JhKDAsMjU1LDI1NSwwLjUpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvcltpXSA9IGxpbmVDb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXVxyXG4gIH1cclxuICBzZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdID0gdlxyXG4gICAgdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IgPSBbdiwgdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1dXHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRbXHJcbiAgICAgICAgICBpXHJcbiAgICAgICAgXSA9IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuICB9XHJcbiAgc2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV0gPSB2XHJcbiAgICB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvciA9IFt0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvclswXSwgdl1cclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRbaV0gPSBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZVR5cGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGVcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVUeXBlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlID0gdlxyXG4gICAgdGhpcy5fZWxtcy5hdHRyaWJ1dGVUeXBlICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuYXR0cmlidXRlVHlwZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgICBsZXQgYXR0cmlidXRlQ29udGVudCA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICdhdHRyaWJ1dGUtY29udGVudCdcclxuICAgIClcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlQ29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgYXR0cmlidXRlQ29udGVudFtpXS5jbGFzc05hbWUuaW5kZXhPZignYXR0cmlidXRlLWNvbnRlbnQtJyArIHYpID4gLTFcclxuICAgICAgKSB7XHJcbiAgICAgICAgYXR0cmlidXRlQ29udGVudFtpXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRlbnRbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlTGluaygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gIH1cclxuXHJcbiAgc2V0IGF0dHJpYnV0ZUxpbmsodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgPSB2XHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLl9EaWFsb2dPYmplY3QgfHxcclxuICAgICAgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudCB8fFxyXG4gICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQgfHxcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAnYXR0cmlidXRlLWNvbnRlbnQtbGluaydcclxuICAgICAgKS5sZW5ndGggPT0gMFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnKVsxXVxyXG4gICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gICAgdGFibGVDb250ZW50LmlubmVySFRNTCA9ICcnXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdHIgPVxyXG4gICAgICAgIGBcclxuICAgICAgPGRpdiBjbGFzcz1cInRyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpXS5uYW1lICtcclxuICAgICAgICBgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpXS51cmwgK1xyXG4gICAgICAgIGA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwibGlua0VkaXRcIj7nvJbovpE8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImxpbmtEZWxldGVcIj7liKDpmaQ8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5gXHJcbiAgICAgIGxldCB0ckVsbSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHRyKVxyXG4gICAgICB0YWJsZUNvbnRlbnQuYXBwZW5kQ2hpbGQodHJFbG0pXHJcbiAgICB9XHJcbiAgICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgICBsZXQgZnVuID0ge1xyXG4gICAgICBsaW5rRWRpdDogYXN5bmMgaW5kZXggPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IGF3YWl0IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC1saW5rJylbMV1cclxuICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgICAgICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gICAgICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gaXRlbVtpXS5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgbGV0IGh0bWwgPSBgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIHR5cGU9XCJ0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJpbnB1dCBsaW5rLWVkaXRcIiB0eXBlPVwidGV4dFwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY29uZmlybUVkaXRcIj7noa7orqQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjYW5jZWxFZGl0XCI+5Y+W5raIPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+YFxyXG4gICAgICAgICAgICBpdGVtW2ldLmlubmVySFRNTCA9IGh0bWxcclxuICAgICAgICAgICAgbGV0IHRleHRhcmVhRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rLWVkaXQnKVswXVxyXG4gICAgICAgICAgICB0ZXh0YXJlYUVsbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgLSAxMCArICdweCdcclxuICAgICAgICAgICAgbGV0IHRkID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgICAgICAgICAgIHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICAgJ2lucHV0J1xyXG4gICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaW5kZXhdLm5hbWVcclxuICAgICAgICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgICAnaW5wdXQnXHJcbiAgICAgICAgICAgIClbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpbmRleF0udXJsXHJcbiAgICAgICAgICAgIGxldCBidG4gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ0bi5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgICAgICAgIGlmICghYnRuW25dIHx8ICFidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAgICAgICAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5bbS52YWx1ZV0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXShcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlcclxuICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBsaW5rRGVsZXRlOiBpID0+IHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5zcGxpY2UoaSwgMSlcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICB9LFxyXG5cclxuICAgICAgY29uZmlybUVkaXQ6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBuYW1lID0gdmFsdWUubmFtZSAmJiB2YWx1ZS5uYW1lLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAgICAgICBsZXQgdXJsID0gdmFsdWUudXJsICYmIHZhbHVlLnVybC5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgdXJsKSB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpXSA9IHZhbHVlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHdpbmRvdy5FTEVNRU5UICYmXHJcbiAgICAgICAgICAgIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICflkI3np7DmiJbpk77mjqXkuI3og73kuLrnqbrvvIEnLFxyXG4gICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgICAgICAgICBkdXJhdGlvbjogMTUwMFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICB9LFxyXG4gICAgICBjYW5jZWxFZGl0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgfSxcclxuICAgICAgZmlsZVNlbGVjdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGZpbGVFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ZpbGUtc2VsZWN0JylbMF1cclxuICAgICAgICBmaWxlRWxtLmNsaWNrKClcclxuICAgICAgICBmaWxlRWxtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgICAgICAgZmlsZUVsbS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgZmlsZVNlbGVjdCA9IGV2ZW50ID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSkge1xyXG4gICAgICAgIGxldCB0ZCA9IGl0ZW1bXHJcbiAgICAgICAgICBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdpbmRleCcpXHJcbiAgICAgICAgXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZVxyXG4gICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IG51bGxcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBidG4gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ0bi5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgIGlmICghYnRuW25dIHx8ICFidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgY29udGludWVcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5bbS52YWx1ZV0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXShpKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldCBhdHRyaWJ1dGVDYW1lcmEoKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudFxyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0IGF0dHJpYnV0ZUNhbWVyYSh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50ID0gdlxyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IGF0dHJpYnV0ZVZyKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0IGF0dHJpYnV0ZVZyKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCA9IHZcclxuICAvLyAgIGlmIChcclxuICAvLyAgICAgIXRoaXMuX0RpYWxvZ09iamVjdCB8fFxyXG4gIC8vICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50IHx8XHJcbiAgLy8gICAgICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudCB8fFxyXG4gIC8vICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICdhdHRyaWJ1dGUtY29udGVudC12cidcclxuICAvLyAgICAgKS5sZW5ndGggPT0gMFxyXG4gIC8vICAgKSB7XHJcbiAgLy8gICAgIHJldHVyblxyXG4gIC8vICAgfVxyXG4gIC8vICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAvLyAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LXZyJylbMV1cclxuICAvLyAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAvLyAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAvLyAgIHRhYmxlQ29udGVudC5pbm5lckhUTUwgPSAnJ1xyXG4gIC8vICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgLy8gICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnXHJcbiAgLy8gICB9XHJcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICBsZXQgdHIgPVxyXG4gIC8vICAgICAgIGBcclxuICAvLyAgICAgPGRpdiBjbGFzcz1cInRyXCI+XHJcbiAgLy8gICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICtcclxuICAvLyAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0ubmFtZSArXHJcbiAgLy8gICAgICAgYDwvZGl2PlxyXG4gIC8vICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgLy8gICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldLnVybCArXHJcbiAgLy8gICAgICAgYDwvZGl2PlxyXG4gIC8vICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJ2ckVkaXRcIj7nvJbovpE8L2J1dHRvbj5cclxuICAvLyAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cInZyRGVsZXRlXCI+5Yig6ZmkPC9idXR0b24+XHJcbiAgLy8gICAgICAgICA8L2Rpdj5cclxuICAvLyAgICAgPC9kaXY+YFxyXG4gIC8vICAgICBsZXQgdHJFbG0gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0cilcclxuICAvLyAgICAgdGFibGVDb250ZW50LmFwcGVuZENoaWxkKHRyRWxtKVxyXG4gIC8vICAgfVxyXG4gIC8vICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gIC8vICAgbGV0IGZ1biA9IHtcclxuICAvLyAgICAgdnJFZGl0OiBhc3luYyBpbmRleCA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IGF3YWl0IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgLy8gICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtdnInKVsxXVxyXG4gIC8vICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAvLyAgICAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgLy8gICAgICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gIC8vICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgICAgaWYgKGluZGV4ID09PSBpKSB7XHJcbiAgLy8gICAgICAgICAgIGxldCBoZWlnaHQgPSBpdGVtW2ldLm9mZnNldEhlaWdodFxyXG4gIC8vICAgICAgICAgICBsZXQgaHRtbCA9IGBcclxuICAvLyAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAvLyAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0XCIgdHlwZT1cInRleHRcIj5cclxuICAvLyAgICAgICAgICAgICA8L2Rpdj5cclxuICAvLyAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAvLyAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImlucHV0IGxpbmstZWRpdFwiIHR5cGU9XCJ0ZXh0XCI+PC90ZXh0YXJlYT5cclxuICAvLyAgICAgICAgICAgICA8L2Rpdj5cclxuICAvLyAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAvLyAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjb25maXJtRWRpdFwiPuehruiupDwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNhbmNlbEVkaXRcIj7lj5bmtog8L2J1dHRvbj5cclxuICAvLyAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgLy8gICAgICAgICAgIGl0ZW1baV0uaW5uZXJIVE1MID0gaHRtbFxyXG4gIC8vICAgICAgICAgICBsZXQgdGV4dGFyZWFFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmstZWRpdCcpWzBdXHJcbiAgLy8gICAgICAgICAgIHRleHRhcmVhRWxtLnN0eWxlLmhlaWdodCA9IGhlaWdodCAtIDEwICsgJ3B4J1xyXG4gIC8vICAgICAgICAgICBsZXQgdGQgPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAvLyAgICAgICAgICAgdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAvLyAgICAgICAgICAgICAnaW5wdXQnXHJcbiAgLy8gICAgICAgICAgIClbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaW5kZXhdLm5hbWVcclxuICAvLyAgICAgICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAvLyAgICAgICAgICAgICAnaW5wdXQnXHJcbiAgLy8gICAgICAgICAgIClbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaW5kZXhdLnVybFxyXG4gIC8vICAgICAgICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAvLyAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAvLyAgICAgICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAvLyAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAvLyAgICAgICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlLFxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZVxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBpXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICApXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gIC8vICAgICAgICAgICAgICAgICBicmVha1xyXG4gIC8vICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBicmVha1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSxcclxuICAvLyAgICAgdnJEZWxldGU6IGkgPT4ge1xyXG4gIC8vICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5zcGxpY2UoaSwgMSlcclxuICAvLyAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gICAgIH0sXHJcblxyXG4gIC8vICAgICBjb25maXJtRWRpdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgLy8gICAgICAgbGV0IG5hbWUgPSB2YWx1ZS5uYW1lICYmIHZhbHVlLm5hbWUucmVwbGFjZSgvXFxzL2csICcnKVxyXG4gIC8vICAgICAgIGxldCB1cmwgPSB2YWx1ZS51cmwgJiYgdmFsdWUudXJsLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAvLyAgICAgICBpZiAobmFtZSAmJiB1cmwpIHtcclxuICAvLyAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXSA9IHZhbHVlXHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHdpbmRvdy5FTEVNRU5UICYmXHJcbiAgLy8gICAgICAgICAgIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gIC8vICAgICAgICAgICAgIG1lc3NhZ2U6ICflkI3np7DmiJbpk77mjqXkuI3og73kuLrnqbrvvIEnLFxyXG4gIC8vICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAvLyAgICAgICAgICAgICBkdXJhdGlvbjogMTUwMFxyXG4gIC8vICAgICAgICAgICB9KVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIGNhbmNlbEVkaXQ6ICgpID0+IHtcclxuICAvLyAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIGZpbGVTZWxlY3Q6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gIC8vICAgICAgIGxldCBmaWxlRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmaWxlLXNlbGVjdCcpWzBdXHJcbiAgLy8gICAgICAgZmlsZUVsbS5jbGljaygpXHJcbiAgLy8gICAgICAgZmlsZUVsbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gIC8vICAgICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgbGV0IGZpbGVTZWxlY3QgPSBldmVudCA9PiB7XHJcbiAgLy8gICAgIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAvLyAgICAgICBsZXQgdGQgPSBpdGVtW1xyXG4gIC8vICAgICAgICAgZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaW5kZXgnKVxyXG4gIC8vICAgICAgIF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gIC8vICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcclxuICAvLyAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBudWxsXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAvLyAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAvLyAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAvLyAgICAgICAgIGNvbnRpbnVlXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAvLyAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgLy8gICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gIC8vICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oaSlcclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgLy8gICAgICAgICAgIGJyZWFrXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXQgYXR0cmlidXRlR29vZHMoKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXQgYXR0cmlidXRlR29vZHModikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50ID0gdlxyXG4gIC8vIH1cclxuXHJcbiAgZ2V0IHBvc2l0aW9ucygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucG9zaXRpb25zXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYXN5bmMgY3JlYXRlTGFiZWwodGhhdCkge1xyXG4gICAgbGV0IGhlaWdodFxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgc3dpdGNoICh0aGF0Lm9wdGlvbnMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICBjYXNlICcwJzpcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgaGVpZ2h0ID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgaGVpZ2h0ID0gYXdhaXQgdGhhdC5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgICAgICAgIGxuZzogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICBsYXQ6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAgICAgfSkgKyB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzInOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGhlaWdodCA9IGF3YWl0IHRoYXQuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgbGF0OiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIGlmICghdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uKSB7XHJcbiAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgYWx0OiBoZWlnaHRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhhdC5sYWJlbCA9IG5ldyBMYWJlbE9iamVjdCh0aGF0LnNkaywge1xyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyA/IHRoYXQub3B0aW9ucy5sYWJlbC5zaG93IDogZmFsc2UsXHJcbiAgICAgIHBvc2l0aW9uOiBbXHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24ubGF0LFxyXG4gICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5hbHRcclxuICAgICAgXSxcclxuICAgICAgdGV4dDogdGhhdC5vcHRpb25zLm5hbWUsXHJcbiAgICAgIGZvbnRTaXplOiB0aGF0Lm9wdGlvbnMubGFiZWwuZm9udFNpemUsXHJcbiAgICAgIGZvbnRGYW1pbHk6IHRoYXQub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5LFxyXG4gICAgICBjb2xvcjogdGhhdC5vcHRpb25zLmxhYmVsLmNvbG9yLFxyXG4gICAgICBwaXhlbE9mZnNldDogdGhhdC5vcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0LFxyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IsXHJcbiAgICAgIGxpbmVDb2xvcjogdGhhdC5vcHRpb25zLmxhYmVsLmxpbmVDb2xvcixcclxuICAgICAgbGluZVdpZHRoOiB0aGF0Lm9wdGlvbnMubGFiZWwubGluZVdpZHRoLFxyXG4gICAgICBzY2FsZUJ5RGlzdGFuY2U6IHRoYXQub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UsXHJcbiAgICAgIG5lYXI6IHRoYXQub3B0aW9ucy5sYWJlbC5uZWFyLFxyXG4gICAgICBmYXI6IHRoYXQub3B0aW9ucy5sYWJlbC5mYXIsXHJcbiAgICAgIGdyb3VuZDogZ3JvdW5kXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNyZWF0ZSh0aGF0KSB7XHJcblxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgaWYgKHRoYXQuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGF0LnJlbmV3UG9zaXRpb25zKHBvc2l0aW9ucylcclxuICAgIHRoYXQuZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgIGlkOiB0aGF0Lm9wdGlvbnMuaWQsXHJcbiAgICAgIHNob3c6IHRoYXQub3B0aW9ucy5zaG93LFxyXG4gICAgICBwb2x5bGluZToge1xyXG4gICAgICAgIHBvc2l0aW9uczogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSksXHJcbiAgICAgICAgd2lkdGg6IHRoYXQub3B0aW9ucy53aWR0aCxcclxuICAgICAgICBjbGFtcFRvR3JvdW5kOiBncm91bmQsXHJcbiAgICAgICAgLy8gbWF0ZXJpYWw6IHRoYXQuZ2V0TWF0ZXJpYWwodGhhdC5vcHRpb25zLmNvbG9yLCB0aGF0Lm9wdGlvbnMudHlwZSwgdGhhdC5lbnRpdHksIHRoYXQub3B0aW9ucyksXHJcbiAgICAgICAgekluZGV4OiB0aGF0LnNkay5fZW50aXR5WkluZGV4XHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgdGhhdC5lbnRpdHkucG9seWxpbmUub3JpV2lkdGggPSB0aGF0Lm9wdGlvbnMud2lkdGhcclxuICAgIHRoYXQuanVkZ2VMaW5lKHRoYXQuZW50aXR5LCB0aGF0Lm9wdGlvbnMpXHJcbiAgICBsZXQgcGFyYW1zID0geyAuLi50aGF0Lm9wdGlvbnMgfVxyXG4gICAgcGFyYW1zLnNwZWVkID0gdGhhdC5pbnB1dFNwZWVkXHJcbiAgICB0aGF0LmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoYXQuZ2V0TWF0ZXJpYWwoXHJcbiAgICAgIHRoYXQub3B0aW9ucy5jb2xvcixcclxuICAgICAgdGhhdC5vcHRpb25zLnR5cGUsXHJcbiAgICAgIHRoYXQuZW50aXR5LFxyXG4gICAgICBwYXJhbXNcclxuICAgIClcclxuICAgIHRoYXQuc2RrLl9lbnRpdHlaSW5kZXgrK1xyXG4gICAgUG9seWxpbmVPYmplY3QuY3JlYXRlTGFiZWwodGhhdClcclxuICAgIC8vIHRoYXQuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9uc0xuZ0xhdCA9IHBvc2l0aW9uc1xyXG4gICAgdGhhdC5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgIHRoYXQuY29tcHV0ZURpc3RhbmNlKFxyXG4gICAgICBwb3NpdGlvbnMsXHJcbiAgICAgIDIsXHJcbiAgICAgIHRoYXQub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICkudGhlbihyZXMgPT4ge1xyXG4gICAgICB0aGF0Lmxlbmd0aEJ5TWV0ZXIgPSByZXNcclxuICAgICAgc3luY0RhdGEodGhhdC5zZGssIHRoYXQub3B0aW9ucy5pZClcclxuICAgIH0pXHJcbiAgICBpZiAodGhhdC5vcHRpb25zLnNob3cpIHtcclxuICAgICAgc2V0U3BsaXREaXJlY3Rpb24oMCwgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBpZiAodGhpcy5vcHRpb25zLm5vc2VUb1RhaWwpIHtcclxuICAgIC8vICAgbGV0IGFycmF5ID0gW11cclxuICAgIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcm9tRGVncmVlc0FycmF5Lmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAvLyAgICAgYXJyYXkucHVzaCh7IGxuZzogZnJvbURlZ3JlZXNBcnJheVtpXSwgbGF0OiBmcm9tRGVncmVlc0FycmF5W2kgKyAxXSB9KVxyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoID0gdG9vbC5jb21wdXRlRGlzdGFuY2UoYXJyYXkpXHJcbiAgICAvLyB9XHJcbiAgICAvLyBlbHNlIHtcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmZpdF9sZW5ndGggPSB0b29sLmNvbXB1dGVEaXN0YW5jZShwb3NpdGlvbnMpXHJcbiAgICAvLyB9XHJcbiAgICAvLyBpZiAodGhpcy5vcHRpb25zLmZpdF9sZW5ndGhfdW5pdCA9PT0gJ2ttJykge1xyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuZml0X2xlbmd0aCA9IHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoIC8gMTAwMFxyXG4gICAgLy8gfVxyXG5cclxuICAgIGxldCBzY2VuZSA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZVxyXG4gIH1cclxuICBqdWRnZUxpbmUoZW50aXR5LCBuZXdQYXJhbSkge1xyXG4gICAgaWYgKCFlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0KSB7XHJcbiAgICAgIGxldCBwYXJhbSA9IHtcclxuICAgICAgICBjb2xvcjogbmV3UGFyYW0uY29sb3IsXHJcbiAgICAgICAgaW1hZ2U6IHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArIGAvaW1nL2Fycm93LzEucG5nYCxcclxuICAgICAgICBzcGFjZTogbmV3UGFyYW0uc3BhY2UsXHJcbiAgICAgICAgc3BlZWQ6IG5ld1BhcmFtLnNwZWVkXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHBhcmFtLnNwZWVkID0gbmV3UGFyYW0ucm90YXRlID8gcGFyYW0uc3BlZWQgOiAwIC0gcGFyYW0uc3BlZWRcclxuXHJcbiAgICAgIGNvbnN0IGNhbnZhc0VsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICBjb25zdCBjdHggPSBjYW52YXNFbGUuZ2V0Q29udGV4dCgnMmQnKVxyXG4gICAgICBjb25zdCBteUltZyA9IG5ldyBJbWFnZSgpXHJcbiAgICAgIC8vIG15SW1nLnNyYyA9IHRoYXQuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL2Fycm93LzEucG5nJ1xyXG4gICAgICBteUltZy5zcmMgPSBwYXJhbS5pbWFnZVxyXG4gICAgICBsZXQgdGhhdCA9IHRoaXNcclxuICAgICAgbXlJbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNhbnZhc0VsZS53aWR0aCA9IG15SW1nLndpZHRoICogKHBhcmFtLnNwYWNlICsgMSlcclxuICAgICAgICBjYW52YXNFbGUuaGVpZ2h0ID0gbXlJbWcuaGVpZ2h0XHJcblxyXG4gICAgICAgIGxldCBvcmlSZXBlYXQgPSB0aGF0LmdldFNjZWVuTGluZShlbnRpdHksIHBhcmFtLCBjYW52YXNFbGUpXHJcbiAgICAgICAgb3JpUmVwZWF0ICYmIChlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0ID0gb3JpUmVwZWF0KVxyXG5cclxuXHJcbiAgICAgICAgdmFyIHBvc2l0aW9uUHJvcGVydHkgPSBlbnRpdHkucG9seWxpbmUucG9zaXRpb25zO1xyXG4gICAgICAgIHZhciBwb3NpdGlvbnMgPSBwb3NpdGlvblByb3BlcnR5LmdldFZhbHVlKHRoYXQuc2RrLnZpZXdlci5jbG9jay5jdXJyZW50VGltZSk7XHJcblxyXG4gICAgICAgIGlmICghQ2VzaXVtLmRlZmluZWQocG9zaXRpb25zKSkge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMigxLjAsIDEuMCk7XHJcbiAgICAgICAgICAvLyByZXR1cm4gMS4wO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGRpc3RhbmNlID0gMDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLSAxOyArK2kpIHtcclxuICAgICAgICAgIGRpc3RhbmNlICs9IENlc2l1bS5DYXJ0ZXNpYW4zLmRpc3RhbmNlKHBvc2l0aW9uc1tpXSwgcG9zaXRpb25zW2kgKyAxXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgcmVwZWF0WCA9IGRpc3RhbmNlIC8gZW50aXR5LnBvbHlsaW5lLndpZHRoLmdldFZhbHVlKCk7XHJcbiAgICAgICAgLy8g5qC55o2u5Zyw5Zu+57yp5pS+56iL5bqm6LCD5pW0cmVwZWF0WFxyXG4gICAgICAgIHZhciBjYW1lcmFIZWlnaHQgPSB0aGF0LnNkay52aWV3ZXIuY2FtZXJhLnBvc2l0aW9uQ2FydG9ncmFwaGljLmhlaWdodDtcclxuICAgICAgICB2YXIgYm91bmRpbmdTcGhlcmUgPSBuZXcgQ2VzaXVtLkJvdW5kaW5nU3BoZXJlKFxyXG4gICAgICAgICAgbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKC0xMDAwMDAwLCAwLCAwKSwgLy8g5Lit5b+D54K55Z2Q5qCHXHJcbiAgICAgICAgICA1MDAwMDAgLy8g5Y2K5b6E77yI6Led56a777yJXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8g6I635Y+W57uY5Zu+57yT5Yay5Yy655qE5a695bqm5ZKM6auY5bqm77yI6YCa5bi45piv5bGP5bmV55qE5YiG6L6o546H77yJXHJcbiAgICAgICAgdmFyIGRyYXdpbmdCdWZmZXJXaWR0aCA9IHRoYXQuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgdmFyIGRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGF0LnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICAgICAgLy8g5L2/55SoIGdldFBpeGVsU2l6ZSDmlrnms5Xojrflj5bljIXlm7TnkIPlnKjlsY/luZXkuIrnmoTlg4/ntKDlpKflsI9cclxuICAgICAgICB2YXIgZ3JvdW5kUmVzb2x1dGlvbiA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5jYW1lcmEuZ2V0UGl4ZWxTaXplKGJvdW5kaW5nU3BoZXJlLCBkcmF3aW5nQnVmZmVyV2lkdGgsIGRyYXdpbmdCdWZmZXJIZWlnaHQpXHJcbiAgICAgICAgcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKHBhcmFtLnNwYWNlICogKGNhbnZhc0VsZS53aWR0aCAvIGNhbnZhc0VsZS5oZWlnaHQgKiA1KSArIDEpO1xyXG4gICAgICAgIC8vIGlmIChlbnRpdHkucG9seWxpbmUubWF0ZXJpYWwub3JpUmVwZWF0KSB7XHJcblxyXG4gICAgICAgIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gQ2VzaXVtLlNjZW5lTW9kZS5TQ0VORTNEKSB7XHJcbiAgICAgICAgICBsZXQgc3BlZWQgPSByZXBlYXRYIC8gZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFxyXG4gICAgICAgICAgZW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkID0gc3BlZWRcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYID0gcmVwZWF0WFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgc2RrM2QgPSBnZXQzRFZpZXcoKVxyXG4gICAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhhdC5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgZW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkID0gc2RrM2RFbnRpdHkucG9seWxpbmUub3JpU3BlZWRcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYID0gc2RrM2RFbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIH1cclxuICB9XHJcbiAgLyoq6I635Y+W5b2T5YmN5ruh5bGP5qiq57q/6YCf5bqmICovXHJcbiAgZ2V0U2NlZW5MaW5lKGVudGl0eSwgb3B0aW9ucywgY2FudmFzRWxlKSB7XHJcbiAgICBsZXQgcG9pbnQxID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDAsIHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0KVxyXG4gICAgbGV0IHBvaW50MiA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMih0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoIC8gMiwgdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAvLyB2YXIgY2FydGVzaWFuMSA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5waWNrUG9zaXRpb24ocG9pbnQxKVxyXG4gICAgLy8gdmFyIGNhcnRlc2lhbjIgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MilcclxuXHJcbiAgICBsZXQgcmF5ID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5nZXRQaWNrUmF5KHBvaW50MSk7XHJcbiAgICBsZXQgY2FydGVzaWFuMSA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5waWNrKHJheSwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuXHJcbiAgICBsZXQgcmF5MiA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDIpO1xyXG4gICAgbGV0IGNhcnRlc2lhbjIgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXkyLCB0aGlzLnNkay52aWV3ZXIuc2NlbmUpO1xyXG4gICAgLy8gaWYgKCFjYXJ0ZXNpYW4xIHx8ICFjYXJ0ZXNpYW4yKSB7XHJcbiAgICAvLyAgIGxldCByYXkgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmdldFBpY2tSYXkocG9pbnQxKTtcclxuICAgIC8vICAgY2FydGVzaWFuMSA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5waWNrKHJheSwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuXHJcbiAgICAvLyAgIGxldCByYXkyID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5nZXRQaWNrUmF5KHBvaW50Mik7XHJcbiAgICAvLyAgIGNhcnRlc2lhbjIgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXkyLCB0aGlzLnNkay52aWV3ZXIuc2NlbmUpO1xyXG4gICAgLy8gfVxyXG4gICAgaWYgKGNhcnRlc2lhbjEgJiYgY2FydGVzaWFuMikge1xyXG5cclxuXHJcbiAgICAgIHZhciBkaXN0YW5jZSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmRpc3RhbmNlKGNhcnRlc2lhbjEsIGNhcnRlc2lhbjIpO1xyXG5cclxuICAgICAgdmFyIHJlcGVhdFggPSBkaXN0YW5jZSAvIGVudGl0eS5wb2x5bGluZS53aWR0aC5nZXRWYWx1ZSgpO1xyXG4gICAgICAvLyDmoLnmja7lnLDlm77nvKnmlL7nqIvluqbosIPmlbRyZXBlYXRYXHJcbiAgICAgIHZhciBjYW1lcmFIZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLnBvc2l0aW9uQ2FydG9ncmFwaGljLmhlaWdodDtcclxuICAgICAgdmFyIGJvdW5kaW5nU3BoZXJlID0gbmV3IENlc2l1bS5Cb3VuZGluZ1NwaGVyZShcclxuICAgICAgICBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoLTEwMDAwMDAsIDAsIDApLCAvLyDkuK3lv4PngrnlnZDmoIdcclxuICAgICAgICA1MDAwMDAgLy8g5Y2K5b6E77yI6Led56a777yJXHJcbiAgICAgICk7XHJcblxyXG5cclxuICAgICAgLy8g6I635Y+W57uY5Zu+57yT5Yay5Yy655qE5a695bqm5ZKM6auY5bqm77yI6YCa5bi45piv5bGP5bmV55qE5YiG6L6o546H77yJXHJcbiAgICAgIHZhciBkcmF3aW5nQnVmZmVyV2lkdGggPSB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoO1xyXG4gICAgICB2YXIgZHJhd2luZ0J1ZmZlckhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgICAgLy8g5L2/55SoIGdldFBpeGVsU2l6ZSDmlrnms5Xojrflj5bljIXlm7TnkIPlnKjlsY/luZXkuIrnmoTlg4/ntKDlpKflsI9cclxuICAgICAgdmFyIGdyb3VuZFJlc29sdXRpb24gPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuY2FtZXJhLmdldFBpeGVsU2l6ZShib3VuZGluZ1NwaGVyZSwgZHJhd2luZ0J1ZmZlcldpZHRoLCBkcmF3aW5nQnVmZmVySGVpZ2h0KVxyXG4gICAgICAvLyByZXBlYXRYICo9IGdyb3VuZFJlc29sdXRpb24gLyBjYW1lcmFIZWlnaHQgLyAoKG15SW1nLndpZHRoIC8gbXlJbWcuaGVpZ2h0ICogNSkgKyAxKTtcclxuICAgICAgaWYgKGdyb3VuZFJlc29sdXRpb24gPiA3MDApIHtcclxuICAgICAgICByZXBlYXRYICo9IGdyb3VuZFJlc29sdXRpb24gLyBjYW1lcmFIZWlnaHQgLyAob3B0aW9ucy5zcGFjZSAqIChjYW52YXNFbGUud2lkdGggLyBjYW52YXNFbGUuaGVpZ2h0ICogNSkgKyAxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXBlYXRYID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IENlc2l1bS5TY2VuZU1vZGUuU0NFTkUzRCkge1xyXG4gICAgICAgIHJldHVybiByZXBlYXRYXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IHNkazNkID0gZ2V0M0RWaWV3KClcclxuICAgICAgICBsZXQgc2RrM2RFbnRpdHkgPSBzZGszZC52aWV3ZXIuZW50aXRpZXMuZ2V0QnlJZCh0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgICAgcmV0dXJuIHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFhcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiDnvJbovpHmoYZcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN0YXRlIHRydWXmiZPlvIDvvIxmYWxzZeWFs+mXrVxyXG4gICAqL1xyXG4gIGFzeW5jIGVkaXQoc3RhdGUpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBpZiAoc3RhdGUpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gYXdhaXQgbmV3IERpYWxvZyh0aGlzLnNkaywgdGhpcy5vcHRpb25zLCB7XHJcbiAgICAgICAgdGl0bGU6ICfnur/lsZ7mgKcnLFxyXG4gICAgICAgIGxlZnQ6ICcxODBweCcsXHJcbiAgICAgICAgdG9wOiAnMTAwcHgnLFxyXG4gICAgICAgIGNvbmZpcm1DYWxsQmFjazogb3B0aW9ucyA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUudHJpbSgpXHJcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBsbmc6IHRoaXMubGFiZWwucG9zaXRpb25bMF0sXHJcbiAgICAgICAgICAgIGxhdDogdGhpcy5sYWJlbC5wb3NpdGlvblsxXSxcclxuICAgICAgICAgICAgYWx0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzJdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcHRpb25zKVxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayAmJlxyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICAgICAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgc3luY1NwbGl0RGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzZXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlc2V0Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVtb3ZlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsb3NlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5jbG9zZUNhbGxCYWNrKClcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyhmYWxzZSlcclxuICAgICAgICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NhbGxCYWNrOiBzaG93ID0+IHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnNob3dDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHJhbnNsYXRpb25hbENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9ICF0aGlzLnBvc2l0aW9uRWRpdGluZ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8g5LqM5qyh57yW6L6R5Zue6LCDXHJcbiAgICAgICAgc2Vjb25kYXJ5RWRpdENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vZGVFZGl0KClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmNsYXNzTmFtZSA9XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lICsgJyBwb2x5bGluZSdcclxuICAgICAgbGV0IGNvbnRlbnRFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICBjb250ZW50RWxtLmlubmVySFRNTCA9IGh0bWwodGhpcylcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNvbnRlbnRBcHBDaGlsZChjb250ZW50RWxtKVxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVR5cGUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZVxyXG4gICAgICAvLyB0aGlzLmF0dHJpYnV0ZUNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICAgICAgLy8gdGhpcy5hdHRyaWJ1dGVHb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG5cclxuICAgICAgZnVuY3Rpb24gdGFiQ2xpY2soZSkge1xyXG4gICAgICAgIGlmIChlID09PSAnMicgfHwgZSA9PT0gMikgey8v54K55Ye757q/5p2h5qC35byPXHJcbiAgICAgICAgICBpZiAoMiA8IF90aGlzLm9wdGlvbnMudHlwZSAmJiBfdGhpcy5vcHRpb25zLnR5cGUgPCAxMykgey8v6LS05Zu+5Y+C5pWwXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykgJiYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDliJvlu7rmoIfnrb7pobVcclxuICAgICAgbGV0IHRhYnNFbG0gPSBuZXcgY3lfdGFicyhcclxuICAgICAgICAncG9seWxpbmUtb2JqZWN0LWVkaXQtdGFicycsXHJcbiAgICAgICAgdGFiQ2xpY2ssXHJcbiAgICAgICAgdGhpcy5zZGtcclxuICAgICAgKVxyXG4gICAgICAvLyDpopzoibLnu4Tku7ZcclxuICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5jb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhYmVsQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGV4dGVuZENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2V4dGVuZENvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5leHRlbmRDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGFiZWxMaW5lQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsTGluZUNvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgX3RoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0JylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLFxyXG4gICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsXHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvckVuZCcpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JyxcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgYWxsX2VsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKVxyXG4gICAgICBFdmVudEJpbmRpbmcub24odGhpcywgYWxsX2VsbSlcclxuICAgICAgdGhpcy5fZWxtcyA9IEV2ZW50QmluZGluZy5lbGVtZW50XHJcbiAgICAgIHRoaXMuX2VsbXMuY29sb3IgPSBbY29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvciA9IFtsYWJlbENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmV4dGVuZENvbG9yID0gW2V4dGVuZENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yID0gW2xpbmVDb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gW190aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXJdXHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIC8vIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgICAgICAvLyB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAgICAgLy8gdGhpcy5nb29kc1NlbGVjdCAmJiB0aGlzLmdvb2RzU2VsZWN0KClcclxuICAgICAgICBsZXQgdGFnRGF0YSA9IHRoaXMuYXR0cmlidXRlU2VsZWN0XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZUVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnYXR0cmlidXRlLXNlbGVjdC1ib3gnXHJcbiAgICAgICAgKVswXVxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVFbG0pIHtcclxuICAgICAgICAgIGxldCBsZWdwT2JqZWN0ID0gbGVncChhdHRyaWJ1dGVFbG0sICcuYXR0cmlidXRlLXNlbGVjdCcpXHJcbiAgICAgICAgICBsZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKHRhZ0RhdGEpXHJcbiAgICAgICAgICBsZXQgYXR0cmlidXRlU2VsZWN0RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGFnRGF0YVtpXS5rZXkgPT09IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlU2VsZWN0RWxtLnZhbHVlID0gdGFnRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUodGFnRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLnZhbHVlID09PSBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRhZ0RhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuYW1lRGF0YSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+epuumXtOmVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn56m66Ze06ZW/5bqmJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+aKleW9semVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5oqV5b2x6ZW/5bqmJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+WcsOihqOmVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5Zyw6KGo6ZW/5bqmJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgbGV0IG5hbWVEYXRhTGVncE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnaW5wdXQtc2VsZWN0LXVuaXQtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaW5wdXQtc2VsZWN0LXVuaXQnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChuYW1lRGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIG5hbWVEYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaChuYW1lRGF0YSlcclxuICAgICAgICAgIGxldCBuYW1lRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHRoaXMuX2VsbXMud29yZHNOYW1lID0gW25hbWVEYXRhTGVncEVsbV1cclxuICAgICAgICAgIG5hbWVEYXRhTGVncEVsbS52YWx1ZSA9IHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKG5hbWVEYXRhW2ldLnZhbHVlID09PSBuYW1lRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBuYW1lRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUobmFtZURhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbmFtZURhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5hbWVEYXRhW2ldLnZhbHVlID09PSBuYW1lRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud29yZHNOYW1lID0gbmFtZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5Y6f5aeL6ZW/5bqm5Y2V5L2NXHJcbiAgICAgICAgbGV0IHVuaXREYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn57GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfnsbMnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5Y2D57GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfljYPnsbMnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICBsZXQgdW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdpbnB1dC1zZWxlY3QtdW5pdC1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5pbnB1dC1zZWxlY3QtdW5pdCcsXHJcbiAgICAgICAgICAxXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmICh1bml0RGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaCh1bml0RGF0YSlcclxuICAgICAgICAgIGxldCB1bml0RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHRoaXMuX2VsbXMubGVuZ3RoVW5pdCA9IFt1bml0RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BFbG0udmFsdWUgPSB0aGlzLm9wdGlvbnMubGVuZ3RoVW5pdFxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh1bml0RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZW5ndGhVbml0ID0gdW5pdERhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL1xyXG5cclxuXHJcbiAgICAgICAgLy8g5ouf5ZCI6ZW/5bqm5Y2V5L2NXHJcbiAgICAgICAgLy8gbGV0IGZpdFVuaXREYXRhID0gW1xyXG4gICAgICAgIC8vICAge1xyXG4gICAgICAgIC8vICAgICBuYW1lOiAn57GzJyxcclxuICAgICAgICAvLyAgICAgdmFsdWU6ICfnsbMnXHJcbiAgICAgICAgLy8gICB9LFxyXG4gICAgICAgIC8vICAge1xyXG4gICAgICAgIC8vICAgICBuYW1lOiAn5Y2D57GzJyxcclxuICAgICAgICAvLyAgICAgdmFsdWU6ICfljYPnsbMnXHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gXVxyXG5cclxuICAgICAgICAvLyBsZXQgZml0VW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAvLyAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgLy8gICAgICdpbnB1dC1zZWxlY3QtZml0LXVuaXQtYm94J1xyXG4gICAgICAgIC8vICAgKVswXSxcclxuICAgICAgICAvLyAgICcuaW5wdXQtc2VsZWN0LWZpdC11bml0J1xyXG4gICAgICAgIC8vIClcclxuICAgICAgICAvLyBpZiAoZml0VW5pdERhdGFMZWdwT2JqZWN0KSB7XHJcbiAgICAgICAgLy8gICBmaXRVbml0RGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2goZml0VW5pdERhdGEpXHJcbiAgICAgICAgLy8gICBsZXQgZml0VW5pdERhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAvLyAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC1maXQtdW5pdCcpWzBdXHJcbiAgICAgICAgLy8gICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgIC8vICAgdGhpcy5fZWxtcy5maXRMZW5ndGhVbml0ID0gW2ZpdFVuaXREYXRhTGVncEVsbV1cclxuICAgICAgICAvLyAgIGZpdFVuaXREYXRhTGVncEVsbS52YWx1ZSA9IHRoaXMub3B0aW9ucy5maXRMZW5ndGhVbml0XHJcbiAgICAgICAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGZpdFVuaXREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIGlmIChmaXRVbml0RGF0YVtpXS52YWx1ZSA9PT0gZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgZml0VW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGZpdFVuaXREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgIC8vICAgICAgIGJyZWFrXHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyAgIGZpdFVuaXREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXRVbml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vICAgICAgIGlmIChmaXRVbml0RGF0YVtpXS52YWx1ZSA9PT0gZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aFVuaXQgPSBmaXRVbml0RGF0YVtpXS52YWx1ZVxyXG4gICAgICAgIC8vICAgICAgICAgYnJlYWtcclxuICAgICAgICAvLyAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgIH0pXHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBsZXQgbGluZVR5cGVEYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGxpbmVcIj48L2k+5a6e57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICflrp7nur8nLFxyXG4gICAgICAgICAgICBrZXk6IDAsXHJcbiAgICAgICAgICAgIGljb246ICdsaW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBkYXNoLWxpbmVcIj48L2k+6Jma57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfomZrnur8nLFxyXG4gICAgICAgICAgICBrZXk6IDEsXHJcbiAgICAgICAgICAgIGljb246ICdkYXNoLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGxpZ2h0LWxpbmVcIj48L2k+5rOb5YWJJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfms5vlhYknLFxyXG4gICAgICAgICAgICBrZXk6IDIsXHJcbiAgICAgICAgICAgIGljb246ICdsaWdodC1saW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiB0YWlsLWxpbmVcIj48L2k+5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICflsL7ov7nlhYnnur8nLFxyXG4gICAgICAgICAgICBrZXk6IDMsXHJcbiAgICAgICAgICAgIGljb246ICd0YWlsLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIG11bHQtdGFpbC1saW5lXCI+PC9pPuWkmuWwvui/ueWFiee6vycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAga2V5OiA0LFxyXG4gICAgICAgICAgICBpY29uOiAnbXVsdC10YWlsLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGZsb3ctZGFzaC1saW5lMVwiPjwvaT7mtYHliqjomZrnur8xJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjomZrnur8xJyxcclxuICAgICAgICAgICAga2V5OiA1LFxyXG4gICAgICAgICAgICBpY29uOiAnZmxvdy1kYXNoLWxpbmUxJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBmbG93LWRhc2gtbGluZTJcIj48L2k+5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAgICAgIGtleTogNixcclxuICAgICAgICAgICAgaWNvbjogJ2Zsb3ctZGFzaC1saW5lMidcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUxXCI+PC9pPua1geWKqOeureWktDEnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDEnLFxyXG4gICAgICAgICAgICBrZXk6IDcsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTEnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lMlwiPjwvaT7mtYHliqjnrq3lpLQyJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQyJyxcclxuICAgICAgICAgICAga2V5OiA4LFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmUyJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTNcIj48L2k+5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAgICAgIGtleTogOSxcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lMydcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU0XCI+PC9pPua1geWKqOeureWktDQnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDQnLFxyXG4gICAgICAgICAgICBrZXk6IDEwLFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmU0J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTVcIj48L2k+5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAgICAgIGtleTogMTEsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNlwiPjwvaT7mtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICAgICAga2V5OiAxMixcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lNidcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2lucHV0LXNlbGVjdC1saW5lLXR5cGUtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaW5wdXQtc2VsZWN0LWxpbmUtdHlwZSdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2gobGluZVR5cGVEYXRhKVxyXG5cclxuICAgICAgICAgIGxldCBpQWN0aXZlRWxtMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKVxyXG4gICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gJ2ljb24gaWNvbi1hY3RpdmUnXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtbGluZS10eXBlJylbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY3lfZGF0YWxpc3QnKVswXS5hcHBlbmRDaGlsZChpQWN0aXZlRWxtMilcclxuXHJcbiAgICAgICAgICBsZXQgbGluZVR5cGVEYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtbGluZS10eXBlJylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxpbmVUeXBlID0gW2xpbmVUeXBlRGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVUeXBlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobGluZVR5cGVEYXRhW2ldLmtleSA9PT0gdGhpcy5vcHRpb25zLnR5cGUpIHtcclxuICAgICAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGxpbmVUeXBlRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwRWxtLnZhbHVlID0gbGluZVR5cGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gYGljb24gaWNvbi1hY3RpdmUgJHtsaW5lVHlwZURhdGFbaV0uaWNvbn1gXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGluZVR5cGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVHlwZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAobGluZVR5cGVEYXRhW2ldLnZhbHVlID09PSBsaW5lVHlwZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVUeXBlID0gbGluZVR5cGVEYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gYGljb24gaWNvbi1hY3RpdmUgJHtsaW5lVHlwZURhdGFbaV0uaWNvbn1gXHJcblxyXG4gICAgICAgICAgICAgICAgLy/mjqfliLblj4LmlbDmmL7pmpBcclxuICAgICAgICAgICAgICAgIGlmICgyIDwgdGhpcy5saW5lVHlwZSAmJiB0aGlzLmxpbmVUeXBlIDwgMTMpIHsvL+i0tOWbvuWPguaVsFxyXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKDIgPCB0aGlzLmxpbmVUeXBlICYmIHRoaXMubGluZVR5cGUgPCA1KSB7Ly/lsL7ov7nlj4LmlbBcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgIGxldCBoZWlnaHRCb3hFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtYm94JylbMF1cclxuICAgICAgICBsZXQgaGVpZ2h0RWxtID0gaGVpZ2h0Qm94RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodCcpWzBdXHJcbiAgICAgICAgbGV0IGhlaWdodENvbmZpcm1FbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtY29uZmlybScpWzBdXHJcbiAgICAgICAgaGVpZ2h0RWxtLnZhbHVlID0gMTBcclxuICAgICAgICBpZiAodGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94IGRpc2FibGVkJyk7XHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtICYmIGhlaWdodENvbmZpcm1FbG0uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94Jyk7XHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtICYmIGhlaWdodENvbmZpcm1FbG0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaGVpZ2h0TW9kZURhdGEgPSBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1t+aLlOmrmOW6picsXHJcbiAgICAgICAgICAgIGtleTogJzAnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn55u45a+55Zyw6KGoJyxcclxuICAgICAgICAgICAga2V5OiAnMScsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5L6d6ZmE5qih5Z6LJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfkvp3pmYTmqKHlnosnLFxyXG4gICAgICAgICAgICBrZXk6ICcyJyxcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGhlaWdodE1vZGVPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2hlaWdodC1tb2RlLWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmhlaWdodC1tb2RlJ1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoaGVpZ2h0TW9kZU9iamVjdCkge1xyXG4gICAgICAgICAgaGVpZ2h0TW9kZU9iamVjdC5sZWdwX3NlYXJjaChoZWlnaHRNb2RlRGF0YSlcclxuICAgICAgICAgIGxldCBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LW1vZGUnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLmtleSA9PSB0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUgPSBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoXHJcbiAgICAgICAgICAgICAgICBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAoaGVpZ2h0TW9kZURhdGFbaV0udmFsdWUgPT09IGhlaWdodE1vZGVEYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBoZWlnaHRFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHQgPSBoZWlnaHRFbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ID0gaGVpZ2h0Qm94RWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgPSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSA9IGhlaWdodENvbmZpcm1FbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCA9IGhlaWdodE1vZGVPYmplY3RcclxuXHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ID0gTnVtYmVyKCh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCArIE51bWJlcihoZWlnaHRFbG0udmFsdWUpKS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICAgIHRoaXMuX2VsbXMuYWx0W2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgICAgICAgKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0YWJsZUVsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3BhdGlhbC1pbmZvLXRhYmxlJylbMF1cclxuICAgICAgICBsZXQgdEJvZHlFbG0gPSB0YWJsZUVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICB0aGlzLl9lbG1zLmxuZyA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sbmdJbnB1dCA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYXQgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGF0SW5wdXQgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMuYWx0ID0gW11cclxuICAgICAgICB0aGlzLl9lbG1zLmFsdElucHV0ID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXHJcbiAgICAgICAgICB0ci5jbGFzc05hbWUgPSAndHInXHJcbiAgICAgICAgICB0ci5pbm5lckhUTUwgPSBgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPiR7aSArIDF9PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsbmcgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsYXQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBhbHQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICBgXHJcbiAgICAgICAgICBsZXQgbG5nQm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nJylbMF1cclxuICAgICAgICAgIGxldCBsbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGxuZy5pbm5lckhUTUwgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmcpXHJcbiAgICAgICAgICBsZXQgbG5nSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsbmdJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsbmdJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxuZ0lucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxuZ0lucHV0Lm1pbiA9IC0xODBcclxuICAgICAgICAgIGxuZ0lucHV0Lm1heCA9IDE4MFxyXG4gICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuXHJcbiAgICAgICAgICBsZXQgbGF0Qm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0JylbMF1cclxuICAgICAgICAgIGxldCBsYXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGxhdC5pbm5lckhUTUwgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXQpXHJcbiAgICAgICAgICBsZXQgbGF0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsYXRJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsYXRJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxhdElucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxhdElucHV0Lm1pbiA9IC05MFxyXG4gICAgICAgICAgbGF0SW5wdXQubWF4ID0gOTBcclxuICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGFsdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FsdCcpWzBdXHJcbiAgICAgICAgICBsZXQgYWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBhbHQuaW5uZXJIVE1MID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KS50b0ZpeGVkKDIpXHJcbiAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0KVxyXG4gICAgICAgICAgbGV0IGFsdElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgYWx0SW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgYWx0SW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBhbHRJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBhbHRJbnB1dC5taW4gPSAtOTk5OTk5OVxyXG4gICAgICAgICAgYWx0SW5wdXQubWF4ID0gOTk5OTk5OTk5XHJcbiAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCkudG9GaXhlZCgyKVxyXG5cclxuICAgICAgICAgIGxuZ0JveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgbG5nQm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmdJbnB1dClcclxuICAgICAgICAgICAgbG5nSW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbG5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nQm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmcpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbG5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nID0gTnVtYmVyKE51bWJlcihsbmdJbnB1dC52YWx1ZSkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LCBmcm9tRGVncmVlc0FycmF5WzJdXVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBsYXRCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0SW5wdXQpXHJcbiAgICAgICAgICAgIGxhdElucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCA9IE51bWJlcihOdW1iZXIobGF0SW5wdXQudmFsdWUpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdC5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCwgZnJvbURlZ3JlZXNBcnJheVsyXV1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgYWx0Qm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWx0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHRJbnB1dClcclxuICAgICAgICAgICAgYWx0SW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYWx0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHQpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYWx0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ID0gTnVtYmVyKE51bWJlcihhbHRJbnB1dC52YWx1ZSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0LmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0LnRvRml4ZWQoMilcclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LCBmcm9tRGVncmVlc0FycmF5WzJdXVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxuZy5wdXNoKGxuZylcclxuICAgICAgICAgIHRoaXMuX2VsbXMubG5nSW5wdXQucHVzaChsbmdJbnB1dClcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGF0LnB1c2gobGF0KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYXRJbnB1dC5wdXNoKGxhdElucHV0KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5hbHQucHVzaChhbHQpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmFsdElucHV0LnB1c2goYWx0SW5wdXQpXHJcbiAgICAgICAgICB0Qm9keUVsbS5hcHBlbmRDaGlsZCh0cilcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBsZXQgZm9udERhdGEgPSBnZXRGb250TGlzdCgpXHJcbiAgICAgICAgbGV0IGZvbnRPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2ZvbnQtc2VsZWN0LWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmZvbnQtc2VsZWN0J1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoZm9udE9iamVjdCkge1xyXG4gICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaChmb250RGF0YSlcclxuICAgICAgICAgIGxldCBmb250RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZm9udC1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS52YWx1ZSA9IGZvbnREYXRhW3RoaXMubGFiZWxGb250RmFtaWx5XS52YWx1ZVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShmb250RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb250RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT09IGZvbnREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbEZvbnRGYW1pbHkgPSBmb250RGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgPSBbZm9udERhdGFMZWdwRWxtXVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgMClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOW5s+a7keWkhOeQhlxyXG4gIHNtb290aEhhbmRsZShwb3NpdGlvbnMpIHtcclxuICAgIGxldCBuZXdQb3NpdGlvbnMgPSBbXVxyXG4gICAgbGV0IHRpbWUgPSBbXVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzLnB1c2goXHJcbiAgICAgICAgcG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgIHBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgKVxyXG4gICAgICB0aW1lLnB1c2goaSAvIChwb3NpdGlvbnMubGVuZ3RoIC0gMSkpXHJcbiAgICB9XHJcbiAgICBsZXQgc3BsaW5lID0gbmV3IENlc2l1bS5DYXRtdWxsUm9tU3BsaW5lKHtcclxuICAgICAgdGltZXM6IHRpbWUsXHJcbiAgICAgIHBvaW50czogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheUhlaWdodHMpXHJcbiAgICB9KVxyXG4gICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGggKiAyMFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGNhcnRlc2lhbjMgPSBzcGxpbmUuZXZhbHVhdGUoaSAvIGxlbmd0aClcclxuICAgICAgbmV3UG9zaXRpb25zLnB1c2godGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4zLCB0aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1Bvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5Z2Q5qCHXHJcbiAgcmVuZXdQb3NpdGlvbnMocG9zaXRpb25zQXJyYXksIGNkKSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgcG9zaXRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwb3NpdGlvbnNBcnJheSkpXHJcbiAgICBsZXQgZ3JvdW5kXHJcbiAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KSlcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5hbHQgPSBoZWlnaHQgPyBOdW1iZXIoKHBvc2l0aW9uc1tpXS5hbHQgKyBOdW1iZXIoaGVpZ2h0KSkudG9GaXhlZCgyKSkgOiBOdW1iZXIoKHBvc2l0aW9uc1tpXS5hbHQpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIGxldCBuZXdQb3NpdGlvbnNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgIT09ICdmYWxzZSdcclxuICAgICkge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSBbLi4ucG9zaXRpb25zLCBwb3NpdGlvbnNbMF1dXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSBbLi4ucG9zaXRpb25zXVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zbW9vdGggJiYgdGhpcy5vcHRpb25zLnNtb290aCAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSB0aGlzLnNtb290aEhhbmRsZShuZXdQb3NpdGlvbnMpXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3UG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gICAgICAgICAgbmV3UG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgIG5ld1Bvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICBuZXdQb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1Bvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAgICAgICAgIG5ld1Bvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICBuZXdQb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgbmV3UG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOiuoeeul+mVv+W6plxyXG4gICAgaWYgKFxyXG4gICAgICAodGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgICB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbCAhPT0gJ2ZhbHNlJykgfHxcclxuICAgICAgKHRoaXMub3B0aW9ucy5zbW9vdGggJiYgdGhpcy5vcHRpb25zLnNtb290aCAhPT0gJ2ZhbHNlJylcclxuICAgICkge1xyXG4gICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb21EZWdyZWVzQXJyYXkubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICBhcnJheS5wdXNoKHtcclxuICAgICAgICAgIGxuZzogZnJvbURlZ3JlZXNBcnJheVtpXSxcclxuICAgICAgICAgIGxhdDogZnJvbURlZ3JlZXNBcnJheVtpICsgMV0sXHJcbiAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDJdXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgICB0aGlzLmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgICBhcnJheSxcclxuICAgICAgICAyLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICAgKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgX3RoaXMubGVuZ3RoQnlNZXRlciA9IHJlc1xyXG4gICAgICAgIGNkICYmIGNkKClcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgICAgdGhpcy5jb21wdXRlRGlzdGFuY2UoXHJcbiAgICAgICAgcG9zaXRpb25zLFxyXG4gICAgICAgIDIsXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLndvcmRzTmFtZVxyXG4gICAgICApLnRoZW4ocmVzID0+IHtcclxuICAgICAgICBfdGhpcy5sZW5ndGhCeU1ldGVyID0gcmVzXHJcbiAgICAgICAgY2QgJiYgY2QoKVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZyb21EZWdyZWVzQXJyYXlcclxuICB9XHJcblxyXG4gIC8vIOabtOaWsOWkmui+ueW9ou+8iOe6v+aJqeWxle+8iVxyXG4gIHJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KSB7XHJcbiAgICBsZXQgbGluZVBvc2l0aW9ucyA9IFtdXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuZCAmJiB0aGlzLm9wdGlvbnMuZXh0ZW5kICE9PSAnZmFsc2UnKSB7XHJcbiAgICAgIGxldCBvdXRlckhvbGUgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb21EZWdyZWVzQXJyYXkubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICBsaW5lUG9zaXRpb25zLnB1c2goW2Zyb21EZWdyZWVzQXJyYXlbaV0sIGZyb21EZWdyZWVzQXJyYXlbaSArIDFdXSlcclxuICAgICAgfVxyXG4gICAgICBsZXQgbGluZXN0cmluZyA9IHR1cmYubGluZVN0cmluZyhsaW5lUG9zaXRpb25zKVxyXG4gICAgICBsZXQgYnVmZmVyZWQgPSB0dXJmLmJ1ZmZlcihcclxuICAgICAgICBsaW5lc3RyaW5nLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5leHRlbmRXaWR0aCAvIDEwMDAsXHJcbiAgICAgICAgeyB1bml0czogJ2tpbG9tZXRlcnMnIH1cclxuICAgICAgKVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG91dGVySG9sZS5wdXNoKFxyXG4gICAgICAgICAgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1baV1bMF0sXHJcbiAgICAgICAgICBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXVtpXVsxXVxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBsZXQgaG9sZXMgPSBbXSAvLyDlrZRcclxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBhcnJheSA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1tpXS5sZW5ndGg7IG0rKykge1xyXG4gICAgICAgICAgYXJyYXkucHVzaChcclxuICAgICAgICAgICAgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbaV1bbV1bMF0sXHJcbiAgICAgICAgICAgIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzW2ldW21dWzFdXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhvbGVzLnB1c2goeyBwb3NpdGlvbnM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkoYXJyYXkpIH0pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbiA9IG5ldyBDZXNpdW0uUG9seWdvbkdyYXBoaWNzKHtcclxuICAgICAgICBoaWVyYXJjaHk6IHtcclxuICAgICAgICAgIHBvc2l0aW9uczogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShvdXRlckhvbGUpLFxyXG4gICAgICAgICAgaG9sZXM6IGhvbGVzXHJcbiAgICAgICAgfSxcclxuICAgICAgICBtYXRlcmlhbDogQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGlzLm9wdGlvbnMuZXh0ZW5kQ29sb3IpXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uID0gdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyByZXNldCgpIHtcclxuICAgIGlmICghdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3JpZ2luYWxPcHRpb25zKVxyXG4gICAgdGhpcy5uYW1lID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubmFtZVxyXG4gICAgdGhpcy5jb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmNvbG9yXHJcbiAgICB0aGlzLmxpbmVXaWR0aCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLndpZHRoXHJcbiAgICB0aGlzLmxpbmVUeXBlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMudHlwZVxyXG4gICAgdGhpcy5ub3NlVG9UYWlsID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubm9zZVRvVGFpbFxyXG4gICAgdGhpcy5zbW9vdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5zbW9vdGhcclxuICAgIHRoaXMuZXh0ZW5kID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuZXh0ZW5kXHJcbiAgICB0aGlzLmV4dGVuZFdpZHRoID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuZXh0ZW5kV2lkdGhcclxuICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5leHRlbmRDb2xvclxyXG4gICAgdGhpcy5sYWJlbFNob3cgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5zaG93XHJcbiAgICB0aGlzLmxhYmVsQ29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5jb2xvclxyXG4gICAgdGhpcy5sYWJlbEZvbnRTaXplID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICAgIHRoaXMubGFiZWxGb250RmFtaWx5ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuZm9udEZhbWlseVxyXG4gICAgdGhpcy5sYWJlbExpbmVXaWR0aCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gICAgdGhpcy5sYWJlbFBpeGVsT2Zmc2V0ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXRcclxuICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5saW5lQ29sb3JcclxuICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXVxyXG4gICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXVxyXG4gICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgIC8vIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgIC8vIHRoaXMuYXR0cmlidXRlQ2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudFxyXG4gICAgLy8gdGhpcy5hdHRyaWJ1dGVHb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG4gICAgdGhpcy5yb3RhdGUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5yb3RhdGVcclxuICAgIHRoaXMuc3BlZWQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5zcGVlZFxyXG4gICAgLy8gdGhpcy5kYXNoU2l6ZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmRhc2hTaXplXHJcbiAgICB0aGlzLnNwYWNlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc3BhY2VcclxuICAgIC8vIHRoaXMuY2FtZXJhU2VsZWN0ICYmIHRoaXMuY2FtZXJhU2VsZWN0KClcclxuICAgIC8vIHRoaXMuZ29vZHNTZWxlY3QgJiYgdGhpcy5nb29kc1NlbGVjdCgpXHJcblxyXG4gICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5vcHRpb25zLmhlaWdodE1vZGVcclxuXHJcbiAgICAvLyBsZXQgaGVpZ2h0XHJcbiAgICAvLyBpZiAodGhpcy5ncm91bmQpIHtcclxuICAgIC8vICAgaGVpZ2h0ID0gYXdhaXQgdGhhdC5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgIC8vICAgICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgLy8gICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgIC8vICAgfSlcclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgIGhlaWdodCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAvLyAgIGxuZzogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAvLyAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAvLyAgIGFsdDogaGVpZ2h0XHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24ubG5nLFxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24ubGF0LFxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0XHJcbiAgICAvLyBdXHJcbiAgfVxyXG5cclxuICBfYWRkTGluaygpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGlua19hZGQnKVswXVxyXG4gICAgICAgIC52YWx1ZVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50LnB1c2goe1xyXG4gICAgICAgIG5hbWU6ICfpk77mjqUnICsgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aCArIDEpLFxyXG4gICAgICAgIHVybDogdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICdsaW5rX2FkZCdcclxuICAgICAgICApWzBdLnZhbHVlXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgJ2xpbmtfYWRkJ1xyXG4gICAgICApWzBdLnZhbHVlID0gJydcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuRGlhbG9nLmNsaWNrQWRkTGluayAmJiB0aGlzLkRpYWxvZy5jbGlja0FkZExpbmsoKVxyXG4gICAgICAvLyBsZXQgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICAvLyBpbnB1dC50eXBlID0gXCJmaWxlXCI7XHJcbiAgICAgIC8vIGlucHV0LmFjY2VwdCA9IFwiLm1wNCwgLnBkZlwiXHJcbiAgICAgIC8vIGlucHV0LmNsaWNrKClcclxuICAgICAgLy8gaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgIC8vICAgaWYgKGlucHV0LnZhbHVlKSB7XHJcbiAgICAgIC8vICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5wdXNoKHtcclxuICAgICAgLy8gICAgICAgbmFtZTogJ+mTvuaOpScgKyAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQubGVuZ3RoICsgMSksXHJcbiAgICAgIC8vICAgICAgIHVybDogaW5wdXQudmFsdWVcclxuICAgICAgLy8gICAgIH0pXHJcbiAgICAgIC8vICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfSlcclxuICAgIH1cclxuICB9XHJcbiAgYWRkQXR0cmlidXRlTGluayhsaW5rKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5wdXNoKHtcclxuICAgICAgbmFtZTogJ+mTvuaOpScgKyAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQubGVuZ3RoICsgMSksXHJcbiAgICAgIHVybDogbGlua1xyXG4gICAgfSlcclxuICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgfVxyXG5cclxuICAvLyBfYWRkUnIoKSB7XHJcbiAgLy8gICBpZiAoXHJcbiAgLy8gICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgJ3ZyX2FkZCdcclxuICAvLyAgICAgKVswXS52YWx1ZVxyXG4gIC8vICAgKSB7XHJcbiAgLy8gICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5wdXNoKHtcclxuICAvLyAgICAgICBuYW1lOiAn5YWo5pmv5Zu+JyArICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoICsgMSksXHJcbiAgLy8gICAgICAgdXJsOiB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICAgJ3ZyX2FkZCdcclxuICAvLyAgICAgICApWzBdLnZhbHVlXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgJ3ZyX2FkZCdcclxuICAvLyAgICAgKVswXS52YWx1ZSA9ICcnXHJcbiAgLy8gICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHRoaXMuRGlhbG9nLmNsaWNrQWRkVnIgJiYgdGhpcy5EaWFsb2cuY2xpY2tBZGRWcigpXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBhZGRBdHRyaWJ1dGVScih2cikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50LnB1c2goe1xyXG4gIC8vICAgICBuYW1lOiAn5YWo5pmv5Zu+JyArICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoICsgMSksXHJcbiAgLy8gICAgIHVybDogdnJcclxuICAvLyAgIH0pXHJcbiAgLy8gICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gfVxyXG5cclxuICAvKipcclxuICAgKiDpo57liLBcclxuICAgKi9cclxuICBhc3luYyBmbHlUbyhvcHRpb25zID0ge30pIHtcclxuICAgIGlmICh0aGlzLl9lcnJvcikge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHNldEFjdGl2ZVZpZXdlcigwKVxyXG4gICAgY2xvc2VSb3RhdGVBcm91bmQodGhpcy5zZGspXHJcbiAgICBjbG9zZVZpZXdGb2xsb3codGhpcy5zZGspXHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3ICYmIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24gJiYgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24pIHtcclxuICAgICAgbGV0IG9yaWVudGF0aW9uID0ge1xyXG4gICAgICAgIGhlYWRpbmc6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5oZWFkaW5nIHx8IDAuMCksXHJcbiAgICAgICAgcGl0Y2g6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5waXRjaCB8fCAtNjAuMCksXHJcbiAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnJvbGwgfHwgMC4wKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmdcclxuICAgICAgbGV0IGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0XHJcbiAgICAgIGxldCBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdFxyXG4gICAgICBsZXQgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uID0geyBsbmc6IDAsIGxhdDogMCB9XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb25zKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0gfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jZW50ZXIpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLmNlbnRlciB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnN0YXJ0KSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5zdGFydCB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbG5nJykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxuZyA9IHRoaXMub3B0aW9ucy5sbmdcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbGF0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxhdCA9IHRoaXMub3B0aW9ucy5sYXRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmFsdCA9IHRoaXMub3B0aW9ucy5hbHRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aaC5p6c5rKh5pyJ6auY5bqm5YC877yM5YiZ6I635Y+W57Sn6LS06auY5bqm6K6h566XXHJcbiAgICAgIGlmICghcG9zaXRpb24uaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgcG9zaXRpb24uYWx0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHBvc2l0aW9uKVxyXG4gICAgICB9XHJcbiAgICAgIGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nICsgcG9zaXRpb24ubG5nXHJcbiAgICAgIGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0ICsgcG9zaXRpb24ubGF0XHJcbiAgICAgIGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0ICsgcG9zaXRpb24uYWx0XHJcbiAgICAgIGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUbyh7XHJcbiAgICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uLFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvblxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbkFycmF5ID0gW11cclxuICAgICAgbGV0IGhlaWdodFxyXG4gICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBhID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2goYS54LCBhLnksIGEueilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgaGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0pXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgICBoZWlnaHQgKyB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaChhLngsIGEueSwgYS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBoZWlnaHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXSlcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgYSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaChhLngsIGEueSwgYS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICBsZXQgQm91bmRpbmdTcGhlcmUgPSBDZXNpdW0uQm91bmRpbmdTcGhlcmUuZnJvbVZlcnRpY2VzKHBvc2l0aW9uQXJyYXkpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG9Cb3VuZGluZ1NwaGVyZShCb3VuZGluZ1NwaGVyZSwge1xyXG4gICAgICAgIG9mZnNldDogb3B0aW9ucy5vcmllbnRhdGlvbiB8fCB7XHJcbiAgICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoMC4wKSxcclxuICAgICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoLTkwLjApLFxyXG4gICAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDmiZPlvIDlr4zmlofmnKzmoYZcclxuICAgKi9cclxuICBvcGVuUmljaFRleHRFZGl0b3IoZSkge1xyXG4gICAgLy8gdmFyIHVlID0gVUUuZ2V0RWRpdG9yKCdhcHAnKTtcclxuICAgIHJpY2hUZXh0Lm9wZW4oXHJcbiAgICAgIHRoaXMub3B0aW9ucy5pZCxcclxuICAgICAgdGhpcy5vcHRpb25zLm5hbWUsXHJcbiAgICAgIHRoaXMub3B0aW9ucy5yaWNoVGV4dENvbnRlbnRcclxuICAgIClcclxuICAgIHJpY2hUZXh0LnByaW1hcnlDYWxsQmFjayA9IGNvbnRlbnQgPT4ge1xyXG4gICAgICB0aGlzLm9wdGlvbnMucmljaFRleHRDb250ZW50ID0gY29udGVudFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gc3RhdGljIG5vZGVFZGl0Mih0aGF0LCBjYiA9ICgpID0+IHsgfSkge1xyXG4gIC8vICAgdGhhdC5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gIC8vICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpKSB7XHJcbiAgLy8gICAgIGNiKCfkuIrkuIDmrKHmtYvph4/mnKrnu5PmnZ8nKVxyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKHRydWUpXHJcbiAgLy8gICAgIHRoYXQudGlwID0gbmV3IE1vdXNlVGlwKCfor7fpgInmi6nkuIDkuKrpobbngrnvvIzlj7PplK7lj5bmtognLCB0aGF0LnNkaylcclxuICAvLyAgICAgdGhhdC5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoYXQuc2RrKVxyXG4gIC8vICAgICB0aGF0Lm5vZGVQb2ludHMgPSBbXVxyXG4gIC8vICAgICBsZXQgc2VsZWN0UG9pbnRcclxuICAvLyAgICAgbGV0IG9yaWdpbmFsUG9zaXRpb25cclxuICAvLyAgICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgLy8gICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgLy8gICAgICAgKVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIG5ld3Bvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcblxyXG4gIC8vICAgICB0aGF0LmV2ZW50Lm1vdXNlX2xlZnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAvLyAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAvLyAgICAgICAgICAgY2FydGVzaWFuLFxyXG4gIC8vICAgICAgICAgICB0aGF0LnNkay52aWV3ZXJcclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIG9yaWdpbmFsUG9zaXRpb24gPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gIC8vICAgICAgICAgbGV0IGVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gIC8vICAgICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sbmcsXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubGF0LFxyXG4gIC8vICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmFsdFxyXG4gIC8vICAgICAgICAgICApLFxyXG4gIC8vICAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAvLyAgICAgICAgICAgICBpbWFnZTogdGhhdC5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvcG9pbnQucG5nJyxcclxuICAvLyAgICAgICAgICAgICB3aWR0aDogMTUsXHJcbiAgLy8gICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAvLyAgICAgICAgICAgICBkaXNhYmxlRGVwdGhUZXN0RGlzdGFuY2U6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgdGhhdC5ub2RlUG9pbnRzLnNwbGljZShzZWxlY3RQb2ludC5pbmRleCwgMCwgZW50aXR5KVxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5zcGxpY2UoXHJcbiAgLy8gICAgICAgICAgIHNlbGVjdFBvaW50LmluZGV4LFxyXG4gIC8vICAgICAgICAgICAwLFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGF0LnJlbmV3UG9zaXRpb25zKHRoYXQub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgLy8gICAgICAgICB0aGF0LnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLmxlbmd0aEJ5TWV0ZXIgPSB0aGF0LmNvbXB1dGVEaXN0YW5jZShcclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucyxcclxuICAvLyAgICAgICAgICAgMixcclxuICAvLyAgICAgICAgICAgdGhhdC5ncm91bmRcclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIHRoYXQubGVuZ3RoVW5pdCA9IHRoYXQub3B0aW9ucy5sZW5ndGhVbml0XHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHZhciBwaWNrID0gdGhhdC5zZGsudmlld2VyLnNjZW5lLnBpY2sobW92ZW1lbnQucG9zaXRpb24pXHJcbiAgLy8gICAgICAgICBpZiAoXHJcbiAgLy8gICAgICAgICAgIHBpY2sgJiZcclxuICAvLyAgICAgICAgICAgcGljay5pZCAmJlxyXG4gIC8vICAgICAgICAgICBwaWNrLmlkLm5hbWUgJiZcclxuICAvLyAgICAgICAgICAgcGljay5pZC5uYW1lID09PSAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCdcclxuICAvLyAgICAgICAgICkge1xyXG4gIC8vICAgICAgICAgICBzZWxlY3RQb2ludCA9IHBpY2suaWRcclxuICAvLyAgICAgICAgICAgdGhhdC5ub2RlUG9pbnRzLnNwbGljZShwaWNrLmlkLmluZGV4LCAxKVxyXG4gIC8vICAgICAgICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHBpY2suaWQpXHJcbiAgLy8gICAgICAgICAgIHRoYXQudGlwLnNldF90ZXh0KCflt6bplK7lvIDlp4vvvIzlj7PplK7nu5PmnZ/vvIxDVFJMK+WPs+mUruaSpOmUgCcpXHJcbiAgLy8gICAgICAgICAgIG9yaWdpbmFsUG9zaXRpb24gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gIC8vICAgICAgICAgICAgIGNhcnRlc2lhbixcclxuICAvLyAgICAgICAgICAgICB0aGF0LnNkay52aWV3ZXJcclxuICAvLyAgICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSlcclxuXHJcbiAgLy8gICAgIHRoYXQuZXZlbnQubW91c2VfcmlnaHQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAvLyAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gb3JpZ2luYWxQb3NpdGlvblxyXG4gIC8vICAgICAgICAgY2IobnVsbCwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucylcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgbGV0IHBvc2l0aW9ucyA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNcclxuICAvLyAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgLy8gICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAvLyAgICAgICAgICAgcG9zaXRpb25zW2ldLmxuZyxcclxuICAvLyAgICAgICAgICAgcG9zaXRpb25zW2ldLmxhdCxcclxuICAvLyAgICAgICAgICAgcG9zaXRpb25zW2ldLmFsdFxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBuZXdwb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAvLyAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAvLyAgICAgICApXHJcbiAgLy8gICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0Lm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAgIHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhhdC5ub2RlUG9pbnRzW2ldKVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICB0aGF0Lm5vZGVQb2ludHMgPSBbXVxyXG4gIC8vICAgICAgIHRoYXQuZXZlbnQuZGVzdHJveSgpXHJcbiAgLy8gICAgICAgdGhhdC50aXAuZGVzdHJveSgpXHJcbiAgLy8gICAgIH0pXHJcblxyXG4gIC8vICAgICB0aGF0LmV2ZW50Lm1vdXNlX21vdmUoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAvLyAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAvLyAgICAgICAgICAgY2FydGVzaWFuLFxyXG4gIC8vICAgICAgICAgICB0aGF0LnNkay52aWV3ZXJcclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIGxldCBwb3NpdGlvbnMgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zXHJcbiAgLy8gICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgLy8gICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2goXHJcbiAgLy8gICAgICAgICAgICAgcG9zaXRpb25zW2ldLmxuZyxcclxuICAvLyAgICAgICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gIC8vICAgICAgICAgICAgIHBvc2l0aW9uc1tpXS5hbHRcclxuICAvLyAgICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgbmV3cG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgLy8gICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCA9PT0gMSkge1xyXG4gIC8vICAgICAgICAgICB0aGF0LmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gIC8vICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gIC8vICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gIC8vICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgLy8gICAgICAgICAgIF1cclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gIC8vICAgICAgICAgICAgIGxuZzogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgLy8gICAgICAgICAgICAgbGF0OiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAvLyAgICAgICAgICAgICBhbHQ6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgdGhhdC50aXAuc2V0UG9zaXRpb24oXHJcbiAgLy8gICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgLy8gICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi54LFxyXG4gIC8vICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gIC8vICAgICAgIClcclxuICAvLyAgICAgfSlcclxuXHJcbiAgLy8gICAgIHRoYXQuZXZlbnQubW91c2VfcmlnaHRfa2V5Ym9hcmRfY3RybCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gIC8vICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5wb3AoKVxyXG4gIC8vICAgICAgICAgdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZShcclxuICAvLyAgICAgICAgICAgdGhhdC5ub2RlUG9pbnRzW3RoYXQubm9kZVBvaW50cy5sZW5ndGggLSAxXVxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgdGhhdC5ub2RlUG9pbnRzLnBvcCgpXHJcbiAgLy8gICAgICAgICBpZiAoc2VsZWN0UG9pbnQuaW5kZXggPT09IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgICAgIGlmICh0aGF0Lm5vZGVQb2ludHNbc2VsZWN0UG9pbnQuaW5kZXggLSAxXSkge1xyXG4gIC8vICAgICAgICAgICAgIHNlbGVjdFBvaW50ID0gdGhhdC5ub2RlUG9pbnRzW3NlbGVjdFBvaW50LmluZGV4IC0gMV1cclxuICAvLyAgICAgICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgICAgICBzZWxlY3RQb2ludC5pbmRleCA9IDBcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSlcclxuXHJcbiAgLy8gICAgIHRoYXQuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgLy8gICAgICAgcmV0dXJuIG5ld3Bvc2l0aW9uc1xyXG4gIC8vICAgICB9LCBmYWxzZSlcclxuXHJcbiAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgIGxldCBlbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAvLyAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAvLyAgICAgICAgIGluZGV4OiBpLFxyXG4gIC8vICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgLy8gICAgICAgICApLFxyXG4gIC8vICAgICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgLy8gICAgICAgICAgIGltYWdlOiB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gIC8vICAgICAgICAgICB3aWR0aDogMTUsXHJcbiAgLy8gICAgICAgICAgIGhlaWdodDogMTUsXHJcbiAgLy8gICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfSlcclxuICAvLyAgICAgICB0aGF0Lm5vZGVQb2ludHMucHVzaChlbnRpdHkpXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIG5vZGVFZGl0KGNkKSB7XHJcbiAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICB0aGlzLm5vc2VUb1RhaWwgPSBmYWxzZVxyXG4gICAgLy8gdGhpcy5zbW9vdGggPSBmYWxzZVxyXG4gICAgdGhpcy5oZWlnaHRNb2RlID0gMFxyXG4gICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpKSB7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXModHJ1ZSlcclxuICAgICAgdGhpcy5fbm9kZUVkaXRDYWxsYmFjayA9IGNkXHJcbiAgICAgIHRoaXMudGlwID0gbmV3IE1vdXNlVGlwKCfor7fpgInmi6nkuIDkuKrpobbngrnvvIzlj7PplK7lj5bmtognLCB0aGlzLnNkaylcclxuICAgICAgdGhpcy5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QgPSBuZXcgQ29udHJvbGxlcih0aGlzLnNkaylcclxuXHJcbiAgICAgIGxldCBzZWxlY3RQb2ludFxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB2YXIgcGljayA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5waWNrKG1vdmVtZW50LnBvc2l0aW9uKVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHBpY2sgJiZcclxuICAgICAgICAgIHBpY2suaWQgJiZcclxuICAgICAgICAgIHBpY2suaWQubmFtZSAmJlxyXG4gICAgICAgICAgcGljay5pZC5uYW1lID09PSAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCdcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHNlbGVjdFBvaW50ID0gcGljay5pZFxyXG4gICAgICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0LnBvc2l0aW9uID1cclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF1cclxuICAgICAgICAgIHRoaXMuQ29udHJvbGxlck9iamVjdC5lZGl0VHJhbnNsYXRpb25hbCgpXHJcbiAgICAgICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgICAgIHRoaXMuQ29udHJvbGxlck9iamVjdC5jb250cm9sbGVyQ2FsbEJhY2sgPSBwYXJhbXMgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0UG9pbnQuaW5kZXggPT09IDApIHtcclxuICAgICAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5sYXQsXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24uYWx0XHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgICAgICAgIGxuZzogcGFyYW1zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgICAgIGxhdDogcGFyYW1zLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICAgICAgICAgIGFsdDogcGFyYW1zLnBvc2l0aW9uLmFsdFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHBhcmFtcy5wb3NpdGlvblxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxuZyAmJiAodGhpcy5fZWxtcy5sbmdbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHBhcmFtcy5wb3NpdGlvbi5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sbmdJbnB1dCAmJiAodGhpcy5fZWxtcy5sbmdJbnB1dFtzZWxlY3RQb2ludC5pbmRleF0udmFsdWUgPSBwYXJhbXMucG9zaXRpb24ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubGF0ICYmICh0aGlzLl9lbG1zLmxhdFtzZWxlY3RQb2ludC5pbmRleF0uaW5uZXJIVE1MID0gcGFyYW1zLnBvc2l0aW9uLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxhdElucHV0ICYmICh0aGlzLl9lbG1zLmxhdElucHV0W3NlbGVjdFBvaW50LmluZGV4XS52YWx1ZSA9IHBhcmFtcy5wb3NpdGlvbi5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5hbHQgJiYgKHRoaXMuX2VsbXMuYWx0W3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSBwYXJhbXMucG9zaXRpb24uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMuYWx0SW5wdXQgJiYgKHRoaXMuX2VsbXMuYWx0SW5wdXRbc2VsZWN0UG9pbnQuaW5kZXhdLnZhbHVlID0gcGFyYW1zLnBvc2l0aW9uLmFsdC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBzZWxlY3RQb2ludC5wb3NpdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24uYWx0XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgICAgdGhpcy50aXAgPSBudWxsXHJcbiAgICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0LmRlc3Ryb3koKVxyXG5cclxuICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyhmYWxzZSlcclxuICAgICAgICB0aGlzLl9ub2RlRWRpdENhbGxiYWNrID0gbnVsbFxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi54LFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgIClcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eSgoKSA9PiB7XHJcbiAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgdGhpcy5fbm9kZUVkaXRDYWxsYmFjayh0aGlzLm9wdGlvbnMucG9zaXRpb25zLCB0aGlzLmxlbmd0aEJ5TWV0ZXIpXHJcbiAgICAgICAgcmV0dXJuIENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgIH0sIGZhbHNlKVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGVudGl0eSA9IHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAgICAgICAgICAgaW1hZ2U6IHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICAgICAgICAgIGNvbG9yOiBDZXNpdW0uQ29sb3IuV0hJVEUud2l0aEFscGhhKDAuOTkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLm5vZGVQb2ludHMucHVzaChlbnRpdHkpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlTm9kZUVkaXQoKSB7XHJcbiAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QgJiYgdGhpcy5Db250cm9sbGVyT2JqZWN0LmRlc3Ryb3koKVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGF0LmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhhdC50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCA9IG51bGxcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgIH1cclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICB0aGlzLl9ub2RlRWRpdENhbGxiYWNrID0gbnVsbFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5Yig6ZmkXHJcbiAgICovXHJcbiAgYXN5bmMgcmVtb3ZlKCkge1xyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLmxhYmVsICYmIHRoaXMubGFiZWwucmVtb3ZlKClcclxuICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5lbnRpdHkpXHJcbiAgICB0aGlzLmVudGl0eSA9IG51bGxcclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgIXRoaXMuX0RpYWxvZ09iamVjdC5pc0Rlc3Ryb3kpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5zZGsucmVtb3ZlSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZClcclxuICAgIGF3YWl0IHN5bmNEYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgfVxyXG5cclxuICAvKipAZGVzYyDmiZPlvIDlubPnp7vlip/og71cclxuICAgKlxyXG4gICAqIEBtZW1iZXJPZiBTb3VyY2VcclxuICAgKiBAcGFyYW0gc3RhdHVzIHtib29sZWFufVxyXG4gICAqXHJcbiAgICogKi9cclxuICBzZXQgcG9zaXRpb25FZGl0aW5nKHN0YXR1cykge1xyXG4gICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpIHx8ICF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcgPSBzdGF0dXNcclxuICAgIGlmIChzdGF0dXMgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICB0aGlzLnRpcCA9IG5ldyBNb3VzZVRpcCgn54K55Ye76byg5qCH5bem6ZSu56Gu6K6k77yM5Y+z6ZSu5Y+W5raIJywgdGhpcy5zZGspXHJcbiAgICAgIHRoaXMubGFiZWwgJiZcclxuICAgICAgICAodGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhcclxuICAgICAgICAgIGByZ2JhKDI1NSwyNTUsMjU1LDAuOSlgXHJcbiAgICAgICAgKSlcclxuICAgICAgdGhpcy5waWNraW5nID0gZmFsc2VcclxuICAgICAgbGV0IHBvc2l0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLnBvc2l0aW9ucykpXHJcbiAgICAgIC8vIGxldCBwb3NpdGlvbnMyID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwb3NpdGlvbnMpKVxyXG4gICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9uczIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgLy8gICBsZXQgaGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLmdldEhlaWdodChDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21EZWdyZWVzKHBvc2l0aW9uczJbaV0ubG5nLCBwb3NpdGlvbnMyW2ldLmxhdCkpXHJcbiAgICAgIC8vICAgcG9zaXRpb25zMltpXSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAvLyAgICAgcG9zaXRpb25zMltpXS5sbmcsXHJcbiAgICAgIC8vICAgICBwb3NpdGlvbnMyW2ldLmxhdCxcclxuICAgICAgLy8gICAgIE51bWJlcigocG9zaXRpb25zMltpXS5hbHQgKyBOdW1iZXIoaGVpZ2h0KSkudG9GaXhlZCgyKSlcclxuICAgICAgLy8gICApXHJcbiAgICAgIC8vIH1cclxuICAgICAgdGhpcy5wcmV2aW91cyA9IHtcclxuICAgICAgICBwb3NpdGlvbnM6IFsuLi50aGlzLm9wdGlvbnMucG9zaXRpb25zXVxyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgcG9zaXRpb25zW2ldID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICBwb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgcG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGNlbnRlciA9IHBvc2l0aW9uc1tNYXRoLmZsb29yKHBvc2l0aW9ucy5sZW5ndGggLyAyKV1cclxuICAgICAgbGV0IGRpc3Bhcml0eSA9IFtdXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY2VudGVyLnggLSBwb3NpdGlvbnNbaV0ueFxyXG4gICAgICAgIGRpc3Bhcml0eS5wdXNoKHtcclxuICAgICAgICAgIHg6IGNlbnRlci54IC0gcG9zaXRpb25zW2ldLngsXHJcbiAgICAgICAgICB5OiBjZW50ZXIueSAtIHBvc2l0aW9uc1tpXS55LFxyXG4gICAgICAgICAgejogY2VudGVyLnogLSBwb3NpdGlvbnNbaV0uelxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBuZXdQID0ge1xyXG4gICAgICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgICAgICB6OiBjYXJ0ZXNpYW4ueiAtIGRpc3Bhcml0eVtpXS56XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBsZXQgcG9zODQgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gICAgICAgICAgLy8gICBuZXdQLFxyXG4gICAgICAgICAgLy8gICB0aGlzLnNkay52aWV3ZXJcclxuICAgICAgICAgIC8vIClcclxuICAgICAgICAgIC8vIGxldCBoZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUuZ2V0SGVpZ2h0KENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMocG9zODQubG5nLCBwb3M4NC5sYXQpKVxyXG4gICAgICAgICAgLy8gcG9zODQuYWx0ID0gTnVtYmVyKChwb3M4NC5hbHQgKyBOdW1iZXIoaGVpZ2h0KSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgIC8vIG5ld1AgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgIC8vICAgcG9zODQubG5nLFxyXG4gICAgICAgICAgLy8gICBwb3M4NC5sYXQsXHJcbiAgICAgICAgICAvLyAgIHBvczg0LmFsdFxyXG4gICAgICAgICAgLy8gKVxyXG4gICAgICAgICAgbmV3cG9zaXRpb25zLnB1c2gobmV3UClcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uODQgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gICAgICAgICAgbmV3cG9zaXRpb25zWzBdLFxyXG4gICAgICAgICAgdGhpcy5zZGsudmlld2VyXHJcbiAgICAgICAgKVxyXG4gICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbcG9zaXRpb244NC5sbmcsIHBvc2l0aW9uODQubGF0LCBwb3NpdGlvbjg0LmFsdF1cclxuICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICBsbmc6IHBvc2l0aW9uODQubG5nLFxyXG4gICAgICAgICAgbGF0OiBwb3NpdGlvbjg0LmxhdCxcclxuICAgICAgICAgIGFsdDogcG9zaXRpb244NC5hbHRcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi54LFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgIClcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIG5ld3Bvc2l0aW9ucy5wdXNoKHtcclxuICAgICAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0uelxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uc0xuZ0xhdCA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQobmV3cG9zaXRpb25zW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgICBwb3NpdGlvbi5hbHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgcG9zaXRpb25zTG5nTGF0LnB1c2gocG9zaXRpb24pXHJcblxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sbmcgJiYgKHRoaXMuX2VsbXMubG5nW2ldLmlubmVySFRNTCA9IHBvc2l0aW9uLmxuZy50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sbmdJbnB1dCAmJiAodGhpcy5fZWxtcy5sbmdJbnB1dFtpXS52YWx1ZSA9IHBvc2l0aW9uLmxuZy50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYXQgJiYgKHRoaXMuX2VsbXMubGF0W2ldLmlubmVySFRNTCA9IHBvc2l0aW9uLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYXRJbnB1dCAmJiAodGhpcy5fZWxtcy5sYXRJbnB1dFtpXS52YWx1ZSA9IHBvc2l0aW9uLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5hbHQgJiYgKHRoaXMuX2VsbXMuYWx0W2ldLmlubmVySFRNTCA9IHBvc2l0aW9uLmFsdC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5hbHRJbnB1dCAmJiAodGhpcy5fZWxtcy5hbHRJbnB1dFtpXS52YWx1ZSA9IHBvc2l0aW9uLmFsdC50b0ZpeGVkKDIpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucyA9IHBvc2l0aW9uc0xuZ0xhdFxyXG4gICAgICAgIHRoaXMucHJldmlvdXMucG9zaXRpb25zID0gcG9zaXRpb25zTG5nTGF0XHJcblxyXG4gICAgICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9uc0xuZ0xhdCA9IHBvc2l0aW9uc0xuZ0xhdFxyXG4gICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zLCAoKT0+e1xyXG4gICAgICAgICAgaWYodGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2soKVxyXG4gICAgICAgICAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjayA9IG51bGxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICAgIClcclxuICAgICAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICBsZXQgcG9zID0ge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgICAgIHg6IChtb3ZlbWVudC5wb3NpdGlvbjEueCArIG1vdmVtZW50LnBvc2l0aW9uMi54KSAvIDIsXHJcbiAgICAgICAgICAgICAgeTogKG1vdmVtZW50LnBvc2l0aW9uMS55ICsgbW92ZW1lbnQucG9zaXRpb24yLnkpIC8gMlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZW5kVGltZSAtIHN0YXJ0VGltZSA+PSA1MDApIHtcclxuICAgICAgICAgICAgLy8g6ZW/5oyJ5Y+W5raIXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZWZ0RXZlbnQocG9zLCBjYXJ0ZXNpYW4pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAobmV3cG9zaXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHJldHVybiBuZXdwb3NpdGlvbnNcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHBvc2l0aW9uc1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgZmFsc2UpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMubGFiZWwgfHwgIXRoaXMubGFiZWwuZW50aXR5KSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhcclxuICAgICAgICAgIGByZ2JhKDI1NSwyNTUsMjU1LDEpYFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBpY2tpbmcgPSB0cnVlXHJcbiAgICAgIGlmICh0aGlzLmV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgICAgIClcclxuICAgICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuXHJcbiAgICAgIHN3aXRjaCAodGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVsyXVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdFxyXG4gICAgICAgICAgXVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgcG9zaXRpb25FZGl0aW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmdcclxuICB9XHJcblxyXG4gIG9wZW5Qb3NpdGlvbkVkaXRpbmcoY2QpIHtcclxuICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gdHJ1ZVxyXG4gICAgdGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2sgPSBjZFxyXG4gIH1cclxuXHJcbiAgc2V0RElWKG9wdGlvbnMgPSB7IGRvbWlkOiAnJywgeDogMTAsIHk6IDEwIH0pIHtcclxuICAgIG9wdGlvbnMueCA9IG9wdGlvbnMueCB8fCBvcHRpb25zLnggPT09IDAgPyBvcHRpb25zLnggOiAxMFxyXG4gICAgb3B0aW9ucy55ID0gb3B0aW9ucy55IHx8IG9wdGlvbnMueSA9PT0gMCA/IG9wdGlvbnMueSA6IDEwXHJcblxyXG4gICAgbGV0IHBvaW50cyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcG9pbnRzLnB1c2goW1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0XHJcbiAgICAgIF0pXHJcbiAgICB9XHJcbiAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhwb2ludHMpXHJcbiAgICBsZXQgbGVuZ3RoID0gdHVyZi5sZW5ndGgobGluZSwgeyB1bml0czogJ2tpbG9tZXRlcnMnIH0pXHJcbiAgICBsZXQgc2xpY2VkID0gdHVyZi5saW5lU2xpY2VBbG9uZyhsaW5lLCAwLCBsZW5ndGggLyAyLCB7XHJcbiAgICAgIHVuaXRzOiAna2lsb21ldGVycydcclxuICAgIH0pXHJcblxyXG4gICAgbGV0IHNpdGVJbmZvRG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3B0aW9ucy5kb21pZClcclxuICAgIGxldCBzaXRlSW5mb1Bvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgIC4uLnNsaWNlZC5nZW9tZXRyeS5jb29yZGluYXRlc1tzbGljZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV1cclxuICAgIClcclxuICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS5wb3N0UmVuZGVyLmFkZEV2ZW50TGlzdGVuZXIocGVyY2VudGFnZSA9PiB7XHJcbiAgICAgIC8v6L2s5o2i5Yiw5bGP5bmV5Z2Q5qCHXHJcbiAgICAgIGlmIChcclxuICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snIHx8XHJcbiAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJydcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHdpbnBvcyA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jYXJ0ZXNpYW5Ub0NhbnZhc0Nvb3JkaW5hdGVzKFxyXG4gICAgICAgICAgc2l0ZUluZm9Qb3NpdGlvblxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAod2lucG9zKSB7XHJcbiAgICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5sZWZ0ID0gKHdpbnBvcy54ICsgb3B0aW9ucy54KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUudG9wID0gKHdpbnBvcy55ICsgb3B0aW9ucy55KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgUG9seWxpbmVPYmplY3RcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBSUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBcEJBO0FBQUE7QUFrQkE7QUFHQTtBQUNBO0FBQ0E7QUFRQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFqQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXpCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0RBO0FBekRBO0FBQUE7QUFBQTtBQUFBO0FBMERBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFWQTtBQUFBO0FBUUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQWxCQTtBQUFBO0FBQUE7QUFtQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBNEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBNkRBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQXhFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBckRBO0FBc0RBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFlQTtBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBT0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdEhBO0FBQUE7QUFBQTtBQXlIQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQWp1QkE7QUFBQTtBQUFBO0FBQUE7QUFtdUJBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFHQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBdkRBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMERBO0FBSUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUVBO0FBeUJBO0FBQUE7QUF0QkE7QUFDQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQTFHQTtBQUFBO0FBQUE7QUFBQTtBQTRHQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBWkE7QUFBQTtBQUFBO0FBQUE7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUFBO0FBQUE7QUFBQTtBQTROQTtBQUNBO0FBQUE7QUF2TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFPQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUlBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXQ4REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBZUE7QUFBQTtBQVpBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSEE7QUFBQTtBQUFBO0FBT0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFIQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQXREQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFnMURBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Obj/Base/PolylineObject/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/PolylineObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _eventBinding__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./eventBinding */ \"./src/Obj/Base/PolylineObject/eventBinding.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Controller_index__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../Controller/index */ \"./src/Controller/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * @description 线\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar PolylineObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 折线\r\n * @param options {object} 线属性\r\n * @param options.name{string} 名称\r\n * @param options.width=3{number} 线宽\r\n * @param options.color=#ff0000 {string} 颜色\r\n * @param options.type=0 {number} 材质类型 0-实线 1-虚线 2-泛光...\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对高度;2:依附模式)\r\n * @param options.noseToTail=false {boolean} 首尾相连\r\n * @param options.smooth=false {boolean} 线段圆滑\r\n * @param options.extend=false {boolean} 线缓冲\r\n * @param options.extendWidth=10 {number} 线缓冲宽度\r\n * @param options.extendColor=rgba(255,255,80,0.3) {number} 线缓冲颜色\r\n * @param options.show=true {boolean} 显隐\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * \r\n * \r\n * @param options.noseToTail=false {boolean} 是否首尾相连\r\n * \r\n * \r\n * \r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {string} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * \r\n * \r\n * @param _Dialog {object} 弹框事件\r\n * @param _Dialog.confirmCallBack {function} 弹框确认时的回调\r\n * */\n function PolylineObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, PolylineObject);\n _this2 = _callSuper(this, PolylineObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.width = options.width || options.width === 0 ? options.width : 3;\n _this2.options.color = options.color || '#ff0000';\n _this2.options.type = options.type ? Number(options.type) : 0;\n _this2.options.noseToTail = options.noseToTail || false;\n _this2.options.smooth = options.smooth || false;\n _this2.options.extend = options.extend || false;\n _this2.options.rotate = options.rotate || options.rotate === false ? options.rotate : true;\n _this2.options.space = options.space || 1;\n _this2.options.speed = options.speed || 10;\n // this.options.dashSize = options.dashSize || 0.03\n _this2.options.wordsName = options.wordsName || 0;\n _this2.options.extendWidth = options.extendWidth || options.extendWidth === 0 ? options.extendWidth : 10;\n _this2.options.extendColor = options.extendColor || 'rgba(255,255,80,0.3)';\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2._elms = [];\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n // this.options.attribute.camera = this.options.attribute.camera || {}\n // this.options.attribute.camera.content =\n // this.options.attribute.camera.content || []\n // this.options.attribute.vr = this.options.attribute.vr || {}\n // this.options.attribute.vr.content =\n // this.options.attribute.vr.content || []\n // this.options.attribute.goods = this.options.attribute.goods || {}\n // this.options.attribute.goods.content =\n // this.options.attribute.goods.content || []\n\n delete _this2.options.attribute.camera;\n delete _this2.options.attribute.vr;\n delete _this2.options.attribute.goods;\n _this2.operate = {};\n _this2.nodePoints = [];\n _this2.unitNum = 0;\n _this2.inputSpeed = options.speed && Math.pow(options.speed, -1) * 100 || 10;\n _this2.Dialog = _Dialog;\n if (!_this2.options.positions || _this2.options.positions.length < 2) {\n _this2._error = '线段最少需要两个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n for (var i = 0; i < _this2.options.positions.length; i++) {\n _this2.options.positions[i].lng = Number(Number(_this2.options.positions[i].lng).toFixed(8));\n _this2.options.positions[i].lat = Number(Number(_this2.options.positions[i].lat).toFixed(8));\n _this2.options.positions[i].alt = Number(Number(_this2.options.positions[i].alt).toFixed(2));\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n PolylineObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(PolylineObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(PolylineObject, [{\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || '#ff0000';\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,1)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"speed\",\n get: function get() {\n return this.options.speed;\n },\n set: function set(v) {\n this.options.speed = v;\n this.inputSpeed = v !== 0 ? Math.pow(v, -1) * 100 : 0;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.options.speed = v !== 0 ? Math.pow(v, -1) * 100 : 0\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n // get dashSize() {\n // return this.options.dashSize\n // }\n\n // set dashSize(v) {\n // this.options.dashSize = v\n // let params = { ...this.options }\n // params.speed = this.inputSpeed\n // // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params)\n // }\n }, {\n key: \"rotate\",\n get: function get() {\n return this.options.rotate;\n },\n set: function set(v) {\n this.options.rotate = v;\n this.closeNodeEdit();\n this._elms.rotate && this._elms.rotate.forEach(function (item) {\n item.checked = v;\n });\n this.options.rotate = v;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n }, {\n key: \"space\",\n get: function get() {\n return this.options.space;\n },\n set: function set(v) {\n this.options.space = v;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n }, {\n key: \"wordsName\",\n get: function get() {\n return this.options.wordsName;\n },\n set: function set(v) {\n var _this4 = this;\n this.options.wordsName = v;\n var _this = this;\n if (!this.noseToTail) {\n this.computeDistance(this.options.positions, 2, v).then(function (res) {\n // _this.options.lengthByMeter = res\n // if (res > 1000 || res == 1000) {\n // _this.length = (res / 1000).toFixed(5)\n // _this.lengthUnit = '千米'\n // } else {\n // _this.length = res\n // _this.lengthUnit = '米'\n // }\n _this.lengthByMeter = res;\n _this4.lengthChangeCallBack && _this4.lengthChangeCallBack();\n });\n } else {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n }\n }\n\n // get fitLengthUnit() {\n // return this.options.fitLengthUnit\n // }\n // set fitLengthUnit(v) {\n // this.options.fitLengthUnit = v\n // this._elms.fitLengthUnit &&\n // this._elms.fitLengthUnit.forEach(item => {\n // item.value = v\n // })\n // if (this.fitLengthByMeter) {\n // switch (v) {\n // case '米':\n // this.fitLength = this.fitLengthByMeter\n // break\n // case '千米':\n // this.fitLength = Number(\n // (this.fitLengthByMeter / 1000).toFixed(5)\n // )\n // break\n // default:\n // this.fitLength = this.fitLengthByMeter\n // }\n // }\n // }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.width;\n },\n set: function set(v) {\n var _this5 = this;\n this.options.width = v || v == 0 ? v : 3;\n this._elms.lineWidth && this._elms.lineWidth.forEach(function (item) {\n item.value = _this5.options.width;\n });\n if (this.entity && this.entity.polyline) {\n this.entity.polyline.width = this.entity.polyline.width + v - this.entity.polyline.oriWidth;\n this.entity.polyline.oriWidth = this.options.width;\n }\n // this.entity &&\n // this.entity.polyline &&\n // (this.entity.polyline.width = this.options.width) && (this.entity.polyline.oriWidth = this.options.width)\n }\n }, {\n key: \"lineType\",\n get: function get() {\n return this.options.type;\n },\n set: function set(v) {\n var _this6 = this;\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n this.options.type = Number(v);\n var _loop = function _loop(i) {\n if (lineTypeData[i].key === Number(v)) {\n _this6._elms.lineType && _this6._elms.lineType.forEach(function (item) {\n item.value = lineTypeData[i].value;\n if (2 < item.value && item.value < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < item.value && item.value < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n });\n return 1; // break\n }\n };\n for (var i = 0; i < lineTypeData.length; i++) {\n if (_loop(i)) break;\n }\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n this.entity && this.entity.polyline && (this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params));\n }\n }, {\n key: \"noseToTail\",\n get: function get() {\n return this.options.noseToTail;\n },\n set: function set(v) {\n this.options.noseToTail = v;\n this.closeNodeEdit();\n this._elms.noseToTail && this._elms.noseToTail.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n }\n // if (v) {\n // if (this.options.fitLengthByMeter > 1000 || this.options.fitLengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n\n // } else {\n // if (this.options.lengthByMeter > 1000 || this.options.lengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n // }\n }\n }, {\n key: \"smooth\",\n get: function get() {\n return this.options.smooth;\n },\n set: function set(v) {\n this.options.smooth = v;\n this.closeNodeEdit();\n this._elms.smooth && this._elms.smooth.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this7 = this;\n this.positionEditing = false;\n this.options.heightMode = v || v == 0 ? v : 2;\n var heightModeName = '';\n this.closeNodeEdit();\n var ground = false;\n var disabled = false;\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n this.entity.polyline.clampToGround = ground;\n heightModeName = '依附模型';\n break;\n }\n setTimeout(function () {\n if (ground) {\n _this7.label.ground = ground;\n _this7._elms.heightMode && (_this7._elms.heightMode.value = '依附模型');\n _this7.label.position = [_this7.options.positions[0].lng, _this7.options.positions[0].lat];\n } else {\n _this7.label.ground = ground;\n _this7.label.position = [_this7.options.positions[0].lng, _this7.options.positions[0].lat, fromDegreesArray[2]];\n _this7.options.label.position = {\n lng: _this7.options.positions[0].lng,\n lat: _this7.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n }\n }, 0);\n }\n }, {\n key: \"extend\",\n get: function get() {\n return this.options.extend;\n },\n set: function set(v) {\n this.options.extend = v;\n this.closeNodeEdit();\n if (v) {\n this.heightMode = 2;\n }\n this._elms.extend && this._elms.extend.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n if (this.options.extend) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n } else {\n this.entity.polygon = undefined;\n }\n }\n }\n }, {\n key: \"extendWidth\",\n get: function get() {\n return this.options.extendWidth;\n },\n set: function set(v) {\n this.options.extendWidth = v;\n this.heightMode = this.heightMode;\n this._elms.extendWidth && this._elms.extendWidth.forEach(function (item) {\n item.value = v;\n });\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n }\n }, {\n key: \"extendColor\",\n get: function get() {\n return this.options.extendColor;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.extendColor = v;\n if (this._elms.extendColor) {\n this._elms.extendColor.forEach(function (item, i) {\n var extendColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this8._elms.extendColor[i] = extendColorPicker;\n });\n }\n this.entity && this.entity.polygon && (this.entity.polygon.material = Cesium.Color.fromCssColorString(this.options.extendColor));\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n setTimeout(function () {\n _this9.label.position = [_this9.options.positions[0].lng, _this9.options.positions[0].lat, _this9.options.positions[0].alt];\n }, 0);\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this11 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this11.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this11._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this12 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this12.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this12._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this13 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this13.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this13._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"attributeType\",\n get: function get() {\n return this.options.attributeType;\n },\n set: function set(v) {\n this.options.attributeType = v;\n this._elms.attributeType && this._elms.attributeType.forEach(function (item) {\n item.value = v;\n });\n var attributeContent = this._DialogObject._element.content.getElementsByClassName('attribute-content');\n for (var i = 0; i < attributeContent.length; i++) {\n if (attributeContent[i].className.indexOf('attribute-content-' + v) > -1) {\n attributeContent[i].style.display = 'block';\n } else {\n attributeContent[i].style.display = 'none';\n }\n }\n }\n }, {\n key: \"attributeLink\",\n get: function get() {\n return this.options.attribute.link.content;\n },\n set: function set(v) {\n var _this14 = this;\n this.options.attribute.link.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-link').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.link.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.link.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.link.content[i].name + \"
\\n
\" + this.options.attribute.link.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n linkEdit: function () {\n var _linkEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(index) {\n var table, tableContent, item, _loop2, _i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return _this14.options.attribute.link.content;\n case 2:\n _this14.attributeLink = _context3.sent;\n table = _this14._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop2 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop2(_i) {\n var height, _html, textareaElm, td, btn, n, _iterator, _step, _loop3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(index === _i)) {\n _context2.next = 36;\n break;\n }\n height = item[_i].offsetHeight;\n _html = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i].innerHTML = _html;\n textareaElm = item[_i].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this14.options.attribute.link.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this14.options.attribute.link.content[index].url;\n btn = item[_i].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context2.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context2.next = 14;\n break;\n }\n return _context2.abrupt(\"continue\", 32);\n case 14:\n _iterator = _createForOfIteratorHelper(btn[n].attributes);\n _context2.prev = 15;\n _loop3 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop3() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop3$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n m = _step.value;\n if (!(m.name === '@click')) {\n _context.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _loop3);\n });\n _iterator.s();\n case 18:\n if ((_step = _iterator.n()).done) {\n _context2.next = 24;\n break;\n }\n return _context2.delegateYield(_loop3(), \"t0\", 20);\n case 20:\n if (!_context2.t0) {\n _context2.next = 22;\n break;\n }\n return _context2.abrupt(\"break\", 24);\n case 22:\n _context2.next = 18;\n break;\n case 24:\n _context2.next = 29;\n break;\n case 26:\n _context2.prev = 26;\n _context2.t1 = _context2[\"catch\"](15);\n _iterator.e(_context2.t1);\n case 29:\n _context2.prev = 29;\n _iterator.f();\n return _context2.finish(29);\n case 32:\n n++;\n _context2.next = 11;\n break;\n case 35:\n return _context2.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context2.stop();\n }\n }, _loop2, null, [[15, 26, 29, 32]]);\n });\n _i = 0;\n case 8:\n if (!(_i < item.length)) {\n _context3.next = 15;\n break;\n }\n return _context3.delegateYield(_loop2(_i), \"t0\", 10);\n case 10:\n if (!_context3.t0) {\n _context3.next = 12;\n break;\n }\n return _context3.abrupt(\"break\", 15);\n case 12:\n _i++;\n _context3.next = 8;\n break;\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }, _callee);\n }));\n function linkEdit(_x) {\n return _linkEdit.apply(this, arguments);\n }\n return linkEdit;\n }(),\n linkDelete: function linkDelete(i) {\n _this14.options.attribute.link.content.splice(i, 1);\n _this14.attributeLink = _this14.options.attribute.link.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, '');\n var url = value.url && value.url.replace(/\\s/g, '');\n if (name && url) {\n _this14.options.attribute.link.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this14.attributeLink = _this14.options.attribute.link.content;\n },\n cancelEdit: function cancelEdit() {\n _this14.attributeLink = _this14.options.attribute.link.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect);\n fileElm.addEventListener('change', _fileSelect);\n }\n };\n var _fileSelect = function _fileSelect(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop4 = function _loop4(_i2) {\n var btn = item[_i2].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator2 = _createForOfIteratorHelper(btn[n].attributes),\n _step2;\n try {\n var _loop5 = function _loop5() {\n var m = _step2.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i2);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n if (_loop5()) break;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n };\n for (var _i2 = 0; _i2 < item.length; _i2++) {\n _loop4(_i2);\n }\n }\n\n // get attributeCamera() {\n // return this.options.attribute.camera.content\n // }\n\n // set attributeCamera(v) {\n // this.options.attribute.camera.content = v\n // }\n\n // get attributeVr() {\n // return this.options.attribute.vr.content\n // }\n\n // set attributeVr(v) {\n // this.options.attribute.vr.content = v\n // if (\n // !this._DialogObject ||\n // !this._DialogObject._element ||\n // !this._DialogObject._element.content ||\n // this._DialogObject._element.content.getElementsByClassName(\n // 'attribute-content-vr'\n // ).length == 0\n // ) {\n // return\n // }\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // tableContent.innerHTML = ''\n // if (this.options.attribute.vr.content.length > 0) {\n // table.getElementsByClassName('table-empty')[0].style.display = 'none'\n // } else {\n // table.getElementsByClassName('table-empty')[0].style.display = 'flex'\n // }\n // for (let i = 0; i < this.options.attribute.vr.content.length; i++) {\n // let tr =\n // `\n //
\n //
` +\n // this.options.attribute.vr.content[i].name +\n // `
\n //
` +\n // this.options.attribute.vr.content[i].url +\n // `
\n //
\n // \n // \n //
\n //
`\n // let trElm = document.createRange().createContextualFragment(tr)\n // tableContent.appendChild(trElm)\n // }\n // let item = tableContent.getElementsByClassName('tr')\n // let fun = {\n // vrEdit: async index => {\n // this.attributeVr = await this.options.attribute.vr.content\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // let item = tableContent.getElementsByClassName('tr')\n // for (let i = 0; i < item.length; i++) {\n // if (index === i) {\n // let height = item[i].offsetHeight\n // let html = `\n //
\n // \n //
\n //
\n // \n //
\n //
\n // \n // \n //
`\n // item[i].innerHTML = html\n // let textareaElm = item[i].getElementsByClassName('link-edit')[0]\n // textareaElm.style.height = height - 10 + 'px'\n // let td = item[i].getElementsByClassName('td')\n // td[0].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].name\n // td[1].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].url\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](\n // {\n // name: td[0].getElementsByClassName('input')[0].value,\n // url: td[1].getElementsByClassName('input')[0].value\n // },\n // i\n // )\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // break\n // }\n // }\n // },\n // vrDelete: i => {\n // this.options.attribute.vr.content.splice(i, 1)\n // this.attributeVr = this.options.attribute.vr.content\n // },\n\n // confirmEdit: (value, i) => {\n // let name = value.name && value.name.replace(/\\s/g, '')\n // let url = value.url && value.url.replace(/\\s/g, '')\n // if (name && url) {\n // this.options.attribute.vr.content[i] = value\n // } else {\n // window.ELEMENT &&\n // window.ELEMENT.Message({\n // message: '名称或链接不能为空!',\n // type: 'warning',\n // duration: 1500\n // })\n // }\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // cancelEdit: () => {\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // fileSelect: (value, i) => {\n // let fileElm = item[i].getElementsByClassName('file-select')[0]\n // fileElm.click()\n // fileElm.removeEventListener('change', fileSelect)\n // fileElm.addEventListener('change', fileSelect)\n // }\n // }\n // let fileSelect = event => {\n // if (event.target.value) {\n // let td = item[\n // event.target.getAttribute('index')\n // ].getElementsByClassName('td')\n // td[1].getElementsByClassName('input')[0].value = event.target.value\n // event.target.value = null\n // }\n // }\n // for (let i = 0; i < item.length; i++) {\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](i)\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // }\n // }\n\n // get attributeGoods() {\n // return this.options.attribute.goods.content\n // }\n\n // set attributeGoods(v) {\n // this.options.attribute.goods.content = v\n // }\n }, {\n key: \"positions\",\n get: function get() {\n return this.options.positions;\n }\n }, {\n key: \"judgeLine\",\n value: function judgeLine(entity, newParam) {\n if (!entity.polyline.oriRepeat) {\n var param = {\n color: newParam.color,\n image: this.getSourceRootPath() + \"/img/arrow/1.png\",\n space: newParam.space,\n speed: newParam.speed\n };\n param.speed = newParam.rotate ? param.speed : 0 - param.speed;\n var canvasEle = document.createElement('canvas');\n var ctx = canvasEle.getContext('2d');\n var myImg = new Image();\n // myImg.src = that.getSourceRootPath() + '/img/arrow/1.png'\n myImg.src = param.image;\n var that = this;\n myImg.onload = function () {\n canvasEle.width = myImg.width * (param.space + 1);\n canvasEle.height = myImg.height;\n var oriRepeat = that.getSceenLine(entity, param, canvasEle);\n oriRepeat && (entity.polyline.oriRepeat = oriRepeat);\n var positionProperty = entity.polyline.positions;\n var positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime);\n if (!Cesium.defined(positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < positions.length - 1; ++i) {\n distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]);\n }\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = that.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = that.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = that.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n repeatX *= groundResolution / cameraHeight / (param.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var speed = repeatX / entity.polyline.oriRepeat;\n entity.polyline.oriSpeed = speed;\n entity.polyline.oriRepeatX = repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n entity.polyline.oriSpeed = sdk3dEntity.polyline.oriSpeed;\n entity.polyline.oriRepeatX = sdk3dEntity.polyline.oriRepeatX;\n }\n };\n }\n }\n /**获取当前满屏横线速度 */\n }, {\n key: \"getSceenLine\",\n value: function getSceenLine(entity, options, canvasEle) {\n var point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight);\n // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1)\n // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2)\n\n var ray = this.sdk.viewer.camera.getPickRay(point1);\n var cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n var ray2 = this.sdk.viewer.camera.getPickRay(point2);\n var cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // if (!cartesian1 || !cartesian2) {\n // let ray = this.sdk.viewer.camera.getPickRay(point1);\n // cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n\n // let ray2 = this.sdk.viewer.camera.getPickRay(point2);\n // cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // }\n if (cartesian1 && cartesian2) {\n var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = this.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = this.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = this.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = this.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n // repeatX *= groundResolution / cameraHeight / ((myImg.width / myImg.height * 5) + 1);\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n } else {\n repeatX = undefined;\n }\n if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id);\n return sdk3dEntity.polyline.oriRepeatX;\n }\n }\n }\n /**\r\n * 编辑框\r\n * @param {boolean} state true打开,false关闭\r\n */\n }, {\n key: \"edit\",\n value: (function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2(state) {\n var _this15 = this;\n var _this, tabClick, contentElm, tabsElm, colorPicker, labelColorPicker, extendColorPicker, lineColorPicker, labelBackgroundColorEndPicker, all_elm;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n return _context4.abrupt(\"return\");\n case 8:\n this._DialogObject = _context4.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' polyline';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_10__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__[\"default\"]('polyline-object-edit-tabs', tabClick, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('color')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n extendColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('extendColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n lineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelLineColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this.labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorStart')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this15.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this15.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorEnd')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this15.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this15.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName('*');\n _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].on(this, all_elm);\n this._elms = _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].element;\n this._elms.color = [colorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.extendColor = [extendColorPicker];\n this._elms.labelLineColor = [lineColorPicker];\n this._elms.labelBackgroundColorStart = [_this.labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n setTimeout(function () {\n _this15.attributeLink = _this15.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n var tagData = _this15.attributeSelect;\n var attributeElm = _this15._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(attributeElm, '.attribute-select');\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this15._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var i = 0; i < tagData.length; i++) {\n if (tagData[i].key === _this15.options.attributeType) {\n attributeSelectElm.value = tagData[i].value;\n legpObject.legp_searchActive(tagData[i].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i3 = 0; _i3 < tagData.length; _i3++) {\n if (tagData[_i3].value === attributeSelectElm.value) {\n _this15.attributeType = tagData[_i3].key;\n break;\n }\n }\n });\n }\n var nameData = [{\n name: '空间长度',\n value: '空间长度'\n }, {\n name: '投影长度',\n value: '投影长度'\n }, {\n name: '地表长度',\n value: '地表长度'\n }];\n var nameDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit');\n if (nameDataLegpObject) {\n nameDataLegpObject.legp_search(nameData);\n var nameDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n _this15._elms.wordsName = [nameDataLegpElm];\n nameDataLegpElm.value = _this15.options.wordsName;\n for (var _i4 = 0; _i4 < nameData.length; _i4++) {\n if (nameData[_i4].value === nameDataLegpElm.value) {\n nameDataLegpObject.legp_searchActive(nameData[_i4].value);\n break;\n }\n }\n nameDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < nameData.length; _i5++) {\n if (nameData[_i5].value === nameDataLegpElm.value) {\n _this15.wordsName = nameData[_i5].value;\n break;\n }\n }\n });\n }\n\n // 原始长度单位\n var unitData = [{\n name: '米',\n value: '米'\n }, {\n name: '千米',\n value: '千米'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit', 1);\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('input-select-unit')[1].getElementsByTagName('input')[0];\n _this15._elms.lengthUnit = [unitDataLegpElm];\n unitDataLegpElm.value = _this15.options.lengthUnit;\n for (var _i6 = 0; _i6 < unitData.length; _i6++) {\n if (unitData[_i6].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i6].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < unitData.length; _i7++) {\n if (unitData[_i7].value === unitDataLegpElm.value) {\n _this15.lengthUnit = unitData[_i7].value;\n break;\n }\n }\n });\n }\n //\n\n // 拟合长度单位\n // let fitUnitData = [\n // {\n // name: '米',\n // value: '米'\n // },\n // {\n // name: '千米',\n // value: '千米'\n // }\n // ]\n\n // let fitUnitDataLegpObject = legp(\n // this._DialogObject._element.content.getElementsByClassName(\n // 'input-select-fit-unit-box'\n // )[0],\n // '.input-select-fit-unit'\n // )\n // if (fitUnitDataLegpObject) {\n // fitUnitDataLegpObject.legp_search(fitUnitData)\n // let fitUnitDataLegpElm = this._DialogObject._element.content\n // .getElementsByClassName('input-select-fit-unit')[0]\n // .getElementsByTagName('input')[0]\n // this._elms.fitLengthUnit = [fitUnitDataLegpElm]\n // fitUnitDataLegpElm.value = this.options.fitLengthUnit\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // fitUnitDataLegpObject.legp_searchActive(fitUnitData[i].value)\n // break\n // }\n // }\n // fitUnitDataLegpElm.addEventListener('input', () => {\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // this.fitLengthUnit = fitUnitData[i].value\n // break\n // }\n // }\n // })\n // }\n\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n var lineTypeDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('input-select-line-type-box')[0], '.input-select-line-type');\n if (lineTypeDataLegpObject) {\n lineTypeDataLegpObject.legp_search(lineTypeData);\n var iActiveElm2 = document.createElement('i');\n iActiveElm2.className = 'icon icon-active';\n _this15._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByClassName('cy_datalist')[0].appendChild(iActiveElm2);\n var lineTypeDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByTagName('input')[0];\n _this15._elms.lineType = [lineTypeDataLegpElm];\n for (var _i8 = 0; _i8 < lineTypeData.length; _i8++) {\n if (lineTypeData[_i8].key === _this15.options.type) {\n lineTypeDataLegpObject.legp_searchActive(lineTypeData[_i8].value);\n lineTypeDataLegpElm.value = lineTypeData[_i8].value;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i8].icon);\n break;\n }\n }\n lineTypeDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < lineTypeData.length; _i9++) {\n if (lineTypeData[_i9].value === lineTypeDataLegpElm.value) {\n _this15.lineType = lineTypeData[_i9].key;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i9].icon);\n\n //控制参数显隐\n if (2 < _this15.lineType && _this15.lineType < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < _this15.lineType && _this15.lineType < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n break;\n }\n }\n });\n }\n var heightBoxElm = _this15._DialogObject._element.content.getElementsByClassName('height-box')[0];\n var heightElm = heightBoxElm.getElementsByClassName('height')[0];\n var heightConfirmElm = _this15._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (_this15.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n var heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n var heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (heightModeObject) {\n heightModeObject.legp_search(heightModeData);\n var heightModeDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n for (var _i10 = 0; _i10 < heightModeData.length; _i10++) {\n if (heightModeData[_i10].key == _this15.heightMode) {\n heightModeDataLegpElm.value = heightModeData[_i10].value;\n heightModeObject.legp_searchActive(heightModeData[_i10].value);\n break;\n }\n }\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i11 = 0; _i11 < heightModeData.length; _i11++) {\n if (heightModeData[_i11].value === heightModeDataLegpElm.value) {\n _this15.heightMode = heightModeData[_i11].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this15.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n _this15._elms.height = heightElm;\n _this15._elms.heightBox = heightBoxElm;\n _this15._elms.heightMode = heightModeDataLegpElm;\n _this15._elms.heightConfirm = heightConfirmElm;\n _this15._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n _this15.positionEditing = false;\n for (var _i12 = 0; _i12 < _this15.options.positions.length; _i12++) {\n _this15.options.positions[_i12].alt = Number((_this15.options.positions[_i12].alt + Number(heightElm.value)).toFixed(2));\n _this15._elms.alt[_i12].innerHTML = _this15.options.positions[_i12].alt;\n }\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n }\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n _this15._elms.lng = [];\n _this15._elms.lngInput = [];\n _this15._elms.lat = [];\n _this15._elms.latInput = [];\n _this15._elms.alt = [];\n _this15._elms.altInput = [];\n var _loop6 = function _loop6(_i13) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(_i13 + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this15.options.positions[_i13].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this15.options.positions[_i13].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this15.options.positions[_i13].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this15.options.positions[_i13].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this15.options.positions[_i13].alt.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this15.options.positions[_i13].alt.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this15.options.positions[_i13].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this15.options.positions[_i13].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this15.options.positions[_i13].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this15.options.positions[_i13].lng.toFixed(8);\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.label.position = [_this15.options.positions[0].lng, _this15.options.positions[0].lat, fromDegreesArray[2]];\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this15.options.positions[_i13].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this15.options.positions[_i13].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this15.options.positions[_i13].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this15.options.positions[_i13].lat.toFixed(8);\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.label.position = [_this15.options.positions[0].lng, _this15.options.positions[0].lat, fromDegreesArray[2]];\n });\n altBox.addEventListener('dblclick', function () {\n if (_this15.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this15.options.positions[_i13].alt.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this15.options.positions[_i13].alt.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this15.options.positions[_i13].alt = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = _this15.options.positions[_i13].alt.toFixed(2);\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.label.position = [_this15.options.positions[0].lng, _this15.options.positions[0].lat, fromDegreesArray[2]];\n });\n _this15._elms.lng.push(lng);\n _this15._elms.lngInput.push(lngInput);\n _this15._elms.lat.push(lat);\n _this15._elms.latInput.push(latInput);\n _this15._elms.alt.push(alt);\n _this15._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var _i13 = 0; _i13 < _this15.options.positions.length; _i13++) {\n _loop6(_i13);\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this15.labelFontFamily].value;\n for (var _i14 = 0; _i14 < fontData.length; _i14++) {\n if (fontData[_i14].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i14].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i15 = 0; _i15 < fontData.length; _i15++) {\n if (fontData[_i15].value === fontDataLegpElm.value) {\n _this15.labelFontFamily = fontData[_i15].key;\n break;\n }\n }\n });\n _this15._elms.labelFontFamily = [fontDataLegpElm];\n }\n }, 0);\n _context4.next = 34;\n break;\n case 33:\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n case 34:\n case \"end\":\n return _context4.stop();\n }\n }, _callee2, this);\n }));\n function edit(_x2) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }() // 平滑处理\n )\n }, {\n key: \"smoothHandle\",\n value: function smoothHandle(positions) {\n var newPositions = [];\n var time = [];\n var fromDegreesArrayHeights = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArrayHeights.push(positions[i].lng, positions[i].lat, positions[i].alt);\n time.push(i / (positions.length - 1));\n }\n var spline = new Cesium.CatmullRomSpline({\n times: time,\n points: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArrayHeights)\n });\n var length = positions.length * 20;\n for (var _i16 = 0; _i16 <= length; _i16++) {\n var cartesian3 = spline.evaluate(_i16 / length);\n newPositions.push(this.cartesian3Towgs84(cartesian3, this.sdk.viewer));\n }\n return newPositions;\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(positionsArray, cd) {\n var _this17 = this;\n if (this._error) {\n return;\n }\n var positions = JSON.parse(JSON.stringify(positionsArray));\n var ground;\n switch (this.heightMode) {\n case 0:\n case '0':\n ground = false;\n break;\n case 1:\n case '1':\n for (var i = 0; i < positions.length; i++) {\n var height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions[i].lng, positions[i].lat));\n positions[i].alt = height ? Number((positions[i].alt + Number(height)).toFixed(2)) : Number(positions[i].alt.toFixed(2));\n }\n ground = false;\n break;\n case 2:\n case '2':\n ground = true;\n break;\n }\n var newPositions;\n var fromDegreesArray = [];\n if (this.options.noseToTail && this.options.noseToTail !== 'false') {\n newPositions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions), [positions[0]]);\n } else {\n newPositions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions);\n }\n if (this.options.smooth && this.options.smooth !== 'false') {\n newPositions = this.smoothHandle(newPositions);\n for (var _i17 = 0; _i17 < newPositions.length; _i17++) {\n fromDegreesArray.push(newPositions[_i17].lng, newPositions[_i17].lat, newPositions[_i17].alt);\n }\n } else {\n for (var _i18 = 0; _i18 < newPositions.length; _i18++) {\n fromDegreesArray.push(newPositions[_i18].lng, newPositions[_i18].lat, newPositions[_i18].alt);\n }\n }\n\n // 计算长度\n if (this.options.noseToTail && this.options.noseToTail !== 'false' || this.options.smooth && this.options.smooth !== 'false') {\n var array = [];\n for (var _i19 = 0; _i19 < fromDegreesArray.length; _i19 += 3) {\n array.push({\n lng: fromDegreesArray[_i19],\n lat: fromDegreesArray[_i19 + 1],\n alt: fromDegreesArray[_i19 + 2]\n });\n }\n var _this16 = this;\n this.computeDistance(array, 2, this.options.wordsName).then(function (res) {\n _this16.lengthByMeter = res;\n _this17.lengthChangeCallBack && _this17.lengthChangeCallBack();\n cd && cd();\n });\n } else {\n var _this18 = this;\n this.computeDistance(positions, 2, this.options.wordsName).then(function (res) {\n _this18.lengthByMeter = res;\n _this17.lengthChangeCallBack && _this17.lengthChangeCallBack();\n cd && cd();\n });\n }\n return fromDegreesArray;\n }\n\n // 更新多边形(线扩展)\n }, {\n key: \"renewPolygon\",\n value: function renewPolygon(fromDegreesArray) {\n var linePositions = [];\n if (this.options.extend && this.options.extend !== 'false') {\n var outerHole = [];\n for (var i = 0; i < fromDegreesArray.length; i += 3) {\n linePositions.push([fromDegreesArray[i], fromDegreesArray[i + 1]]);\n }\n var linestring = turf.lineString(linePositions);\n var buffered = turf.buffer(linestring, this.options.extendWidth / 1000, {\n units: 'kilometers'\n });\n for (var _i20 = 0; _i20 < buffered.geometry.coordinates[0].length; _i20++) {\n outerHole.push(buffered.geometry.coordinates[0][_i20][0], buffered.geometry.coordinates[0][_i20][1]);\n }\n var holes = []; // 孔\n for (var _i21 = 1; _i21 < buffered.geometry.coordinates.length; _i21++) {\n var array = [];\n for (var m = 0; m < buffered.geometry.coordinates[_i21].length; m++) {\n array.push(buffered.geometry.coordinates[_i21][m][0], buffered.geometry.coordinates[_i21][m][1]);\n }\n holes.push({\n positions: Cesium.Cartesian3.fromDegreesArray(array)\n });\n }\n this.entity.polygon = new Cesium.PolygonGraphics({\n hierarchy: {\n positions: Cesium.Cartesian3.fromDegreesArray(outerHole),\n holes: holes\n },\n material: Cesium.Color.fromCssColorString(this.options.extendColor)\n });\n } else {\n this.entity.polygon = undefined;\n }\n }\n }, {\n key: \"reset\",\n value: function () {\n var _reset = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (this.entity) {\n _context5.next = 2;\n break;\n }\n return _context5.abrupt(\"return\");\n case 2:\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineWidth = this.originalOptions.width;\n this.lineType = this.originalOptions.type;\n this.noseToTail = this.originalOptions.noseToTail;\n this.smooth = this.originalOptions.smooth;\n this.extend = this.originalOptions.extend;\n this.extendWidth = this.originalOptions.extendWidth;\n this.extendColor = this.originalOptions.extendColor;\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n this.attributeLink = this.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n this.rotate = this.originalOptions.rotate;\n this.speed = this.originalOptions.speed;\n // this.dashSize = this.originalOptions.dashSize\n this.space = this.originalOptions.space;\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n\n this.heightMode = this.options.heightMode;\n\n // let height\n // if (this.ground) {\n // height = await that.getClampToHeight({\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat\n // })\n // } else {\n // height = this.options.positions[0].alt\n // }\n // this.options.label.position = {\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat,\n // alt: height\n // }\n // this.label.position = [\n // this.options.label.position.lng,\n // this.options.label.position.lat,\n // this.options.label.position.alt\n // ]\n case 26:\n case \"end\":\n return _context5.stop();\n }\n }, _callee3, this);\n }));\n function reset() {\n return _reset.apply(this, arguments);\n }\n return reset;\n }()\n }, {\n key: \"_addLink\",\n value: function _addLink() {\n if (this._DialogObject._element.content.getElementsByClassName('link_add')[0].value) {\n this.options.attribute.link.content.push({\n name: '链接' + (this.options.attribute.link.content.length + 1),\n url: this._DialogObject._element.content.getElementsByClassName('link_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('link_add')[0].value = '';\n this.attributeLink = this.options.attribute.link.content;\n } else {\n this.Dialog.clickAddLink && this.Dialog.clickAddLink();\n // let input = document.createElement('input');\n // input.type = \"file\";\n // input.accept = \".mp4, .pdf\"\n // input.click()\n // input.addEventListener('change', (event) => {\n // if (input.value) {\n // this.options.attribute.link.content.push({\n // name: '链接' + (this.options.attribute.link.content.length + 1),\n // url: input.value\n // })\n // this.attributeLink = this.options.attribute.link.content\n // }\n // })\n }\n }\n }, {\n key: \"addAttributeLink\",\n value: function addAttributeLink(link) {\n this.options.attribute.link.content.push({\n name: '链接' + (this.options.attribute.link.content.length + 1),\n url: link\n });\n this.attributeLink = this.options.attribute.link.content;\n }\n\n // _addRr() {\n // if (\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // ) {\n // this.options.attribute.vr.content.push({\n // name: '全景图' + (this.options.attribute.vr.content.length + 1),\n // url: this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // })\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value = ''\n // this.attributeVr = this.options.attribute.vr.content\n // } else {\n // this.Dialog.clickAddVr && this.Dialog.clickAddVr()\n // }\n // }\n\n // addAttributeRr(vr) {\n // this.options.attribute.vr.content.push({\n // name: '全景图' + (this.options.attribute.vr.content.length + 1),\n // url: vr\n // })\n // this.attributeVr = this.options.attribute.vr.content\n // }\n\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n height,\n i,\n a,\n _i22,\n _a,\n _i23,\n _a2,\n BoundingSphere,\n _args6 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n options = _args6.length > 0 && _args6[0] !== undefined ? _args6[0] : {};\n if (!this._error) {\n _context6.next = 3;\n break;\n }\n return _context6.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context6.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context6.next = 18;\n break;\n }\n _context6.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context6.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context6.next = 43;\n break;\n case 25:\n positionArray = [];\n _context6.t0 = this.options.heightMode;\n _context6.next = _context6.t0 === '0' ? 29 : _context6.t0 === 0 ? 29 : _context6.t0 === '1' ? 31 : _context6.t0 === 1 ? 31 : _context6.t0 === '2' ? 36 : _context6.t0 === 2 ? 36 : 41;\n break;\n case 29:\n for (i = 0; i < this.options.positions.length; i++) {\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt);\n positionArray.push(a.x, a.y, a.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 31:\n _context6.next = 33;\n return this.getClampToHeight(this.options.positions[0]);\n case 33:\n height = _context6.sent;\n for (_i22 = 0; _i22 < this.options.positions.length; _i22++) {\n _a = Cesium.Cartesian3.fromDegrees(this.options.positions[_i22].lng, this.options.positions[_i22].lat, height + this.options.positions[_i22].alt);\n positionArray.push(_a.x, _a.y, _a.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 36:\n _context6.next = 38;\n return this.getClampToHeight(this.options.positions[0]);\n case 38:\n height = _context6.sent;\n for (_i23 = 0; _i23 < this.options.positions.length; _i23++) {\n _a2 = Cesium.Cartesian3.fromDegrees(this.options.positions[_i23].lng, this.options.positions[_i23].lat, height);\n positionArray.push(_a2.x, _a2.y, _a2.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 41:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 43:\n case \"end\":\n return _context6.stop();\n }\n }, _callee4, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 打开富文本框\r\n */\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this19 = this;\n // var ue = UE.getEditor('app');\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].primaryCallBack = function (content) {\n _this19.options.richTextContent = content;\n };\n }\n\n // static nodeEdit2(that, cb = () => { }) {\n // that.positionEditing = false\n // if (YJ.Measure.GetMeasureStatus()) {\n // cb('上一次测量未结束')\n // } else {\n // YJ.Measure.SetMeasureStatus(true)\n // that.tip = new MouseTip('请选择一个顶点,右键取消', that.sdk)\n // that.event = new MouseEvent(that.sdk)\n // that.nodePoints = []\n // let selectPoint\n // let originalPosition\n // let newpositions = []\n // let fromDegreesArray = []\n // for (let i = 0; i < that.options.positions.length; i++) {\n // fromDegreesArray.push(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray)\n\n // that.event.mouse_left((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // originalPosition = that.options.positions[selectPoint.index]\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[selectPoint.index].lng,\n // that.options.positions[selectPoint.index].lat,\n // that.options.positions[selectPoint.index].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.splice(selectPoint.index, 0, entity)\n // that.options.positions.splice(\n // selectPoint.index,\n // 0,\n // that.options.positions[selectPoint.index]\n // )\n // let fromDegreesArray = that.renewPositions(that.options.positions)\n // that.renewPolygon(fromDegreesArray)\n // that.options.lengthByMeter = that.computeDistance(\n // that.options.positions,\n // 2,\n // that.ground\n // )\n // that.lengthUnit = that.options.lengthUnit\n // } else {\n // var pick = that.sdk.viewer.scene.pick(movement.position)\n // if (\n // pick &&\n // pick.id &&\n // pick.id.name &&\n // pick.id.name === 'node-secondary-edit-point'\n // ) {\n // selectPoint = pick.id\n // that.nodePoints.splice(pick.id.index, 1)\n // that.sdk.viewer.entities.remove(pick.id)\n // that.tip.set_text('左键开始,右键结束,CTRL+右键撤销')\n // originalPosition = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // }\n // }\n // })\n\n // that.event.mouse_right((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = originalPosition\n // cb(null, that.options.positions)\n // }\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // for (let i = 0; i < that.nodePoints.length; i++) {\n // that.sdk.viewer.entities.remove(that.nodePoints[i])\n // }\n // that.nodePoints = []\n // that.event.destroy()\n // that.tip.destroy()\n // })\n\n // that.event.mouse_move((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // if (that.options.positions.length === 1) {\n // that.label.position = [\n // that.options.positions[0].lng,\n // that.options.positions[0].lat,\n // that.options.positions[0].alt\n // ]\n // that.options.label.position = {\n // lng: that.options.positions[0].lng,\n // lat: that.options.positions[0].lat,\n // alt: that.options.positions[0].alt\n // }\n // }\n // }\n // that.tip.setPosition(\n // cartesian,\n // movement.endPosition.x,\n // movement.endPosition.y\n // )\n // })\n\n // that.event.mouse_right_keyboard_ctrl((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions.pop()\n // that.sdk.viewer.entities.remove(\n // that.nodePoints[that.nodePoints.length - 1]\n // )\n // that.nodePoints.pop()\n // if (selectPoint.index === that.options.positions.length) {\n // if (that.nodePoints[selectPoint.index - 1]) {\n // selectPoint = that.nodePoints[selectPoint.index - 1]\n // } else {\n // selectPoint.index = 0\n // }\n // }\n // }\n // })\n\n // that.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n // return newpositions\n // }, false)\n\n // for (let i = 0; i < that.options.positions.length; i++) {\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // index: i,\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.push(entity)\n // }\n // }\n // }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit(cd) {\n var _this20 = this;\n this.positionEditing = false;\n this.noseToTail = false;\n // this.smooth = false\n this.heightMode = 0;\n if (YJ.Measure.GetMeasureStatus()) {} else {\n this.closeNodeEdit();\n YJ.Measure.SetMeasureStatus(true);\n this._nodeEditCallback = cd;\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('请选择一个顶点,右键取消', this.sdk);\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.ControllerObject = new _Controller_index__WEBPACK_IMPORTED_MODULE_18__[\"default\"](this.sdk);\n var selectPoint;\n this.event.mouse_left(function (movement, cartesian) {\n var pick = _this20.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n _this20.ControllerObject.position = _this20.options.positions[selectPoint.index];\n _this20.ControllerObject.editTranslational();\n _this20.tip && _this20.tip.destroy();\n _this20.ControllerObject.controllerCallBack = function (params) {\n if (selectPoint.index === 0) {\n _this20.label.position = [params.position.lng, params.position.lat, params.position.alt];\n _this20.options.label.position = {\n lng: params.position.lng,\n lat: params.position.lat,\n alt: params.position.alt\n };\n }\n _this20.options.positions[selectPoint.index] = params.position;\n _this20._elms.lng && (_this20._elms.lng[selectPoint.index].innerHTML = params.position.lng.toFixed(8));\n _this20._elms.lngInput && (_this20._elms.lngInput[selectPoint.index].value = params.position.lng.toFixed(8));\n _this20._elms.lat && (_this20._elms.lat[selectPoint.index].innerHTML = params.position.lat.toFixed(8));\n _this20._elms.latInput && (_this20._elms.latInput[selectPoint.index].value = params.position.lat.toFixed(8));\n _this20._elms.alt && (_this20._elms.alt[selectPoint.index].innerHTML = params.position.alt.toFixed(2));\n _this20._elms.altInput && (_this20._elms.altInput[selectPoint.index].value = params.position.alt.toFixed(2));\n selectPoint.position = Cesium.Cartesian3.fromDegrees(params.position.lng, params.position.lat, params.position.alt);\n };\n }\n });\n this.event.mouse_right(function (movement, cartesian) {\n for (var i = 0; i < _this20.nodePoints.length; i++) {\n _this20.sdk.viewer.entities.remove(_this20.nodePoints[i]);\n }\n _this20.nodePoints = [];\n _this20.event.destroy();\n _this20.tip && _this20.tip.destroy();\n _this20.tip = null;\n _this20.ControllerObject.destroy();\n var fromDegreesArray = _this20.renewPositions(_this20.options.positions);\n _this20.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n YJ.Measure.SetMeasureStatus(false);\n _this20._nodeEditCallback = null;\n });\n this.event.mouse_move(function (movement, cartesian) {\n _this20.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n var fromDegreesArray = _this20.renewPositions(_this20.options.positions);\n _this20._nodeEditCallback(_this20.options.positions, _this20.lengthByMeter);\n return Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n }, false);\n for (var i = 0; i < this.options.positions.length; i++) {\n var entity = this.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: i,\n position: Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt),\n billboard: {\n image: this.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n this.nodePoints.push(entity);\n }\n }\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit() {\n YJ.Measure.SetMeasureStatus(false);\n this.ControllerObject && this.ControllerObject.destroy();\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.tip = null;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n this._nodeEditCallback = null;\n }\n\n /**\r\n * 删除\r\n */\n }, {\n key: \"remove\",\n value: (function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.label && this.label.remove();\n this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context7.next = 8;\n return this.sdk.removeIncetance(this.options.id);\n case 8:\n _context7.next = 10;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(this.sdk, this.options.id);\n case 10:\n case \"end\":\n return _context7.stop();\n }\n }, _callee5, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n )\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this21 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.operate.positionEditing = status;\n if (status === true) {\n this.closeNodeEdit();\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var positions = JSON.parse(JSON.stringify(this.options.positions));\n // let positions2 = JSON.parse(JSON.stringify(positions))\n // for (let i = 0; i < positions2.length; i++) {\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions2[i].lng, positions2[i].lat))\n // positions2[i] = Cesium.Cartesian3.fromDegrees(\n // positions2[i].lng,\n // positions2[i].lat,\n // Number((positions2[i].alt + Number(height)).toFixed(2))\n // )\n // }\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(this.options.positions)\n };\n for (var i = 0; i < positions.length; i++) {\n positions[i] = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n }\n var center = positions[Math.floor(positions.length / 2)];\n var disparity = [];\n for (var _i24 = 0; _i24 < positions.length; _i24++) {\n center.x - positions[_i24].x;\n disparity.push({\n x: center.x - positions[_i24].x,\n y: center.y - positions[_i24].y,\n z: center.z - positions[_i24].z\n });\n }\n var newpositions = [];\n this.event.mouse_move(function (movement, cartesian) {\n newpositions = [];\n for (var _i25 = 0; _i25 < disparity.length; _i25++) {\n var newP = {\n x: cartesian.x - disparity[_i25].x,\n y: cartesian.y - disparity[_i25].y,\n z: cartesian.z - disparity[_i25].z\n };\n // let pos84 = this.cartesian3Towgs84(\n // newP,\n // this.sdk.viewer\n // )\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(pos84.lng, pos84.lat))\n // pos84.alt = Number((pos84.alt + Number(height)).toFixed(2))\n // newP = Cesium.Cartesian3.fromDegrees(\n // pos84.lng,\n // pos84.lat,\n // pos84.alt\n // )\n newpositions.push(newP);\n }\n var position84 = _this21.cartesian3Towgs84(newpositions[0], _this21.sdk.viewer);\n _this21.label.position = [position84.lng, position84.lat, position84.alt];\n _this21.options.label.position = {\n lng: position84.lng,\n lat: position84.lat,\n alt: position84.alt\n };\n _this21.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this21.event.mouse_move(function () {});\n _this21.event.mouse_left(function () {});\n _this21.event.mouse_right(function () {});\n newpositions = [];\n for (var _i26 = 0; _i26 < disparity.length; _i26++) {\n newpositions.push({\n x: cartesian.x - disparity[_i26].x,\n y: cartesian.y - disparity[_i26].y,\n z: cartesian.z - disparity[_i26].z\n });\n }\n var positionsLngLat = [];\n for (var _i27 = 0; _i27 < newpositions.length; _i27++) {\n var position = _this21.cartesian3Towgs84(newpositions[_i27], _this21.sdk.viewer);\n position.alt = _this21.options.positions[_i27].alt;\n positionsLngLat.push(position);\n _this21._elms.lng && (_this21._elms.lng[_i27].innerHTML = position.lng.toFixed(8));\n _this21._elms.lngInput && (_this21._elms.lngInput[_i27].value = position.lng.toFixed(8));\n _this21._elms.lat && (_this21._elms.lat[_i27].innerHTML = position.lat.toFixed(8));\n _this21._elms.latInput && (_this21._elms.latInput[_i27].value = position.lat.toFixed(8));\n _this21._elms.alt && (_this21._elms.alt[_i27].innerHTML = position.alt.toFixed(2));\n _this21._elms.altInput && (_this21._elms.altInput[_i27].value = position.alt.toFixed(2));\n }\n _this21.options.positions = positionsLngLat;\n _this21.previous.positions = positionsLngLat;\n\n // this.entity.polyline.positionsLngLat = positionsLngLat\n var fromDegreesArray = _this21.renewPositions(_this21.options.positions, function () {\n if (_this21._positionEditingCallback) {\n _this21._positionEditingCallback();\n _this21._positionEditingCallback = null;\n }\n });\n _this21.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this21.renewPolygon(fromDegreesArray);\n _this21.positionEditing = false;\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this21.event.mouse_move(function () {});\n _this21.event.mouse_left(function () {});\n _this21.event.mouse_right(function () {});\n _this21.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this21.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n // 长按取消\n _this21.event.mouse_move(function () {});\n _this21.event.mouse_left(function () {});\n _this21.event.mouse_right(function () {});\n _this21.positionEditing = false;\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (newpositions.length > 0) {\n return newpositions;\n } else {\n return positions;\n }\n }, false);\n } else {\n if (!this.sdk || !this.sdk.viewer || !this.label || !this.label.entity) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.heightMode) {\n case 0:\n case '0':\n case 1:\n case '1':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat, fromDegreesArray[2]];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n case 2:\n case '2':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n }\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n this._positionEditingCallback = cd;\n }\n }, {\n key: \"lengthChangeCallBack\",\n get: function get() {\n return this._lengthChangeCallBack;\n },\n set: function set(cd) {\n this._lengthChangeCallBack = cd;\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _Cesium$Cartesian,\n _this22 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: '',\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var points = [];\n for (var i = 0; i < this.options.positions.length; i++) {\n points.push([this.options.positions[i].lng, this.options.positions[i].lat]);\n }\n var line = turf.lineString(points);\n var length = turf.length(line, {\n units: 'kilometers'\n });\n var sliced = turf.lineSliceAlong(line, 0, length / 2, {\n units: 'kilometers'\n });\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(sliced.geometry.coordinates[sliced.geometry.coordinates.length - 1]));\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this22.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }], [{\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee6(that) {\n var height, ground;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee6$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n _context8.t0 = that.options.heightMode;\n _context8.next = _context8.t0 === '0' ? 3 : _context8.t0 === 0 ? 3 : _context8.t0 === '1' ? 6 : _context8.t0 === 1 ? 6 : _context8.t0 === '2' ? 13 : _context8.t0 === 2 ? 13 : 18;\n break;\n case 3:\n ground = false;\n height = that.options.positions[0].alt;\n return _context8.abrupt(\"break\", 18);\n case 6:\n ground = false;\n _context8.next = 9;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n });\n case 9:\n _context8.t1 = _context8.sent;\n _context8.t2 = that.options.positions[0].alt;\n height = _context8.t1 + _context8.t2;\n return _context8.abrupt(\"break\", 18);\n case 13:\n ground = true;\n _context8.next = 16;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n });\n case 16:\n height = _context8.sent;\n return _context8.abrupt(\"break\", 18);\n case 18:\n if (!that.options.label.position) {\n that.options.label.position = {\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat,\n alt: height\n };\n }\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_15__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far,\n ground: ground\n });\n case 20:\n case \"end\":\n return _context8.stop();\n }\n }, _callee6);\n }));\n function createLabel(_x3) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }, {\n key: \"create\",\n value: function create(that) {\n var ground;\n if (that.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n var positions = that.options.positions;\n var fromDegreesArray = that.renewPositions(positions);\n that.entity = that.sdk.viewer.entities.add({\n id: that.options.id,\n show: that.options.show,\n polyline: {\n positions: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray),\n width: that.options.width,\n clampToGround: ground,\n // material: that.getMaterial(that.options.color, that.options.type, that.entity, that.options),\n zIndex: that.sdk._entityZIndex\n }\n });\n that.entity.polyline.oriWidth = that.options.width;\n that.judgeLine(that.entity, that.options);\n var params = _objectSpread({}, that.options);\n params.speed = that.inputSpeed;\n that.entity.polyline.material = that.getMaterial(that.options.color, that.options.type, that.entity, params);\n that.sdk._entityZIndex++;\n PolylineObject.createLabel(that);\n // that.entity.polyline.positionsLngLat = positions\n that.renewPolygon(fromDegreesArray);\n that.computeDistance(positions, 2, that.options.wordsName).then(function (res) {\n that.lengthByMeter = res;\n that.lengthChangeCallBack && that.lengthChangeCallBack();\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(that.sdk, that.options.id);\n });\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__[\"setSplitDirection\"])(0, that.options.id);\n }\n\n // if (this.options.noseToTail) {\n // let array = []\n // for (let i = 0; i < fromDegreesArray.length; i += 2) {\n // array.push({ lng: fromDegreesArray[i], lat: fromDegreesArray[i + 1] })\n // }\n // this.options.fit_length = tool.computeDistance(array)\n // }\n // else {\n // this.options.fit_length = tool.computeDistance(positions)\n // }\n // if (this.options.fit_length_unit === 'km') {\n // this.options.fit_length = this.options.fit_length / 1000\n // }\n\n var scene = that.sdk.viewer.scene;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_11__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (PolylineObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvUG9seWxpbmVPYmplY3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvT2JqL0Jhc2UvUG9seWxpbmVPYmplY3QvaW5kZXguanM/YmM3OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQGRlc2NyaXB0aW9uIOe6v1xyXG4gKi9cclxuaW1wb3J0IERpYWxvZyBmcm9tICcuLi8uLi9FbGVtZW50L0RpYWxvZydcclxuaW1wb3J0IHsgaHRtbCB9IGZyb20gJy4vX2VsZW1lbnQnXHJcbmltcG9ydCBCYXNlIGZyb20gJy4uL2luZGV4J1xyXG5pbXBvcnQgY3lfdGFicyBmcm9tICcuLi8uLi9FbGVtZW50L2N5X2h0bWxfdGFicydcclxuaW1wb3J0IHJpY2hUZXh0IGZyb20gJy4uLy4uL0VsZW1lbnQvcmljaFRleHQnXHJcbmltcG9ydCBFdmVudEJpbmRpbmcgZnJvbSAnLi9ldmVudEJpbmRpbmcnXHJcbmltcG9ydCBMYWJlbE9iamVjdCBmcm9tICcuLi9MYWJlbE9iamVjdCdcclxuaW1wb3J0IE1vdXNlRXZlbnQgZnJvbSAnLi4vLi4vLi4vRXZlbnQvaW5kZXgnXHJcbmltcG9ydCBNb3VzZVRpcCBmcm9tICcuLi8uLi8uLi9Nb3VzZVRpcCdcclxuaW1wb3J0IENvbnRyb2xsZXIgZnJvbSAnLi4vLi4vLi4vQ29udHJvbGxlci9pbmRleCdcclxuaW1wb3J0IHsgc3luY0RhdGEsIGdldDNEVmlldyB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9NdWx0aVZpZXdwb3J0TW9kZSdcclxuaW1wb3J0IHsgbGVncCB9IGZyb20gJy4uLy4uL0VsZW1lbnQvZGF0YWxpc3QnXHJcbmltcG9ydCB7IGdldEZvbnRMaXN0LCBnZXRGb250RmFtaWx5TmFtZSB9IGZyb20gJy4uLy4uL0VsZW1lbnQvZm9udFNlbGVjdCdcclxuaW1wb3J0IHsgc2V0U3BsaXREaXJlY3Rpb24sIHN5bmNTcGxpdERhdGEsIHNldEFjdGl2ZUlkIH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL1NwbGl0U2NyZWVuJ1xyXG5pbXBvcnQgeyBzZXRBY3RpdmVWaWV3ZXIsIGNsb3NlUm90YXRlQXJvdW5kLCBjbG9zZVZpZXdGb2xsb3cgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvZ2xvYmFsJ1xyXG5cclxuY2xhc3MgUG9seWxpbmVPYmplY3QgZXh0ZW5kcyBCYXNlIHtcclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gc2RrXHJcbiAgICogQGRlc2NyaXB0aW9uIOaKmOe6v1xyXG4gICAqIEBwYXJhbSBvcHRpb25zIHtvYmplY3R9IOe6v+WxnuaAp1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLm5hbWV7c3RyaW5nfSDlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy53aWR0aD0ze251bWJlcn0g57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY29sb3I9I2ZmMDAwMCB7c3RyaW5nfSDpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy50eXBlPTAge251bWJlcn0g5p2Q6LSo57G75Z6LIDAt5a6e57q/IDEt6Jma57q/IDIt5rOb5YWJLi4uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0TW9kZT0ye251bWJlcn0g6auY5bqm5qih5byP77yIMO+8mua1t+aLlOmrmOW6pu+8mzHvvJrnm7jlr7npq5jluqbvvJsy77ya5L6d6ZmE5qih5byP77yJXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubm9zZVRvVGFpbD1mYWxzZSB7Ym9vbGVhbn0g6aaW5bC+55u46L+eXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc21vb3RoPWZhbHNlIHtib29sZWFufSDnur/mrrXlnIbmu5FcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRlbmQ9ZmFsc2Uge2Jvb2xlYW59IOe6v+e8k+WGslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmV4dGVuZFdpZHRoPTEwIHtudW1iZXJ9IOe6v+e8k+WGsuWuveW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmV4dGVuZENvbG9yPXJnYmEoMjU1LDI1NSw4MCwwLjMpIHtudW1iZXJ9IOe6v+e8k+WGsuminOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnNob3c9dHJ1ZSB7Ym9vbGVhbn0g5pi+6ZqQXHJcbiAgICogQHBhcmFtIHtBcnJheS48b2JqZWN0Pn0gb3B0aW9ucy5wb3NpdGlvbnMg5b+F5aGr77yM57uP57qs5bqm5ZKM6auY5bqm55qE5YiX6KGo77yM5YC85Lqk5pu/IFt7bG9uLGxhdCxhbHR9LC4uLl1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBcclxuICAgKiBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5ub3NlVG9UYWlsPWZhbHNlIHtib29sZWFufSDmmK/lkKbpppblsL7nm7jov55cclxuICAgKiBcclxuICAgKiBcclxuICAgKiBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbCB7b2JqZWN0fSDmoIfnrb7lr7nosaFcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC50ZXh0IHtzdHJpbmd9IOagh+etvuaWh+acrFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNob3cge3N0cmluZ30g5qCH562+5pi+6ZqQXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ge3N0cmluZ30g5qCH562+5L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ge29iamVjdH0g5qCH562+5L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZm9udFNpemU9MjAge251bWJlcn0g5a2X5L2T5aSn5bCPXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZm9udEZhbWlseT0wIHtudW1iZXJ9IOWtl+S9k+mhuSAw77ya6buR5L2T77ybMe+8muaAnea6kOm7keS9k++8mzLvvJrlup7pl6jmraPpgZPmoIfpopjkvZPvvJsz77ya5pWw6buR5L2TXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuY29sb3I9I2ZmZmZmZiB7c3RyaW5nfSDlrZfkvZPpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5saW5lV2lkdGg9NCB7bnVtYmVyfSDlvJXnur/lrr1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5saW5lQ29sb3I9IzAwZmZmZjgwIHtzdHJpbmd9IOW8lee6v+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0PTIwIHtudW1iZXJ9IOWtl+S9k+WBj+enuyjlvJXnur/plb/luqYpXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yPVsnIzAwZmZmZjgwJywgJyMwMGZmZmY4MCddIHthcnJheX0g6IOM5pmv6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlIHtib29sZWFufSDot53nprvnvKnmlL5cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5uZWFyPTIwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+R6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZmFyPTEwMDAwMCB7bnVtYmVyfSDop4bph47nvKnmlL7mnIDov5zot53nprtcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUge29iamVjdH0g5bGe5oCn5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbms9e30ge3N0cmluZ30g6ZO+5o6lXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudD1bXV0ge2FycmF5fSDpk77mjqXlhoXlrrlcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W10ubmFtZSB7c3RyaW5nfSDpk77mjqXlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W10udXJsIHtzdHJpbmd9IOmTvuaOpeWcsOWdgFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnJpY2hUZXh0Q29udGVudCB7c3RyaW5nfSDlr4zmlofmnKzlhoXlrrlcclxuICAgKiBcclxuICAgKiBcclxuICAgKiBAcGFyYW0gX0RpYWxvZyB7b2JqZWN0fSDlvLnmoYbkuovku7ZcclxuICAgKiBAcGFyYW0gX0RpYWxvZy5jb25maXJtQ2FsbEJhY2sge2Z1bmN0aW9ufSDlvLnmoYbnoa7orqTml7bnmoTlm57osINcclxuICAgKiAqL1xyXG4gIGNvbnN0cnVjdG9yKHNkaywgb3B0aW9ucyA9IHt9LCBfRGlhbG9nID0ge30pIHtcclxuICAgIHN1cGVyKHNkaywgb3B0aW9ucylcclxuICAgIHRoaXMub3B0aW9ucy5uYW1lID0gb3B0aW9ucy5uYW1lIHx8ICfmnKrlkb3lkI3lr7nosaEnXHJcbiAgICB0aGlzLm9wdGlvbnMud2lkdGggPSAoKG9wdGlvbnMud2lkdGggfHwgb3B0aW9ucy53aWR0aCA9PT0gMCkgPyBvcHRpb25zLndpZHRoIDogMylcclxuICAgIHRoaXMub3B0aW9ucy5jb2xvciA9IG9wdGlvbnMuY29sb3IgfHwgJyNmZjAwMDAnXHJcbiAgICB0aGlzLm9wdGlvbnMudHlwZSA9IG9wdGlvbnMudHlwZSA/IE51bWJlcihvcHRpb25zLnR5cGUpIDogMFxyXG4gICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgPSBvcHRpb25zLm5vc2VUb1RhaWwgfHwgZmFsc2VcclxuICAgIHRoaXMub3B0aW9ucy5zbW9vdGggPSBvcHRpb25zLnNtb290aCB8fCBmYWxzZVxyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZCA9IG9wdGlvbnMuZXh0ZW5kIHx8IGZhbHNlXHJcbiAgICB0aGlzLm9wdGlvbnMucm90YXRlID0gKG9wdGlvbnMucm90YXRlIHx8IG9wdGlvbnMucm90YXRlID09PSBmYWxzZSkgPyBvcHRpb25zLnJvdGF0ZSA6IHRydWVcclxuICAgIHRoaXMub3B0aW9ucy5zcGFjZSA9IG9wdGlvbnMuc3BhY2UgfHwgMVxyXG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gb3B0aW9ucy5zcGVlZCB8fCAxMFxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmRhc2hTaXplID0gb3B0aW9ucy5kYXNoU2l6ZSB8fCAwLjAzXHJcbiAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lID0gb3B0aW9ucy53b3Jkc05hbWUgfHwgMFxyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZFdpZHRoID1cclxuICAgICAgb3B0aW9ucy5leHRlbmRXaWR0aCB8fCBvcHRpb25zLmV4dGVuZFdpZHRoID09PSAwXHJcbiAgICAgICAgPyBvcHRpb25zLmV4dGVuZFdpZHRoXHJcbiAgICAgICAgOiAxMFxyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZENvbG9yID0gb3B0aW9ucy5leHRlbmRDb2xvciB8fCAncmdiYSgyNTUsMjU1LDgwLDAuMyknXHJcbiAgICB0aGlzLm9wdGlvbnMuc2hvdyA9XHJcbiAgICAgIG9wdGlvbnMuc2hvdyB8fCBvcHRpb25zLnNob3cgPT09IGZhbHNlID8gb3B0aW9ucy5zaG93IDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAob3B0aW9ucy5oZWlnaHRNb2RlIHx8IG9wdGlvbnMuaGVpZ2h0TW9kZSA9PSAwKSA/IG9wdGlvbnMuaGVpZ2h0TW9kZSA6IDJcclxuICAgIHRoaXMuX2VsbXMgPSBbXVxyXG4gICAgb3B0aW9ucy5sYWJlbCA9IG9wdGlvbnMubGFiZWwgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHtcclxuICAgICAgdGV4dDogdGhpcy5vcHRpb25zLm5hbWUsXHJcbiAgICAgIHNob3c6IG9wdGlvbnMubGFiZWwuc2hvdyB8fCBmYWxzZSxcclxuICAgICAgcG9zaXRpb246IG9wdGlvbnMubGFiZWwucG9zaXRpb24sXHJcbiAgICAgIGZvbnRTaXplOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwuZm9udFNpemUgfHwgb3B0aW9ucy5sYWJlbC5mb250U2l6ZSA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgICAgICAgICA6IDIwLFxyXG4gICAgICBmb250RmFtaWx5OiBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPyBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgOiAwLFxyXG4gICAgICBjb2xvcjogb3B0aW9ucy5sYWJlbC5jb2xvciB8fCAnI2ZmZmZmZicsXHJcbiAgICAgIGxpbmVXaWR0aDpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCB8fCBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gICAgICAgICAgOiA0LFxyXG4gICAgICBwaXhlbE9mZnNldDpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0IHx8IG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gICAgICAgICAgOiAyMCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvciB8fCBbJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSxcclxuICAgICAgbGluZUNvbG9yOiBvcHRpb25zLmxhYmVsLmxpbmVDb2xvciB8fCAnIzAwZmZmZjgwJyxcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB8fCBmYWxzZSxcclxuICAgICAgbmVhcjpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLm5lYXIgfHwgb3B0aW9ucy5sYWJlbC5uZWFyID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwubmVhclxyXG4gICAgICAgICAgOiAyMDAwLFxyXG4gICAgICBmYXI6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5mYXIgfHwgb3B0aW9ucy5sYWJlbC5mYXIgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5mYXJcclxuICAgICAgICAgIDogMTAwMDAwXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlID0gb3B0aW9ucy5hdHRyaWJ1dGUgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgPVxyXG4gICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYSB8fCB7fVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCA9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQgfHwgW11cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyIHx8IHt9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgPVxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgfHwgW11cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzIHx8IHt9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgPVxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgfHwgW11cclxuXHJcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYVxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52clxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kc1xyXG5cclxuXHJcbiAgICB0aGlzLm9wZXJhdGUgPSB7fVxyXG4gICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgIHRoaXMudW5pdE51bSA9IDBcclxuICAgIHRoaXMuaW5wdXRTcGVlZCA9IChvcHRpb25zLnNwZWVkICYmIE1hdGgucG93KG9wdGlvbnMuc3BlZWQsIC0xKSAqIDEwMCkgfHwgMTBcclxuICAgIHRoaXMuRGlhbG9nID0gX0RpYWxvZ1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMucG9zaXRpb25zIHx8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICB0aGlzLl9lcnJvciA9ICfnur/mrrXmnIDlsJHpnIDopoHkuKTkuKrlnZDmoIfvvIEnXHJcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLl9lcnJvcilcclxuICAgICAgd2luZG93LkVMRU1FTlQgJiZcclxuICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuX2Vycm9yLFxyXG4gICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nID0gTnVtYmVyKE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KSlcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCA9IE51bWJlcihOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQgPSBOdW1iZXIoTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KS50b0ZpeGVkKDIpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNkay5hZGRJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkLCB0aGlzKVxyXG4gICAgICBQb2x5bGluZU9iamVjdC5jcmVhdGUodGhpcylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBjb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY29sb3JcclxuICB9XHJcbiAgc2V0IGNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5jb2xvciA9IHYgfHwgJyNmZjAwMDAnXHJcbiAgICBsZXQgcGFyYW1zID0geyAuLi50aGlzLm9wdGlvbnMgfVxyXG4gICAgcGFyYW1zLnNwZWVkID0gdGhpcy5pbnB1dFNwZWVkXHJcbiAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gICAgaWYgKHRoaXMuX2VsbXMuY29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5jb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5vcHRpb25zLmNvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogYyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSBjXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwwLDAsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmNvbG9yW2ldID0gY29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBzcGVlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc3BlZWRcclxuICB9XHJcblxyXG4gIHNldCBzcGVlZCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSB2XHJcbiAgICB0aGlzLmlucHV0U3BlZWQgPSB2ICE9PSAwID8gTWF0aC5wb3codiwgLTEpICogMTAwIDogMFxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gICAgLy8gdGhpcy5vcHRpb25zLnNwZWVkID0gdiAhPT0gMCA/IE1hdGgucG93KHYsIC0xKSAqIDEwMCA6IDBcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCBwYXJhbXMpXHJcbiAgfVxyXG4gIC8vIGdldCBkYXNoU2l6ZSgpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuZGFzaFNpemVcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBkYXNoU2l6ZSh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuZGFzaFNpemUgPSB2XHJcbiAgLy8gICBsZXQgcGFyYW1zID0geyAuLi50aGlzLm9wdGlvbnMgfVxyXG4gIC8vICAgcGFyYW1zLnNwZWVkID0gdGhpcy5pbnB1dFNwZWVkXHJcbiAgLy8gICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAvLyAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gIC8vIH1cclxuXHJcbiAgZ2V0IHJvdGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucm90YXRlXHJcbiAgfVxyXG5cclxuICBzZXQgcm90YXRlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5yb3RhdGUgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgdGhpcy5fZWxtcy5yb3RhdGUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5yb3RhdGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcblxyXG4gICAgdGhpcy5vcHRpb25zLnJvdGF0ZSA9IHZcclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCBwYXJhbXMpXHJcbiAgfVxyXG5cclxuICBnZXQgc3BhY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNwYWNlXHJcbiAgfVxyXG5cclxuICBzZXQgc3BhY2Uodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnNwYWNlID0gdlxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCB0aGlzLm9wdGlvbnMpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHBhcmFtcylcclxuICB9XHJcblxyXG4gIGdldCB3b3Jkc05hbWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLndvcmRzTmFtZVxyXG4gIH1cclxuICBzZXQgd29yZHNOYW1lKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWUgPSB2XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgaWYgKCF0aGlzLm5vc2VUb1RhaWwpIHtcclxuICAgICAgdGhpcy5jb21wdXRlRGlzdGFuY2UoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucyxcclxuICAgICAgICAyLFxyXG4gICAgICAgIHZcclxuICAgICAgKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgLy8gX3RoaXMub3B0aW9ucy5sZW5ndGhCeU1ldGVyID0gcmVzXHJcbiAgICAgICAgLy8gaWYgKHJlcyA+IDEwMDAgfHwgcmVzID09IDEwMDApIHtcclxuICAgICAgICAvLyAgIF90aGlzLmxlbmd0aCA9IChyZXMgLyAxMDAwKS50b0ZpeGVkKDUpXHJcbiAgICAgICAgLy8gICBfdGhpcy5sZW5ndGhVbml0ID0gJ+WNg+exsydcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgX3RoaXMubGVuZ3RoID0gcmVzXHJcbiAgICAgICAgLy8gICBfdGhpcy5sZW5ndGhVbml0ID0gJ+exsydcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgX3RoaXMubGVuZ3RoQnlNZXRlciA9IHJlc1xyXG4gICAgICAgIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgJiYgdGhpcy5sZW5ndGhDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldCBmaXRMZW5ndGhVbml0KCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maXRMZW5ndGhVbml0XHJcbiAgLy8gfVxyXG4gIC8vIHNldCBmaXRMZW5ndGhVbml0KHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5maXRMZW5ndGhVbml0ID0gdlxyXG4gIC8vICAgdGhpcy5fZWxtcy5maXRMZW5ndGhVbml0ICYmXHJcbiAgLy8gICAgIHRoaXMuX2VsbXMuZml0TGVuZ3RoVW5pdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gIC8vICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICBpZiAodGhpcy5maXRMZW5ndGhCeU1ldGVyKSB7XHJcbiAgLy8gICAgIHN3aXRjaCAodikge1xyXG4gIC8vICAgICAgIGNhc2UgJ+exsyc6XHJcbiAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aCA9IHRoaXMuZml0TGVuZ3RoQnlNZXRlclxyXG4gIC8vICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICBjYXNlICfljYPnsbMnOlxyXG4gIC8vICAgICAgICAgdGhpcy5maXRMZW5ndGggPSBOdW1iZXIoXHJcbiAgLy8gICAgICAgICAgICh0aGlzLmZpdExlbmd0aEJ5TWV0ZXIgLyAxMDAwKS50b0ZpeGVkKDUpXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBicmVha1xyXG4gIC8vICAgICAgIGRlZmF1bHQ6XHJcbiAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aCA9IHRoaXMuZml0TGVuZ3RoQnlNZXRlclxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBnZXQgbGluZVdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy53aWR0aFxyXG4gIH1cclxuXHJcbiAgc2V0IGxpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMud2lkdGggPSAodiB8fCB2ID09IDApID8gdiA6IDNcclxuICAgIHRoaXMuX2VsbXMubGluZVdpZHRoICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGluZVdpZHRoLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHRoaXMub3B0aW9ucy53aWR0aFxyXG4gICAgICB9KVxyXG4gICAgaWYgKHRoaXMuZW50aXR5ICYmIHRoaXMuZW50aXR5LnBvbHlsaW5lKSB7XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLndpZHRoID0gdGhpcy5lbnRpdHkucG9seWxpbmUud2lkdGggKyB2IC0gdGhpcy5lbnRpdHkucG9seWxpbmUub3JpV2lkdGhcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUub3JpV2lkdGggPSB0aGlzLm9wdGlvbnMud2lkdGhcclxuICAgIH1cclxuICAgIC8vIHRoaXMuZW50aXR5ICYmXHJcbiAgICAvLyAgIHRoaXMuZW50aXR5LnBvbHlsaW5lICYmXHJcbiAgICAvLyAgICh0aGlzLmVudGl0eS5wb2x5bGluZS53aWR0aCA9IHRoaXMub3B0aW9ucy53aWR0aCkgJiYgKHRoaXMuZW50aXR5LnBvbHlsaW5lLm9yaVdpZHRoID0gdGhpcy5vcHRpb25zLndpZHRoKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxpbmVUeXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50eXBlXHJcbiAgfVxyXG5cclxuICBzZXQgbGluZVR5cGUodikge1xyXG4gICAgbGV0IGxpbmVUeXBlRGF0YSA9IFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbGluZVwiPjwvaT7lrp7nur8nLFxyXG4gICAgICAgIHZhbHVlOiAn5a6e57q/JyxcclxuICAgICAgICBrZXk6IDAsXHJcbiAgICAgICAgaWNvbjogJ2xpbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGRhc2gtbGluZVwiPjwvaT7omZrnur8nLFxyXG4gICAgICAgIHZhbHVlOiAn6Jma57q/JyxcclxuICAgICAgICBrZXk6IDEsXHJcbiAgICAgICAgaWNvbjogJ2Rhc2gtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbGlnaHQtbGluZVwiPjwvaT7ms5vlhYknLFxyXG4gICAgICAgIHZhbHVlOiAn5rOb5YWJJyxcclxuICAgICAgICBrZXk6IDIsXHJcbiAgICAgICAgaWNvbjogJ2xpZ2h0LWxpbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHRhaWwtbGluZVwiPjwvaT7lsL7ov7nlhYnnur8nLFxyXG4gICAgICAgIHZhbHVlOiAn5bC+6L+55YWJ57q/JyxcclxuICAgICAgICBrZXk6IDMsXHJcbiAgICAgICAgaWNvbjogJ3RhaWwtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbXVsdC10YWlsLWxpbmVcIj48L2k+5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICB2YWx1ZTogJ+WkmuWwvui/ueWFiee6vycsXHJcbiAgICAgICAga2V5OiA0LFxyXG4gICAgICAgIGljb246ICdtdWx0LXRhaWwtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZmxvdy1kYXNoLWxpbmUxXCI+PC9pPua1geWKqOiZmue6vzEnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MScsXHJcbiAgICAgICAga2V5OiA1LFxyXG4gICAgICAgIGljb246ICdmbG93LWRhc2gtbGluZTEnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGZsb3ctZGFzaC1saW5lMlwiPjwvaT7mtYHliqjomZrnur8yJyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOiZmue6vzInLFxyXG4gICAgICAgIGtleTogNixcclxuICAgICAgICBpY29uOiAnZmxvdy1kYXNoLWxpbmUyJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTFcIj48L2k+5rWB5Yqo566t5aS0MScsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQxJyxcclxuICAgICAgICBrZXk6IDcsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lMSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUyXCI+PC9pPua1geWKqOeureWktDInLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MicsXHJcbiAgICAgICAga2V5OiA4LFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTInXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lM1wiPjwvaT7mtYHliqjnrq3lpLQzJyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDMnLFxyXG4gICAgICAgIGtleTogOSxcclxuICAgICAgICBpY29uOiAncGljLWxpbmUzJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTRcIj48L2k+5rWB5Yqo566t5aS0NCcsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ0JyxcclxuICAgICAgICBrZXk6IDEwLFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTQnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNVwiPjwvaT7mtYHliqjnrq3lpLQ1JyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDUnLFxyXG4gICAgICAgIGtleTogMTEsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lNSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU2XCI+PC9pPua1geWKqOeureWktDYnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NicsXHJcbiAgICAgICAga2V5OiAxMixcclxuICAgICAgICBpY29uOiAncGljLWxpbmU2J1xyXG4gICAgICB9XHJcbiAgICBdXHJcbiAgICB0aGlzLm9wdGlvbnMudHlwZSA9IE51bWJlcih2KVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVHlwZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGxpbmVUeXBlRGF0YVtpXS5rZXkgPT09IE51bWJlcih2KSkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMubGluZVR5cGUgJiZcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGluZVR5cGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS52YWx1ZSA9IGxpbmVUeXBlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICBpZiAoMiA8IGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZSA8IDEzKSB7Ly/otLTlm77lj4LmlbBcclxuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdub25lJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoMiA8IGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZSA8IDUpIHsvL+Wwvui/ueWPguaVsFxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIHRoaXMuZW50aXR5ICYmXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lICYmXHJcbiAgICAgICh0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmNvbG9yLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy50eXBlLFxyXG4gICAgICAgIHRoaXMuZW50aXR5LFxyXG4gICAgICAgIHBhcmFtc1xyXG4gICAgICApKVxyXG4gIH1cclxuICBnZXQgbm9zZVRvVGFpbCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbFxyXG4gIH1cclxuXHJcbiAgc2V0IG5vc2VUb1RhaWwodikge1xyXG4gICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgdGhpcy5fZWxtcy5ub3NlVG9UYWlsICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubm9zZVRvVGFpbC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICAgIGlmICh0aGlzLmVudGl0eSkge1xyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICApXHJcbiAgICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICB9XHJcbiAgICAvLyBpZiAodikge1xyXG4gICAgLy8gICBpZiAodGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIgPiAxMDAwIHx8IHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyID09IDEwMDApIHtcclxuICAgIC8vICAgICBsZXQgZG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgLy8gICAgIGRvbSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXS5jbGljaygpXHJcbiAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMV1cclxuICAgIC8vICAgICBkb20gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0uY2xpY2soKVxyXG4gICAgLy8gICB9XHJcblxyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIC8vICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGhCeU1ldGVyID4gMTAwMCB8fCB0aGlzLm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9PSAxMDAwKSB7XHJcbiAgICAvLyAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMV1cclxuICAgIC8vICAgICBkb20gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMV0gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMV0uY2xpY2soKVxyXG4gICAgLy8gICB9IGVsc2Uge1xyXG4gICAgLy8gICAgIGxldCBkb20gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzFdXHJcbiAgICAvLyAgICAgZG9tICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzBdICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzBdLmNsaWNrKClcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNtb290aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc21vb3RoXHJcbiAgfVxyXG5cclxuICBzZXQgc21vb3RoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5zbW9vdGggPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgdGhpcy5fZWxtcy5zbW9vdGggJiZcclxuICAgICAgdGhpcy5fZWxtcy5zbW9vdGguZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgICBpZiAodGhpcy5lbnRpdHkpIHtcclxuICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgKVxyXG4gICAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhlaWdodE1vZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPyB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA6IDBcclxuICB9XHJcbiAgc2V0IGhlaWdodE1vZGUodikge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAodiB8fCB2ID09IDApID8gdiA6IDJcclxuICAgIGxldCBoZWlnaHRNb2RlTmFtZSA9ICcnXHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcbiAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgKVxyXG4gICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgICAgdGhpcy5leHRlbmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodE1vZGVOYW1lID0gJ+a1t+aLlOmrmOW6pidcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSBncm91bmRcclxuICAgICAgICB0aGlzLmV4dGVuZCA9IGZhbHNlXHJcbiAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn55u45a+55Zyw6KGoJ1xyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzInOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSBncm91bmRcclxuICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfkvp3pmYTmqKHlnosnXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChncm91bmQpIHtcclxuICAgICAgICB0aGlzLmxhYmVsLmdyb3VuZCA9IGdyb3VuZFxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlLnZhbHVlID0gJ+S+nemZhOaooeWeiycpXHJcbiAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5ncm91bmQgPSBncm91bmRcclxuICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICBdXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGV4dGVuZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZXh0ZW5kXHJcbiAgfVxyXG5cclxuICBzZXQgZXh0ZW5kKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmQgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgaWYgKHYpIHtcclxuICAgICAgdGhpcy5oZWlnaHRNb2RlID0gMlxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5leHRlbmQgJiZcclxuICAgICAgdGhpcy5fZWxtcy5leHRlbmQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgICBpZiAodGhpcy5lbnRpdHkpIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbmQpIHtcclxuICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24gPSB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGV4dGVuZFdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5leHRlbmRXaWR0aFxyXG4gIH1cclxuXHJcbiAgc2V0IGV4dGVuZFdpZHRoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmRXaWR0aCA9IHZcclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMuaGVpZ2h0TW9kZVxyXG4gICAgdGhpcy5fZWxtcy5leHRlbmRXaWR0aCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmV4dGVuZFdpZHRoLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICB9XHJcblxyXG4gIGdldCBleHRlbmRDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZXh0ZW5kQ29sb3JcclxuICB9XHJcbiAgc2V0IGV4dGVuZENvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmRDb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmV4dGVuZENvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMuZXh0ZW5kQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBleHRlbmRDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMuZXh0ZW5kQ29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMuZXh0ZW5kQ29sb3JbaV0gPSBleHRlbmRDb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHkgJiZcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbiAmJlxyXG4gICAgICAodGhpcy5lbnRpdHkucG9seWdvbi5tYXRlcmlhbCA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuZENvbG9yXHJcbiAgICAgICkpXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxTaG93KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93XHJcbiAgfVxyXG4gIHNldCBsYWJlbFNob3codikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnNob3cgPSB2XHJcbiAgICBpZiAodGhpcy5zaG93ICYmICF0aGlzLnNob3dWaWV3IHx8IHRoaXMuc2hvd1ZpZXcgPT0gMykge1xyXG4gICAgICB0aGlzLmxhYmVsLnNob3cgPSB2XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAgICAgICBdXHJcbiAgICAgIH0sIDApXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxhYmVsLnNob3cgPSBmYWxzZVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFNob3cgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbFNob3cuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGb250RmFtaWx5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5XHJcbiAgfVxyXG5cclxuICBzZXQgbGFiZWxGb250RmFtaWx5KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5ID0gdiB8fCAwXHJcbiAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLmZvbnRGYW1pbHkgPSB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSlcclxuXHJcbiAgICBsZXQgbmFtZSA9IGdldEZvbnRGYW1pbHlOYW1lKHRoaXMubGFiZWxGb250RmFtaWx5KSB8fCAnJ1xyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gbmFtZVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBsYWJlbENvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5jb2xvciA9IHZcclxuICAgIHRoaXMubGFiZWwuY29sb3IgPSB2XHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbENvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsQ29sb3JbaV0gPSBsYWJlbENvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGb250U2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICB9XHJcbiAgc2V0IGxhYmVsRm9udFNpemUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplID0gdlxyXG4gICAgdGhpcy5sYWJlbC5mb250U2l6ZSA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGb250U2l6ZSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udFNpemUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2NhbGVCeURpc3RhbmNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2VcclxuICB9XHJcbiAgc2V0IGxhYmVsU2NhbGVCeURpc3RhbmNlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbFNjYWxlQnlEaXN0YW5jZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbE5lYXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLm5lYXJcclxuICB9XHJcbiAgc2V0IGxhYmVsTmVhcih2KSB7XHJcbiAgICBsZXQgbmVhciA9IHZcclxuICAgIGlmIChuZWFyID4gdGhpcy5sYWJlbEZhcikge1xyXG4gICAgICBuZWFyID0gdGhpcy5sYWJlbEZhclxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLm5lYXIgPSBuZWFyXHJcbiAgICB0aGlzLmxhYmVsLm5lYXIgPSBuZWFyXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsTmVhciAmJiB0aGlzLl9lbG1zLmxhYmVsTmVhci5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSBuZWFyXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsRmFyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mYXJcclxuICB9XHJcbiAgc2V0IGxhYmVsRmFyKHYpIHtcclxuICAgIGxldCBmYXIgPSB2XHJcbiAgICBpZiAoZmFyIDwgdGhpcy5sYWJlbE5lYXIpIHtcclxuICAgICAgZmFyID0gdGhpcy5sYWJlbE5lYXJcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mYXIgPSBmYXJcclxuICAgIHRoaXMubGFiZWwuZmFyID0gZmFyXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRmFyICYmIHRoaXMuX2VsbXMubGFiZWxGYXIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gZmFyXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsTGluZVdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICB9XHJcbiAgc2V0IGxhYmVsTGluZVdpZHRoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lV2lkdGggPSB2XHJcbiAgICB0aGlzLmxhYmVsLmxpbmVXaWR0aCA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lV2lkdGggJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVXaWR0aC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxQaXhlbE9mZnNldCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXRcclxuICB9XHJcbiAgc2V0IGxhYmVsUGl4ZWxPZmZzZXQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0ID0gdlxyXG4gICAgdGhpcy5sYWJlbC5waXhlbE9mZnNldCA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxQaXhlbE9mZnNldCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsUGl4ZWxPZmZzZXQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuICBnZXQgbGFiZWxMaW5lQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVDb2xvclxyXG4gIH1cclxuICBzZXQgbGFiZWxMaW5lQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVDb2xvciA9IHZcclxuICAgIHRoaXMubGFiZWwubGluZUNvbG9yID0gdlxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxMaW5lQ29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSAncmdiYSgwLDI1NSwyNTUsMC41KSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3JbaV0gPSBsaW5lQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICB9XHJcbiAgc2V0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXSA9IHZcclxuICAgIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yID0gW3YsIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdXVxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCkge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0W1xyXG4gICAgICAgICAgaVxyXG4gICAgICAgIF0gPSBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdXHJcbiAgfVxyXG4gIHNldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdID0gdlxyXG4gICAgdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IgPSBbdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF0sIHZdXHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCkge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kW2ldID0gbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBhdHRyaWJ1dGVUeXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlXHJcbiAgfVxyXG5cclxuICBzZXQgYXR0cmlidXRlVHlwZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZSA9IHZcclxuICAgIHRoaXMuX2VsbXMuYXR0cmlidXRlVHlwZSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmF0dHJpYnV0ZVR5cGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gICAgbGV0IGF0dHJpYnV0ZUNvbnRlbnQgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAnYXR0cmlidXRlLWNvbnRlbnQnXHJcbiAgICApXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZUNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRlbnRbaV0uY2xhc3NOYW1lLmluZGV4T2YoJ2F0dHJpYnV0ZS1jb250ZW50LScgKyB2KSA+IC0xXHJcbiAgICAgICkge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRlbnRbaV0uc3R5bGUuZGlzcGxheSA9ICdibG9jaydcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhdHRyaWJ1dGVDb250ZW50W2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZUxpbmsoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVMaW5rKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50ID0gdlxyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0IHx8XHJcbiAgICAgICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQgfHxcclxuICAgICAgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50IHx8XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnXHJcbiAgICAgICkubGVuZ3RoID09IDBcclxuICAgICkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC1saW5rJylbMV1cclxuICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgIHRhYmxlQ29udGVudC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHRyID1cclxuICAgICAgICBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0clwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0ubmFtZSArXHJcbiAgICAgICAgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0udXJsICtcclxuICAgICAgICBgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImxpbmtFZGl0XCI+57yW6L6RPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJsaW5rRGVsZXRlXCI+5Yig6ZmkPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+YFxyXG4gICAgICBsZXQgdHJFbG0gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0cilcclxuICAgICAgdGFibGVDb250ZW50LmFwcGVuZENoaWxkKHRyRWxtKVxyXG4gICAgfVxyXG4gICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgbGV0IGZ1biA9IHtcclxuICAgICAgbGlua0VkaXQ6IGFzeW5jIGluZGV4ID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtbGluaycpWzFdXHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gICAgICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPT09IGkpIHtcclxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGl0ZW1baV0ub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICAgIGxldCBodG1sID0gYFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiB0eXBlPVwidGV4dFwiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiaW5wdXQgbGluay1lZGl0XCIgdHlwZT1cInRleHRcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNvbmZpcm1FZGl0XCI+56Gu6K6kPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY2FuY2VsRWRpdFwiPuWPlua2iDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PmBcclxuICAgICAgICAgICAgaXRlbVtpXS5pbm5lckhUTUwgPSBodG1sXHJcbiAgICAgICAgICAgIGxldCB0ZXh0YXJlYUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluay1lZGl0JylbMF1cclxuICAgICAgICAgICAgdGV4dGFyZWFFbG0uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0IC0gMTAgKyAncHgnXHJcbiAgICAgICAgICAgIGxldCB0ZCA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgICAgICB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAgICdpbnB1dCdcclxuICAgICAgICAgICAgKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2luZGV4XS5uYW1lXHJcbiAgICAgICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICAgJ2lucHV0J1xyXG4gICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaW5kZXhdLnVybFxyXG4gICAgICAgICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgbGlua0RlbGV0ZTogaSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQuc3BsaWNlKGksIDEpXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGNvbmZpcm1FZGl0OiAodmFsdWUsIGkpID0+IHtcclxuICAgICAgICBsZXQgbmFtZSA9IHZhbHVlLm5hbWUgJiYgdmFsdWUubmFtZS5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgICAgICAgbGV0IHVybCA9IHZhbHVlLnVybCAmJiB2YWx1ZS51cmwucmVwbGFjZSgvXFxzL2csICcnKVxyXG4gICAgICAgIGlmIChuYW1lICYmIHVybCkge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJlxyXG4gICAgICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAn5ZCN56ew5oiW6ZO+5o6l5LiN6IO95Li656m677yBJyxcclxuICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgfSxcclxuICAgICAgY2FuY2VsRWRpdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGZpbGVTZWxlY3Q6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBmaWxlRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmaWxlLXNlbGVjdCcpWzBdXHJcbiAgICAgICAgZmlsZUVsbS5jbGljaygpXHJcbiAgICAgICAgZmlsZUVsbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gICAgICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGZpbGVTZWxlY3QgPSBldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAgICAgICBsZXQgdGQgPSBpdGVtW1xyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaW5kZXgnKVxyXG4gICAgICAgIF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oaSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBnZXQgYXR0cmlidXRlQ2FtZXJhKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBhdHRyaWJ1dGVDYW1lcmEodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCA9IHZcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBhdHRyaWJ1dGVWcigpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBhdHRyaWJ1dGVWcih2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgPSB2XHJcbiAgLy8gICBpZiAoXHJcbiAgLy8gICAgICF0aGlzLl9EaWFsb2dPYmplY3QgfHxcclxuICAvLyAgICAgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudCB8fFxyXG4gIC8vICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQgfHxcclxuICAvLyAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAvLyAgICAgICAnYXR0cmlidXRlLWNvbnRlbnQtdnInXHJcbiAgLy8gICAgICkubGVuZ3RoID09IDBcclxuICAvLyAgICkge1xyXG4gIC8vICAgICByZXR1cm5cclxuICAvLyAgIH1cclxuICAvLyAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgLy8gICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC12cicpWzFdXHJcbiAgLy8gICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgLy8gICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgLy8gICB0YWJsZUNvbnRlbnQuaW5uZXJIVE1MID0gJydcclxuICAvLyAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoID4gMCkge1xyXG4gIC8vICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgbGV0IHRyID1cclxuICAvLyAgICAgICBgXHJcbiAgLy8gICAgIDxkaXYgY2xhc3M9XCJ0clwiPlxyXG4gIC8vICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgLy8gICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldLm5hbWUgK1xyXG4gIC8vICAgICAgIGA8L2Rpdj5cclxuICAvLyAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgK1xyXG4gIC8vICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXS51cmwgK1xyXG4gIC8vICAgICAgIGA8L2Rpdj5cclxuICAvLyAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gIC8vICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwidnJFZGl0XCI+57yW6L6RPC9idXR0b24+XHJcbiAgLy8gICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJ2ckRlbGV0ZVwiPuWIoOmZpDwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgIDwvZGl2PmBcclxuICAvLyAgICAgbGV0IHRyRWxtID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodHIpXHJcbiAgLy8gICAgIHRhYmxlQ29udGVudC5hcHBlbmRDaGlsZCh0ckVsbSlcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAvLyAgIGxldCBmdW4gPSB7XHJcbiAgLy8gICAgIHZyRWRpdDogYXN5bmMgaW5kZXggPT4ge1xyXG4gIC8vICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgICAgICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gIC8vICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LXZyJylbMV1cclxuICAvLyAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgLy8gICAgICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gIC8vICAgICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xyXG4gIC8vICAgICAgICAgICBsZXQgaGVpZ2h0ID0gaXRlbVtpXS5vZmZzZXRIZWlnaHRcclxuICAvLyAgICAgICAgICAgbGV0IGh0bWwgPSBgXHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIHR5cGU9XCJ0ZXh0XCI+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJpbnB1dCBsaW5rLWVkaXRcIiB0eXBlPVwidGV4dFwiPjwvdGV4dGFyZWE+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY29uZmlybUVkaXRcIj7noa7orqQ8L2J1dHRvbj5cclxuICAvLyAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjYW5jZWxFZGl0XCI+5Y+W5raIPC9idXR0b24+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+YFxyXG4gIC8vICAgICAgICAgICBpdGVtW2ldLmlubmVySFRNTCA9IGh0bWxcclxuICAvLyAgICAgICAgICAgbGV0IHRleHRhcmVhRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rLWVkaXQnKVswXVxyXG4gIC8vICAgICAgICAgICB0ZXh0YXJlYUVsbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgLSAxMCArICdweCdcclxuICAvLyAgICAgICAgICAgbGV0IHRkID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgLy8gICAgICAgICAgIHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgICAgICAgJ2lucHV0J1xyXG4gIC8vICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2luZGV4XS5uYW1lXHJcbiAgLy8gICAgICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgICAgICAgJ2lucHV0J1xyXG4gIC8vICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2luZGV4XS51cmxcclxuICAvLyAgICAgICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgLy8gICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBjb250aW51ZVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gIC8vICAgICAgICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAvLyAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKFxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSxcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWVcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgaVxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgICAgfSlcclxuICAvLyAgICAgICAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAvLyAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIHZyRGVsZXRlOiBpID0+IHtcclxuICAvLyAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQuc3BsaWNlKGksIDEpXHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG5cclxuICAvLyAgICAgY29uZmlybUVkaXQ6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gIC8vICAgICAgIGxldCBuYW1lID0gdmFsdWUubmFtZSAmJiB2YWx1ZS5uYW1lLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAvLyAgICAgICBsZXQgdXJsID0gdmFsdWUudXJsICYmIHZhbHVlLnVybC5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgLy8gICAgICAgaWYgKG5hbWUgJiYgdXJsKSB7XHJcbiAgLy8gICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJlxyXG4gIC8vICAgICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAvLyAgICAgICAgICAgICBtZXNzYWdlOiAn5ZCN56ew5oiW6ZO+5o6l5LiN6IO95Li656m677yBJyxcclxuICAvLyAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgLy8gICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAvLyAgICAgICAgICAgfSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBjYW5jZWxFZGl0OiAoKSA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBmaWxlU2VsZWN0OiAodmFsdWUsIGkpID0+IHtcclxuICAvLyAgICAgICBsZXQgZmlsZUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZS1zZWxlY3QnKVswXVxyXG4gIC8vICAgICAgIGZpbGVFbG0uY2xpY2soKVxyXG4gIC8vICAgICAgIGZpbGVFbG0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAvLyAgICAgICBmaWxlRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBmaWxlU2VsZWN0ID0gZXZlbnQgPT4ge1xyXG4gIC8vICAgICBpZiAoZXZlbnQudGFyZ2V0LnZhbHVlKSB7XHJcbiAgLy8gICAgICAgbGV0IHRkID0gaXRlbVtcclxuICAvLyAgICAgICAgIGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2luZGV4JylcclxuICAvLyAgICAgICBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAvLyAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlXHJcbiAgLy8gICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gbnVsbFxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgLy8gICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgLy8gICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICBjb250aW51ZVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gIC8vICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAvLyAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gIC8vICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKGkpXHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gIC8vICAgICAgICAgICBicmVha1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IGF0dHJpYnV0ZUdvb2RzKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0IGF0dHJpYnV0ZUdvb2RzKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCA9IHZcclxuICAvLyB9XHJcblxyXG4gIGdldCBwb3NpdGlvbnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUxhYmVsKHRoYXQpIHtcclxuICAgIGxldCBoZWlnaHRcclxuICAgIGxldCBncm91bmRcclxuICAgIHN3aXRjaCAodGhhdC5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodCA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodCA9IGF3YWl0IHRoYXQuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgbGF0OiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdFxyXG4gICAgICAgIH0pICsgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBoZWlnaHQgPSBhd2FpdCB0aGF0LmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgICBpZiAoIXRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbikge1xyXG4gICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICBsYXQ6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgIGFsdDogaGVpZ2h0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoYXQubGFiZWwgPSBuZXcgTGFiZWxPYmplY3QodGhhdC5zZGssIHtcclxuICAgICAgaWQ6IHRoYXQub3B0aW9ucy5pZCxcclxuICAgICAgc2hvdzogdGhhdC5vcHRpb25zLnNob3cgPyB0aGF0Lm9wdGlvbnMubGFiZWwuc2hvdyA6IGZhbHNlLFxyXG4gICAgICBwb3NpdGlvbjogW1xyXG4gICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0XHJcbiAgICAgIF0sXHJcbiAgICAgIHRleHQ6IHRoYXQub3B0aW9ucy5uYW1lLFxyXG4gICAgICBmb250U2l6ZTogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRTaXplLFxyXG4gICAgICBmb250RmFtaWx5OiB0aGF0Lm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSxcclxuICAgICAgY29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5jb2xvcixcclxuICAgICAgcGl4ZWxPZmZzZXQ6IHRoYXQub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yLFxyXG4gICAgICBsaW5lQ29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5saW5lQ29sb3IsXHJcbiAgICAgIGxpbmVXaWR0aDogdGhhdC5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCxcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiB0aGF0Lm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlLFxyXG4gICAgICBuZWFyOiB0aGF0Lm9wdGlvbnMubGFiZWwubmVhcixcclxuICAgICAgZmFyOiB0aGF0Lm9wdGlvbnMubGFiZWwuZmFyLFxyXG4gICAgICBncm91bmQ6IGdyb3VuZFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGUodGhhdCkge1xyXG5cclxuICAgIGxldCBncm91bmRcclxuICAgIGlmICh0aGF0LmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICBncm91bmQgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgfVxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhhdC5yZW5ld1Bvc2l0aW9ucyhwb3NpdGlvbnMpXHJcbiAgICB0aGF0LmVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyxcclxuICAgICAgcG9seWxpbmU6IHtcclxuICAgICAgICBwb3NpdGlvbnM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpLFxyXG4gICAgICAgIHdpZHRoOiB0aGF0Lm9wdGlvbnMud2lkdGgsXHJcbiAgICAgICAgY2xhbXBUb0dyb3VuZDogZ3JvdW5kLFxyXG4gICAgICAgIC8vIG1hdGVyaWFsOiB0aGF0LmdldE1hdGVyaWFsKHRoYXQub3B0aW9ucy5jb2xvciwgdGhhdC5vcHRpb25zLnR5cGUsIHRoYXQuZW50aXR5LCB0aGF0Lm9wdGlvbnMpLFxyXG4gICAgICAgIHpJbmRleDogdGhhdC5zZGsuX2VudGl0eVpJbmRleFxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIHRoYXQuZW50aXR5LnBvbHlsaW5lLm9yaVdpZHRoID0gdGhhdC5vcHRpb25zLndpZHRoXHJcbiAgICB0aGF0Lmp1ZGdlTGluZSh0aGF0LmVudGl0eSwgdGhhdC5vcHRpb25zKVxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhhdC5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoYXQuaW5wdXRTcGVlZFxyXG4gICAgdGhhdC5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGF0LmdldE1hdGVyaWFsKFxyXG4gICAgICB0aGF0Lm9wdGlvbnMuY29sb3IsXHJcbiAgICAgIHRoYXQub3B0aW9ucy50eXBlLFxyXG4gICAgICB0aGF0LmVudGl0eSxcclxuICAgICAgcGFyYW1zXHJcbiAgICApXHJcbiAgICB0aGF0LnNkay5fZW50aXR5WkluZGV4KytcclxuICAgIFBvbHlsaW5lT2JqZWN0LmNyZWF0ZUxhYmVsKHRoYXQpXHJcbiAgICAvLyB0aGF0LmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnNMbmdMYXQgPSBwb3NpdGlvbnNcclxuICAgIHRoYXQucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICB0aGF0LmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgcG9zaXRpb25zLFxyXG4gICAgICAyLFxyXG4gICAgICB0aGF0Lm9wdGlvbnMud29yZHNOYW1lXHJcbiAgICApLnRoZW4ocmVzID0+IHtcclxuICAgICAgdGhhdC5sZW5ndGhCeU1ldGVyID0gcmVzXHJcbiAgICAgIHRoYXQubGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgJiYgdGhhdC5sZW5ndGhDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICAgIHN5bmNEYXRhKHRoYXQuc2RrLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICB9KVxyXG4gICAgaWYgKHRoYXQub3B0aW9ucy5zaG93KSB7XHJcbiAgICAgIHNldFNwbGl0RGlyZWN0aW9uKDAsIHRoYXQub3B0aW9ucy5pZClcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gaWYgKHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsKSB7XHJcbiAgICAvLyAgIGxldCBhcnJheSA9IFtdXHJcbiAgICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJvbURlZ3JlZXNBcnJheS5sZW5ndGg7IGkgKz0gMikge1xyXG4gICAgLy8gICAgIGFycmF5LnB1c2goeyBsbmc6IGZyb21EZWdyZWVzQXJyYXlbaV0sIGxhdDogZnJvbURlZ3JlZXNBcnJheVtpICsgMV0gfSlcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuZml0X2xlbmd0aCA9IHRvb2wuY29tcHV0ZURpc3RhbmNlKGFycmF5KVxyXG4gICAgLy8gfVxyXG4gICAgLy8gZWxzZSB7XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoID0gdG9vbC5jb21wdXRlRGlzdGFuY2UocG9zaXRpb25zKVxyXG4gICAgLy8gfVxyXG4gICAgLy8gaWYgKHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoX3VuaXQgPT09ICdrbScpIHtcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmZpdF9sZW5ndGggPSB0aGlzLm9wdGlvbnMuZml0X2xlbmd0aCAvIDEwMDBcclxuICAgIC8vIH1cclxuXHJcbiAgICBsZXQgc2NlbmUgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmVcclxuICB9XHJcbiAganVkZ2VMaW5lKGVudGl0eSwgbmV3UGFyYW0pIHtcclxuICAgIGlmICghZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdCkge1xyXG4gICAgICBsZXQgcGFyYW0gPSB7XHJcbiAgICAgICAgY29sb3I6IG5ld1BhcmFtLmNvbG9yLFxyXG4gICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyBgL2ltZy9hcnJvdy8xLnBuZ2AsXHJcbiAgICAgICAgc3BhY2U6IG5ld1BhcmFtLnNwYWNlLFxyXG4gICAgICAgIHNwZWVkOiBuZXdQYXJhbS5zcGVlZFxyXG4gICAgICB9XHJcblxyXG4gICAgICBwYXJhbS5zcGVlZCA9IG5ld1BhcmFtLnJvdGF0ZSA/IHBhcmFtLnNwZWVkIDogMCAtIHBhcmFtLnNwZWVkXHJcblxyXG4gICAgICBjb25zdCBjYW52YXNFbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgY29uc3QgY3R4ID0gY2FudmFzRWxlLmdldENvbnRleHQoJzJkJylcclxuICAgICAgY29uc3QgbXlJbWcgPSBuZXcgSW1hZ2UoKVxyXG4gICAgICAvLyBteUltZy5zcmMgPSB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9hcnJvdy8xLnBuZydcclxuICAgICAgbXlJbWcuc3JjID0gcGFyYW0uaW1hZ2VcclxuICAgICAgbGV0IHRoYXQgPSB0aGlzXHJcbiAgICAgIG15SW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjYW52YXNFbGUud2lkdGggPSBteUltZy53aWR0aCAqIChwYXJhbS5zcGFjZSArIDEpXHJcbiAgICAgICAgY2FudmFzRWxlLmhlaWdodCA9IG15SW1nLmhlaWdodFxyXG5cclxuICAgICAgICBsZXQgb3JpUmVwZWF0ID0gdGhhdC5nZXRTY2VlbkxpbmUoZW50aXR5LCBwYXJhbSwgY2FudmFzRWxlKVxyXG4gICAgICAgIG9yaVJlcGVhdCAmJiAoZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdCA9IG9yaVJlcGVhdClcclxuXHJcblxyXG4gICAgICAgIHZhciBwb3NpdGlvblByb3BlcnR5ID0gZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucztcclxuICAgICAgICB2YXIgcG9zaXRpb25zID0gcG9zaXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSh0aGF0LnNkay52aWV3ZXIuY2xvY2suY3VycmVudFRpbWUpO1xyXG5cclxuICAgICAgICBpZiAoIUNlc2l1bS5kZWZpbmVkKHBvc2l0aW9ucykpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMS4wLCAxLjApO1xyXG4gICAgICAgICAgLy8gcmV0dXJuIDEuMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoIC0gMTsgKytpKSB7XHJcbiAgICAgICAgICBkaXN0YW5jZSArPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHJlcGVhdFggPSBkaXN0YW5jZSAvIGVudGl0eS5wb2x5bGluZS53aWR0aC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIC8vIOagueaNruWcsOWbvue8qeaUvueoi+W6puiwg+aVtHJlcGVhdFhcclxuICAgICAgICB2YXIgY2FtZXJhSGVpZ2h0ID0gdGhhdC5zZGsudmlld2VyLmNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYy5oZWlnaHQ7XHJcbiAgICAgICAgdmFyIGJvdW5kaW5nU3BoZXJlID0gbmV3IENlc2l1bS5Cb3VuZGluZ1NwaGVyZShcclxuICAgICAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygtMTAwMDAwMCwgMCwgMCksIC8vIOS4reW/g+eCueWdkOagh1xyXG4gICAgICAgICAgNTAwMDAwIC8vIOWNiuW+hO+8iOi3neemu++8iVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICAgIHZhciBkcmF3aW5nQnVmZmVyV2lkdGggPSB0aGF0LnNkay52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoO1xyXG4gICAgICAgIHZhciBkcmF3aW5nQnVmZmVySGVpZ2h0ID0gdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgICAgdmFyIGdyb3VuZFJlc29sdXRpb24gPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUuY2FtZXJhLmdldFBpeGVsU2l6ZShib3VuZGluZ1NwaGVyZSwgZHJhd2luZ0J1ZmZlcldpZHRoLCBkcmF3aW5nQnVmZmVySGVpZ2h0KVxyXG4gICAgICAgIHJlcGVhdFggKj0gZ3JvdW5kUmVzb2x1dGlvbiAvIGNhbWVyYUhlaWdodCAvIChwYXJhbS5zcGFjZSAqIChjYW52YXNFbGUud2lkdGggLyBjYW52YXNFbGUuaGVpZ2h0ICogNSkgKyAxKTtcclxuICAgICAgICAvLyBpZiAoZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsLm9yaVJlcGVhdCkge1xyXG5cclxuICAgICAgICBpZiAodGhhdC5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IENlc2l1bS5TY2VuZU1vZGUuU0NFTkUzRCkge1xyXG4gICAgICAgICAgbGV0IHNwZWVkID0gcmVwZWF0WCAvIGVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlTcGVlZCA9IHNwZWVkXHJcbiAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCA9IHJlcGVhdFhcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHNkazNkID0gZ2V0M0RWaWV3KClcclxuICAgICAgICAgIGxldCBzZGszZEVudGl0eSA9IHNkazNkLnZpZXdlci5lbnRpdGllcy5nZXRCeUlkKHRoYXQub3B0aW9ucy5pZClcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlTcGVlZCA9IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkXHJcbiAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCA9IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFhcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKuiOt+WPluW9k+WJjea7oeWxj+aoque6v+mAn+W6piAqL1xyXG4gIGdldFNjZWVuTGluZShlbnRpdHksIG9wdGlvbnMsIGNhbnZhc0VsZSkge1xyXG4gICAgbGV0IHBvaW50MSA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMigwLCB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodClcclxuICAgIGxldCBwb2ludDIgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIodGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aCAvIDIsIHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0KVxyXG4gICAgLy8gdmFyIGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MSlcclxuICAgIC8vIHZhciBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLnBpY2tQb3NpdGlvbihwb2ludDIpXHJcblxyXG4gICAgbGV0IHJheSA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDEpO1xyXG4gICAgbGV0IGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXksIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcblxyXG4gICAgbGV0IHJheTIgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmdldFBpY2tSYXkocG9pbnQyKTtcclxuICAgIGxldCBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5MiwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuICAgIC8vIGlmICghY2FydGVzaWFuMSB8fCAhY2FydGVzaWFuMikge1xyXG4gICAgLy8gICBsZXQgcmF5ID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5nZXRQaWNrUmF5KHBvaW50MSk7XHJcbiAgICAvLyAgIGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXksIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcblxyXG4gICAgLy8gICBsZXQgcmF5MiA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDIpO1xyXG4gICAgLy8gICBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5MiwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuICAgIC8vIH1cclxuICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuXHJcblxyXG4gICAgICB2YXIgZGlzdGFuY2UgPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShjYXJ0ZXNpYW4xLCBjYXJ0ZXNpYW4yKTtcclxuXHJcbiAgICAgIHZhciByZXBlYXRYID0gZGlzdGFuY2UgLyBlbnRpdHkucG9seWxpbmUud2lkdGguZ2V0VmFsdWUoKTtcclxuICAgICAgLy8g5qC55o2u5Zyw5Zu+57yp5pS+56iL5bqm6LCD5pW0cmVwZWF0WFxyXG4gICAgICB2YXIgY2FtZXJhSGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYy5oZWlnaHQ7XHJcbiAgICAgIHZhciBib3VuZGluZ1NwaGVyZSA9IG5ldyBDZXNpdW0uQm91bmRpbmdTcGhlcmUoXHJcbiAgICAgICAgbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKC0xMDAwMDAwLCAwLCAwKSwgLy8g5Lit5b+D54K55Z2Q5qCHXHJcbiAgICAgICAgNTAwMDAwIC8vIOWNiuW+hO+8iOi3neemu++8iVxyXG4gICAgICApO1xyXG5cclxuXHJcbiAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICB2YXIgZHJhd2luZ0J1ZmZlcldpZHRoID0gdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aDtcclxuICAgICAgdmFyIGRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgIHZhciBncm91bmRSZXNvbHV0aW9uID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmNhbWVyYS5nZXRQaXhlbFNpemUoYm91bmRpbmdTcGhlcmUsIGRyYXdpbmdCdWZmZXJXaWR0aCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgICAgLy8gcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKChteUltZy53aWR0aCAvIG15SW1nLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIGlmIChncm91bmRSZXNvbHV0aW9uID4gNzAwKSB7XHJcbiAgICAgICAgcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKG9wdGlvbnMuc3BhY2UgKiAoY2FudmFzRWxlLndpZHRoIC8gY2FudmFzRWxlLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVwZWF0WCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FM0QpIHtcclxuICAgICAgICByZXR1cm4gcmVwZWF0WFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBzZGszZCA9IGdldDNEVmlldygpXHJcbiAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIHJldHVybiBzZGszZEVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICog57yW6L6R5qGGXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdGF0ZSB0cnVl5omT5byA77yMZmFsc2XlhbPpl61cclxuICAgKi9cclxuICBhc3luYyBlZGl0KHN0YXRlKSB7XHJcbiAgICByZXR1cm5cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBpZiAoc3RhdGUpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gYXdhaXQgbmV3IERpYWxvZyh0aGlzLnNkaywgdGhpcy5vcHRpb25zLCB7XHJcbiAgICAgICAgdGl0bGU6ICfnur/lsZ7mgKcnLFxyXG4gICAgICAgIGxlZnQ6ICcxODBweCcsXHJcbiAgICAgICAgdG9wOiAnMTAwcHgnLFxyXG4gICAgICAgIGNvbmZpcm1DYWxsQmFjazogb3B0aW9ucyA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUudHJpbSgpXHJcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBsbmc6IHRoaXMubGFiZWwucG9zaXRpb25bMF0sXHJcbiAgICAgICAgICAgIGxhdDogdGhpcy5sYWJlbC5wb3NpdGlvblsxXSxcclxuICAgICAgICAgICAgYWx0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzJdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcHRpb25zKVxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayAmJlxyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICAgICAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgc3luY1NwbGl0RGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzZXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlc2V0Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVtb3ZlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsb3NlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5jbG9zZUNhbGxCYWNrKClcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyhmYWxzZSlcclxuICAgICAgICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NhbGxCYWNrOiBzaG93ID0+IHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnNob3dDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHJhbnNsYXRpb25hbENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9ICF0aGlzLnBvc2l0aW9uRWRpdGluZ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8g5LqM5qyh57yW6L6R5Zue6LCDXHJcbiAgICAgICAgc2Vjb25kYXJ5RWRpdENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vZGVFZGl0KClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmNsYXNzTmFtZSA9XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lICsgJyBwb2x5bGluZSdcclxuICAgICAgbGV0IGNvbnRlbnRFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICBjb250ZW50RWxtLmlubmVySFRNTCA9IGh0bWwodGhpcylcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNvbnRlbnRBcHBDaGlsZChjb250ZW50RWxtKVxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVR5cGUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZVxyXG4gICAgICAvLyB0aGlzLmF0dHJpYnV0ZUNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICAgICAgLy8gdGhpcy5hdHRyaWJ1dGVHb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG5cclxuICAgICAgZnVuY3Rpb24gdGFiQ2xpY2soZSkge1xyXG4gICAgICAgIGlmIChlID09PSAnMicgfHwgZSA9PT0gMikgey8v54K55Ye757q/5p2h5qC35byPXHJcbiAgICAgICAgICBpZiAoMiA8IF90aGlzLm9wdGlvbnMudHlwZSAmJiBfdGhpcy5vcHRpb25zLnR5cGUgPCAxMykgey8v6LS05Zu+5Y+C5pWwXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykgJiYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDliJvlu7rmoIfnrb7pobVcclxuICAgICAgbGV0IHRhYnNFbG0gPSBuZXcgY3lfdGFicyhcclxuICAgICAgICAncG9seWxpbmUtb2JqZWN0LWVkaXQtdGFicycsXHJcbiAgICAgICAgdGFiQ2xpY2ssXHJcbiAgICAgICAgdGhpcy5zZGtcclxuICAgICAgKVxyXG4gICAgICAvLyDpopzoibLnu4Tku7ZcclxuICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5jb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhYmVsQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGV4dGVuZENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2V4dGVuZENvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5leHRlbmRDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGFiZWxMaW5lQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsTGluZUNvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgX3RoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0JylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLFxyXG4gICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsXHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvckVuZCcpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JyxcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgYWxsX2VsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKVxyXG4gICAgICBFdmVudEJpbmRpbmcub24odGhpcywgYWxsX2VsbSlcclxuICAgICAgdGhpcy5fZWxtcyA9IEV2ZW50QmluZGluZy5lbGVtZW50XHJcbiAgICAgIHRoaXMuX2VsbXMuY29sb3IgPSBbY29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvciA9IFtsYWJlbENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmV4dGVuZENvbG9yID0gW2V4dGVuZENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yID0gW2xpbmVDb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gW190aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXJdXHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIC8vIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgICAgICAvLyB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAgICAgLy8gdGhpcy5nb29kc1NlbGVjdCAmJiB0aGlzLmdvb2RzU2VsZWN0KClcclxuICAgICAgICBsZXQgdGFnRGF0YSA9IHRoaXMuYXR0cmlidXRlU2VsZWN0XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZUVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnYXR0cmlidXRlLXNlbGVjdC1ib3gnXHJcbiAgICAgICAgKVswXVxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVFbG0pIHtcclxuICAgICAgICAgIGxldCBsZWdwT2JqZWN0ID0gbGVncChhdHRyaWJ1dGVFbG0sICcuYXR0cmlidXRlLXNlbGVjdCcpXHJcbiAgICAgICAgICBsZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKHRhZ0RhdGEpXHJcbiAgICAgICAgICBsZXQgYXR0cmlidXRlU2VsZWN0RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGFnRGF0YVtpXS5rZXkgPT09IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlU2VsZWN0RWxtLnZhbHVlID0gdGFnRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUodGFnRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLnZhbHVlID09PSBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRhZ0RhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuYW1lRGF0YSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+epuumXtOmVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn56m66Ze06ZW/5bqmJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+aKleW9semVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5oqV5b2x6ZW/5bqmJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+WcsOihqOmVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5Zyw6KGo6ZW/5bqmJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgbGV0IG5hbWVEYXRhTGVncE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnaW5wdXQtc2VsZWN0LXVuaXQtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaW5wdXQtc2VsZWN0LXVuaXQnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChuYW1lRGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIG5hbWVEYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaChuYW1lRGF0YSlcclxuICAgICAgICAgIGxldCBuYW1lRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHRoaXMuX2VsbXMud29yZHNOYW1lID0gW25hbWVEYXRhTGVncEVsbV1cclxuICAgICAgICAgIG5hbWVEYXRhTGVncEVsbS52YWx1ZSA9IHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKG5hbWVEYXRhW2ldLnZhbHVlID09PSBuYW1lRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBuYW1lRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUobmFtZURhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbmFtZURhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5hbWVEYXRhW2ldLnZhbHVlID09PSBuYW1lRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud29yZHNOYW1lID0gbmFtZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5Y6f5aeL6ZW/5bqm5Y2V5L2NXHJcbiAgICAgICAgbGV0IHVuaXREYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn57GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfnsbMnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5Y2D57GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfljYPnsbMnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICBsZXQgdW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdpbnB1dC1zZWxlY3QtdW5pdC1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5pbnB1dC1zZWxlY3QtdW5pdCcsXHJcbiAgICAgICAgICAxXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmICh1bml0RGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaCh1bml0RGF0YSlcclxuICAgICAgICAgIGxldCB1bml0RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHRoaXMuX2VsbXMubGVuZ3RoVW5pdCA9IFt1bml0RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BFbG0udmFsdWUgPSB0aGlzLm9wdGlvbnMubGVuZ3RoVW5pdFxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh1bml0RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZW5ndGhVbml0ID0gdW5pdERhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL1xyXG5cclxuXHJcbiAgICAgICAgLy8g5ouf5ZCI6ZW/5bqm5Y2V5L2NXHJcbiAgICAgICAgLy8gbGV0IGZpdFVuaXREYXRhID0gW1xyXG4gICAgICAgIC8vICAge1xyXG4gICAgICAgIC8vICAgICBuYW1lOiAn57GzJyxcclxuICAgICAgICAvLyAgICAgdmFsdWU6ICfnsbMnXHJcbiAgICAgICAgLy8gICB9LFxyXG4gICAgICAgIC8vICAge1xyXG4gICAgICAgIC8vICAgICBuYW1lOiAn5Y2D57GzJyxcclxuICAgICAgICAvLyAgICAgdmFsdWU6ICfljYPnsbMnXHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gXVxyXG5cclxuICAgICAgICAvLyBsZXQgZml0VW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAvLyAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgLy8gICAgICdpbnB1dC1zZWxlY3QtZml0LXVuaXQtYm94J1xyXG4gICAgICAgIC8vICAgKVswXSxcclxuICAgICAgICAvLyAgICcuaW5wdXQtc2VsZWN0LWZpdC11bml0J1xyXG4gICAgICAgIC8vIClcclxuICAgICAgICAvLyBpZiAoZml0VW5pdERhdGFMZWdwT2JqZWN0KSB7XHJcbiAgICAgICAgLy8gICBmaXRVbml0RGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2goZml0VW5pdERhdGEpXHJcbiAgICAgICAgLy8gICBsZXQgZml0VW5pdERhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAvLyAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC1maXQtdW5pdCcpWzBdXHJcbiAgICAgICAgLy8gICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgIC8vICAgdGhpcy5fZWxtcy5maXRMZW5ndGhVbml0ID0gW2ZpdFVuaXREYXRhTGVncEVsbV1cclxuICAgICAgICAvLyAgIGZpdFVuaXREYXRhTGVncEVsbS52YWx1ZSA9IHRoaXMub3B0aW9ucy5maXRMZW5ndGhVbml0XHJcbiAgICAgICAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGZpdFVuaXREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIGlmIChmaXRVbml0RGF0YVtpXS52YWx1ZSA9PT0gZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgZml0VW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGZpdFVuaXREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgIC8vICAgICAgIGJyZWFrXHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyAgIGZpdFVuaXREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXRVbml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vICAgICAgIGlmIChmaXRVbml0RGF0YVtpXS52YWx1ZSA9PT0gZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aFVuaXQgPSBmaXRVbml0RGF0YVtpXS52YWx1ZVxyXG4gICAgICAgIC8vICAgICAgICAgYnJlYWtcclxuICAgICAgICAvLyAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgIH0pXHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBsZXQgbGluZVR5cGVEYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGxpbmVcIj48L2k+5a6e57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICflrp7nur8nLFxyXG4gICAgICAgICAgICBrZXk6IDAsXHJcbiAgICAgICAgICAgIGljb246ICdsaW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBkYXNoLWxpbmVcIj48L2k+6Jma57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfomZrnur8nLFxyXG4gICAgICAgICAgICBrZXk6IDEsXHJcbiAgICAgICAgICAgIGljb246ICdkYXNoLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGxpZ2h0LWxpbmVcIj48L2k+5rOb5YWJJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfms5vlhYknLFxyXG4gICAgICAgICAgICBrZXk6IDIsXHJcbiAgICAgICAgICAgIGljb246ICdsaWdodC1saW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiB0YWlsLWxpbmVcIj48L2k+5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICflsL7ov7nlhYnnur8nLFxyXG4gICAgICAgICAgICBrZXk6IDMsXHJcbiAgICAgICAgICAgIGljb246ICd0YWlsLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIG11bHQtdGFpbC1saW5lXCI+PC9pPuWkmuWwvui/ueWFiee6vycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAga2V5OiA0LFxyXG4gICAgICAgICAgICBpY29uOiAnbXVsdC10YWlsLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGZsb3ctZGFzaC1saW5lMVwiPjwvaT7mtYHliqjomZrnur8xJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjomZrnur8xJyxcclxuICAgICAgICAgICAga2V5OiA1LFxyXG4gICAgICAgICAgICBpY29uOiAnZmxvdy1kYXNoLWxpbmUxJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBmbG93LWRhc2gtbGluZTJcIj48L2k+5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAgICAgIGtleTogNixcclxuICAgICAgICAgICAgaWNvbjogJ2Zsb3ctZGFzaC1saW5lMidcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUxXCI+PC9pPua1geWKqOeureWktDEnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDEnLFxyXG4gICAgICAgICAgICBrZXk6IDcsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTEnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lMlwiPjwvaT7mtYHliqjnrq3lpLQyJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQyJyxcclxuICAgICAgICAgICAga2V5OiA4LFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmUyJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTNcIj48L2k+5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAgICAgIGtleTogOSxcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lMydcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU0XCI+PC9pPua1geWKqOeureWktDQnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDQnLFxyXG4gICAgICAgICAgICBrZXk6IDEwLFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmU0J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTVcIj48L2k+5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAgICAgIGtleTogMTEsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNlwiPjwvaT7mtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICAgICAga2V5OiAxMixcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lNidcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2lucHV0LXNlbGVjdC1saW5lLXR5cGUtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaW5wdXQtc2VsZWN0LWxpbmUtdHlwZSdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2gobGluZVR5cGVEYXRhKVxyXG5cclxuICAgICAgICAgIGxldCBpQWN0aXZlRWxtMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKVxyXG4gICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gJ2ljb24gaWNvbi1hY3RpdmUnXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtbGluZS10eXBlJylbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY3lfZGF0YWxpc3QnKVswXS5hcHBlbmRDaGlsZChpQWN0aXZlRWxtMilcclxuXHJcbiAgICAgICAgICBsZXQgbGluZVR5cGVEYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtbGluZS10eXBlJylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxpbmVUeXBlID0gW2xpbmVUeXBlRGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVUeXBlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobGluZVR5cGVEYXRhW2ldLmtleSA9PT0gdGhpcy5vcHRpb25zLnR5cGUpIHtcclxuICAgICAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGxpbmVUeXBlRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwRWxtLnZhbHVlID0gbGluZVR5cGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gYGljb24gaWNvbi1hY3RpdmUgJHtsaW5lVHlwZURhdGFbaV0uaWNvbn1gXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGluZVR5cGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVHlwZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAobGluZVR5cGVEYXRhW2ldLnZhbHVlID09PSBsaW5lVHlwZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVUeXBlID0gbGluZVR5cGVEYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gYGljb24gaWNvbi1hY3RpdmUgJHtsaW5lVHlwZURhdGFbaV0uaWNvbn1gXHJcblxyXG4gICAgICAgICAgICAgICAgLy/mjqfliLblj4LmlbDmmL7pmpBcclxuICAgICAgICAgICAgICAgIGlmICgyIDwgdGhpcy5saW5lVHlwZSAmJiB0aGlzLmxpbmVUeXBlIDwgMTMpIHsvL+i0tOWbvuWPguaVsFxyXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKDIgPCB0aGlzLmxpbmVUeXBlICYmIHRoaXMubGluZVR5cGUgPCA1KSB7Ly/lsL7ov7nlj4LmlbBcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgIGxldCBoZWlnaHRCb3hFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtYm94JylbMF1cclxuICAgICAgICBsZXQgaGVpZ2h0RWxtID0gaGVpZ2h0Qm94RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodCcpWzBdXHJcbiAgICAgICAgbGV0IGhlaWdodENvbmZpcm1FbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtY29uZmlybScpWzBdXHJcbiAgICAgICAgaGVpZ2h0RWxtLnZhbHVlID0gMTBcclxuICAgICAgICBpZiAodGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94IGRpc2FibGVkJyk7XHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtICYmIGhlaWdodENvbmZpcm1FbG0uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94Jyk7XHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtICYmIGhlaWdodENvbmZpcm1FbG0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaGVpZ2h0TW9kZURhdGEgPSBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1t+aLlOmrmOW6picsXHJcbiAgICAgICAgICAgIGtleTogJzAnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn55u45a+55Zyw6KGoJyxcclxuICAgICAgICAgICAga2V5OiAnMScsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5L6d6ZmE5qih5Z6LJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfkvp3pmYTmqKHlnosnLFxyXG4gICAgICAgICAgICBrZXk6ICcyJyxcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGhlaWdodE1vZGVPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2hlaWdodC1tb2RlLWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmhlaWdodC1tb2RlJ1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoaGVpZ2h0TW9kZU9iamVjdCkge1xyXG4gICAgICAgICAgaGVpZ2h0TW9kZU9iamVjdC5sZWdwX3NlYXJjaChoZWlnaHRNb2RlRGF0YSlcclxuICAgICAgICAgIGxldCBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LW1vZGUnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLmtleSA9PSB0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUgPSBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoXHJcbiAgICAgICAgICAgICAgICBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAoaGVpZ2h0TW9kZURhdGFbaV0udmFsdWUgPT09IGhlaWdodE1vZGVEYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBoZWlnaHRFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHQgPSBoZWlnaHRFbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ID0gaGVpZ2h0Qm94RWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgPSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSA9IGhlaWdodENvbmZpcm1FbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCA9IGhlaWdodE1vZGVPYmplY3RcclxuXHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ID0gTnVtYmVyKCh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCArIE51bWJlcihoZWlnaHRFbG0udmFsdWUpKS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICAgIHRoaXMuX2VsbXMuYWx0W2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgICAgICAgKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0YWJsZUVsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3BhdGlhbC1pbmZvLXRhYmxlJylbMF1cclxuICAgICAgICBsZXQgdEJvZHlFbG0gPSB0YWJsZUVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICB0aGlzLl9lbG1zLmxuZyA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sbmdJbnB1dCA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYXQgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGF0SW5wdXQgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMuYWx0ID0gW11cclxuICAgICAgICB0aGlzLl9lbG1zLmFsdElucHV0ID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXHJcbiAgICAgICAgICB0ci5jbGFzc05hbWUgPSAndHInXHJcbiAgICAgICAgICB0ci5pbm5lckhUTUwgPSBgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPiR7aSArIDF9PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsbmcgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsYXQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBhbHQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICBgXHJcbiAgICAgICAgICBsZXQgbG5nQm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nJylbMF1cclxuICAgICAgICAgIGxldCBsbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGxuZy5pbm5lckhUTUwgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmcpXHJcbiAgICAgICAgICBsZXQgbG5nSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsbmdJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsbmdJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxuZ0lucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxuZ0lucHV0Lm1pbiA9IC0xODBcclxuICAgICAgICAgIGxuZ0lucHV0Lm1heCA9IDE4MFxyXG4gICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuXHJcbiAgICAgICAgICBsZXQgbGF0Qm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0JylbMF1cclxuICAgICAgICAgIGxldCBsYXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGxhdC5pbm5lckhUTUwgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXQpXHJcbiAgICAgICAgICBsZXQgbGF0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsYXRJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsYXRJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxhdElucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxhdElucHV0Lm1pbiA9IC05MFxyXG4gICAgICAgICAgbGF0SW5wdXQubWF4ID0gOTBcclxuICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGFsdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FsdCcpWzBdXHJcbiAgICAgICAgICBsZXQgYWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBhbHQuaW5uZXJIVE1MID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KS50b0ZpeGVkKDIpXHJcbiAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0KVxyXG4gICAgICAgICAgbGV0IGFsdElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgYWx0SW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgYWx0SW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBhbHRJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBhbHRJbnB1dC5taW4gPSAtOTk5OTk5OVxyXG4gICAgICAgICAgYWx0SW5wdXQubWF4ID0gOTk5OTk5OTk5XHJcbiAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCkudG9GaXhlZCgyKVxyXG5cclxuICAgICAgICAgIGxuZ0JveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgbG5nQm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmdJbnB1dClcclxuICAgICAgICAgICAgbG5nSW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbG5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nQm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmcpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbG5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nID0gTnVtYmVyKE51bWJlcihsbmdJbnB1dC52YWx1ZSkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LCBmcm9tRGVncmVlc0FycmF5WzJdXVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBsYXRCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0SW5wdXQpXHJcbiAgICAgICAgICAgIGxhdElucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCA9IE51bWJlcihOdW1iZXIobGF0SW5wdXQudmFsdWUpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdC5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCwgZnJvbURlZ3JlZXNBcnJheVsyXV1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgYWx0Qm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWx0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHRJbnB1dClcclxuICAgICAgICAgICAgYWx0SW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYWx0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHQpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYWx0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ID0gTnVtYmVyKE51bWJlcihhbHRJbnB1dC52YWx1ZSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0LmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0LnRvRml4ZWQoMilcclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LCBmcm9tRGVncmVlc0FycmF5WzJdXVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxuZy5wdXNoKGxuZylcclxuICAgICAgICAgIHRoaXMuX2VsbXMubG5nSW5wdXQucHVzaChsbmdJbnB1dClcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGF0LnB1c2gobGF0KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYXRJbnB1dC5wdXNoKGxhdElucHV0KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5hbHQucHVzaChhbHQpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmFsdElucHV0LnB1c2goYWx0SW5wdXQpXHJcbiAgICAgICAgICB0Qm9keUVsbS5hcHBlbmRDaGlsZCh0cilcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBsZXQgZm9udERhdGEgPSBnZXRGb250TGlzdCgpXHJcbiAgICAgICAgbGV0IGZvbnRPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2ZvbnQtc2VsZWN0LWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmZvbnQtc2VsZWN0J1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoZm9udE9iamVjdCkge1xyXG4gICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaChmb250RGF0YSlcclxuICAgICAgICAgIGxldCBmb250RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZm9udC1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS52YWx1ZSA9IGZvbnREYXRhW3RoaXMubGFiZWxGb250RmFtaWx5XS52YWx1ZVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShmb250RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb250RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT09IGZvbnREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbEZvbnRGYW1pbHkgPSBmb250RGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgPSBbZm9udERhdGFMZWdwRWxtXVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgMClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOW5s+a7keWkhOeQhlxyXG4gIHNtb290aEhhbmRsZShwb3NpdGlvbnMpIHtcclxuICAgIGxldCBuZXdQb3NpdGlvbnMgPSBbXVxyXG4gICAgbGV0IHRpbWUgPSBbXVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzLnB1c2goXHJcbiAgICAgICAgcG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgIHBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgKVxyXG4gICAgICB0aW1lLnB1c2goaSAvIChwb3NpdGlvbnMubGVuZ3RoIC0gMSkpXHJcbiAgICB9XHJcbiAgICBsZXQgc3BsaW5lID0gbmV3IENlc2l1bS5DYXRtdWxsUm9tU3BsaW5lKHtcclxuICAgICAgdGltZXM6IHRpbWUsXHJcbiAgICAgIHBvaW50czogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheUhlaWdodHMpXHJcbiAgICB9KVxyXG4gICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGggKiAyMFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGNhcnRlc2lhbjMgPSBzcGxpbmUuZXZhbHVhdGUoaSAvIGxlbmd0aClcclxuICAgICAgbmV3UG9zaXRpb25zLnB1c2godGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4zLCB0aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1Bvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5Z2Q5qCHXHJcbiAgcmVuZXdQb3NpdGlvbnMocG9zaXRpb25zQXJyYXksIGNkKSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgcG9zaXRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwb3NpdGlvbnNBcnJheSkpXHJcbiAgICBsZXQgZ3JvdW5kXHJcbiAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KSlcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5hbHQgPSBoZWlnaHQgPyBOdW1iZXIoKHBvc2l0aW9uc1tpXS5hbHQgKyBOdW1iZXIoaGVpZ2h0KSkudG9GaXhlZCgyKSkgOiBOdW1iZXIoKHBvc2l0aW9uc1tpXS5hbHQpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIGxldCBuZXdQb3NpdGlvbnNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgIT09ICdmYWxzZSdcclxuICAgICkge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSBbLi4ucG9zaXRpb25zLCBwb3NpdGlvbnNbMF1dXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSBbLi4ucG9zaXRpb25zXVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zbW9vdGggJiYgdGhpcy5vcHRpb25zLnNtb290aCAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSB0aGlzLnNtb290aEhhbmRsZShuZXdQb3NpdGlvbnMpXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3UG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gICAgICAgICAgbmV3UG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgIG5ld1Bvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICBuZXdQb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1Bvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAgICAgICAgIG5ld1Bvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICBuZXdQb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgbmV3UG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOiuoeeul+mVv+W6plxyXG4gICAgaWYgKFxyXG4gICAgICAodGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgICB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbCAhPT0gJ2ZhbHNlJykgfHxcclxuICAgICAgKHRoaXMub3B0aW9ucy5zbW9vdGggJiYgdGhpcy5vcHRpb25zLnNtb290aCAhPT0gJ2ZhbHNlJylcclxuICAgICkge1xyXG4gICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb21EZWdyZWVzQXJyYXkubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICBhcnJheS5wdXNoKHtcclxuICAgICAgICAgIGxuZzogZnJvbURlZ3JlZXNBcnJheVtpXSxcclxuICAgICAgICAgIGxhdDogZnJvbURlZ3JlZXNBcnJheVtpICsgMV0sXHJcbiAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDJdXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgICB0aGlzLmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgICBhcnJheSxcclxuICAgICAgICAyLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICAgKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgX3RoaXMubGVuZ3RoQnlNZXRlciA9IHJlc1xyXG4gICAgICAgIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgJiYgdGhpcy5sZW5ndGhDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICAgICAgY2QgJiYgY2QoKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgICB0aGlzLmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgICBwb3NpdGlvbnMsXHJcbiAgICAgICAgMixcclxuICAgICAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lXHJcbiAgICAgICkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIF90aGlzLmxlbmd0aEJ5TWV0ZXIgPSByZXNcclxuICAgICAgICB0aGlzLmxlbmd0aENoYW5nZUNhbGxCYWNrICYmIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2soKVxyXG4gICAgICAgIGNkICYmIGNkKClcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHJldHVybiBmcm9tRGVncmVlc0FycmF5XHJcbiAgfVxyXG5cclxuICAvLyDmm7TmlrDlpJrovrnlvaLvvIjnur/mianlsZXvvIlcclxuICByZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSkge1xyXG4gICAgbGV0IGxpbmVQb3NpdGlvbnMgPSBbXVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbmQgJiYgdGhpcy5vcHRpb25zLmV4dGVuZCAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICBsZXQgb3V0ZXJIb2xlID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcm9tRGVncmVlc0FycmF5Lmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgICAgbGluZVBvc2l0aW9ucy5wdXNoKFtmcm9tRGVncmVlc0FycmF5W2ldLCBmcm9tRGVncmVlc0FycmF5W2kgKyAxXV0pXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGxpbmVzdHJpbmcgPSB0dXJmLmxpbmVTdHJpbmcobGluZVBvc2l0aW9ucylcclxuICAgICAgbGV0IGJ1ZmZlcmVkID0gdHVyZi5idWZmZXIoXHJcbiAgICAgICAgbGluZXN0cmluZyxcclxuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kV2lkdGggLyAxMDAwLFxyXG4gICAgICAgIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9XHJcbiAgICAgIClcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBvdXRlckhvbGUucHVzaChcclxuICAgICAgICAgIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdW2ldWzBdLFxyXG4gICAgICAgICAgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1baV1bMV1cclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGhvbGVzID0gW10gLy8g5a2UXHJcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbaV0ubGVuZ3RoOyBtKyspIHtcclxuICAgICAgICAgIGFycmF5LnB1c2goXHJcbiAgICAgICAgICAgIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzW2ldW21dWzBdLFxyXG4gICAgICAgICAgICBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1tpXVttXVsxXVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBob2xlcy5wdXNoKHsgcG9zaXRpb25zOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGFycmF5KSB9KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24gPSBuZXcgQ2VzaXVtLlBvbHlnb25HcmFwaGljcyh7XHJcbiAgICAgICAgaGllcmFyY2h5OiB7XHJcbiAgICAgICAgICBwb3NpdGlvbnM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkob3V0ZXJIb2xlKSxcclxuICAgICAgICAgIGhvbGVzOiBob2xlc1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbWF0ZXJpYWw6IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhpcy5vcHRpb25zLmV4dGVuZENvbG9yKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbiA9IHVuZGVmaW5lZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVzZXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgIHRoaXMubmFtZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLm5hbWVcclxuICAgIHRoaXMuY29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5jb2xvclxyXG4gICAgdGhpcy5saW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy53aWR0aFxyXG4gICAgdGhpcy5saW5lVHlwZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnR5cGVcclxuICAgIHRoaXMubm9zZVRvVGFpbCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLm5vc2VUb1RhaWxcclxuICAgIHRoaXMuc21vb3RoID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc21vb3RoXHJcbiAgICB0aGlzLmV4dGVuZCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmV4dGVuZFxyXG4gICAgdGhpcy5leHRlbmRXaWR0aCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmV4dGVuZFdpZHRoXHJcbiAgICB0aGlzLmV4dGVuZENvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuZXh0ZW5kQ29sb3JcclxuICAgIHRoaXMubGFiZWxTaG93ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuc2hvd1xyXG4gICAgdGhpcy5sYWJlbENvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuY29sb3JcclxuICAgIHRoaXMubGFiZWxGb250U2l6ZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgICB0aGlzLmxhYmVsRm9udEZhbWlseSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRGYW1pbHlcclxuICAgIHRoaXMubGFiZWxMaW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICAgIHRoaXMubGFiZWxQaXhlbE9mZnNldCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubGluZUNvbG9yXHJcbiAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAvLyB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAvLyB0aGlzLmF0dHJpYnV0ZUNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICAgIC8vIHRoaXMuYXR0cmlidXRlR29vZHMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnRcclxuICAgIHRoaXMucm90YXRlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMucm90YXRlXHJcbiAgICB0aGlzLnNwZWVkID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc3BlZWRcclxuICAgIC8vIHRoaXMuZGFzaFNpemUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5kYXNoU2l6ZVxyXG4gICAgdGhpcy5zcGFjZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnNwYWNlXHJcbiAgICAvLyB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAvLyB0aGlzLmdvb2RzU2VsZWN0ICYmIHRoaXMuZ29vZHNTZWxlY3QoKVxyXG5cclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlXHJcblxyXG4gICAgLy8gbGV0IGhlaWdodFxyXG4gICAgLy8gaWYgKHRoaXMuZ3JvdW5kKSB7XHJcbiAgICAvLyAgIGhlaWdodCA9IGF3YWl0IHRoYXQuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAvLyAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgIC8vICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAvLyAgIH0pXHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgLy8gICBoZWlnaHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gICAgLy8gfVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgLy8gICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgLy8gICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgLy8gICBhbHQ6IGhlaWdodFxyXG4gICAgLy8gfVxyXG4gICAgLy8gdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyxcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCxcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmFsdFxyXG4gICAgLy8gXVxyXG4gIH1cclxuXHJcbiAgX2FkZExpbmsoKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmtfYWRkJylbMF1cclxuICAgICAgICAudmFsdWVcclxuICAgICkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5wdXNoKHtcclxuICAgICAgICBuYW1lOiAn6ZO+5o6lJyArICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5sZW5ndGggKyAxKSxcclxuICAgICAgICB1cmw6IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnbGlua19hZGQnXHJcbiAgICAgICAgKVswXS52YWx1ZVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICdsaW5rX2FkZCdcclxuICAgICAgKVswXS52YWx1ZSA9ICcnXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLkRpYWxvZy5jbGlja0FkZExpbmsgJiYgdGhpcy5EaWFsb2cuY2xpY2tBZGRMaW5rKClcclxuICAgICAgLy8gbGV0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgICAgLy8gaW5wdXQudHlwZSA9IFwiZmlsZVwiO1xyXG4gICAgICAvLyBpbnB1dC5hY2NlcHQgPSBcIi5tcDQsIC5wZGZcIlxyXG4gICAgICAvLyBpbnB1dC5jbGljaygpXHJcbiAgICAgIC8vIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChldmVudCkgPT4ge1xyXG4gICAgICAvLyAgIGlmIChpbnB1dC52YWx1ZSkge1xyXG4gICAgICAvLyAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgIC8vICAgICAgIG5hbWU6ICfpk77mjqUnICsgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aCArIDEpLFxyXG4gICAgICAvLyAgICAgICB1cmw6IGlucHV0LnZhbHVlXHJcbiAgICAgIC8vICAgICB9KVxyXG4gICAgICAvLyAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgLy8gICB9XHJcbiAgICAgIC8vIH0pXHJcbiAgICB9XHJcbiAgfVxyXG4gIGFkZEF0dHJpYnV0ZUxpbmsobGluaykge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgIG5hbWU6ICfpk77mjqUnICsgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aCArIDEpLFxyXG4gICAgICB1cmw6IGxpbmtcclxuICAgIH0pXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gIH1cclxuXHJcbiAgLy8gX2FkZFJyKCkge1xyXG4gIC8vICAgaWYgKFxyXG4gIC8vICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICd2cl9hZGQnXHJcbiAgLy8gICAgIClbMF0udmFsdWVcclxuICAvLyAgICkge1xyXG4gIC8vICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQucHVzaCh7XHJcbiAgLy8gICAgICAgbmFtZTogJ+WFqOaZr+WbvicgKyAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50Lmxlbmd0aCArIDEpLFxyXG4gIC8vICAgICAgIHVybDogdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAvLyAgICAgICAgICd2cl9hZGQnXHJcbiAgLy8gICAgICAgKVswXS52YWx1ZVxyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICd2cl9hZGQnXHJcbiAgLy8gICAgIClbMF0udmFsdWUgPSAnJ1xyXG4gIC8vICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICB0aGlzLkRpYWxvZy5jbGlja0FkZFZyICYmIHRoaXMuRGlhbG9nLmNsaWNrQWRkVnIoKVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gYWRkQXR0cmlidXRlUnIodnIpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5wdXNoKHtcclxuICAvLyAgICAgbmFtZTogJ+WFqOaZr+WbvicgKyAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50Lmxlbmd0aCArIDEpLFxyXG4gIC8vICAgICB1cmw6IHZyXHJcbiAgLy8gICB9KVxyXG4gIC8vICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vIH1cclxuXHJcbiAgLyoqXHJcbiAgICog6aOe5YiwXHJcbiAgICovXHJcbiAgYXN5bmMgZmx5VG8ob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBzZXRBY3RpdmVWaWV3ZXIoMClcclxuICAgIGNsb3NlUm90YXRlQXJvdW5kKHRoaXMuc2RrKVxyXG4gICAgY2xvc2VWaWV3Rm9sbG93KHRoaXMuc2RrKVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldyAmJiB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uICYmIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uKSB7XHJcbiAgICAgIGxldCBvcmllbnRhdGlvbiA9IHtcclxuICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB8fCAwLjApLFxyXG4gICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucGl0Y2ggfHwgLTYwLjApLFxyXG4gICAgICAgIHJvbGw6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5yb2xsIHx8IDAuMClcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nXHJcbiAgICAgIGxldCBsYXQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxhdFxyXG4gICAgICBsZXQgYWx0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHRcclxuICAgICAgbGV0IGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuXHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IHsgbG5nOiAwLCBsYXQ6IDAgfVxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbiB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9ucykge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuY2VudGVyKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5jZW50ZXIgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5zdGFydCkge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMuc3RhcnQgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xuZycpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sbmcgPSB0aGlzLm9wdGlvbnMubG5nXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xhdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sYXQgPSB0aGlzLm9wdGlvbnMubGF0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5hbHQgPSB0aGlzLm9wdGlvbnMuYWx0XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIOWmguaenOayoeaciemrmOW6puWAvO+8jOWImeiOt+WPlue0p+i0tOmrmOW6puiuoeeul1xyXG4gICAgICBpZiAoIXBvc2l0aW9uLmhhc093blByb3BlcnR5KCdhbHQnKSkge1xyXG4gICAgICAgIHBvc2l0aW9uLmFsdCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodChwb3NpdGlvbilcclxuICAgICAgfVxyXG4gICAgICBsbmcgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyArIHBvc2l0aW9uLmxuZ1xyXG4gICAgICBsYXQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxhdCArIHBvc2l0aW9uLmxhdFxyXG4gICAgICBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdCArIHBvc2l0aW9uLmFsdFxyXG4gICAgICBkZXN0aW5hdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGxuZywgbGF0LCBhbHQpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG8oe1xyXG4gICAgICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbixcclxuICAgICAgICBvcmllbnRhdGlvbjogb3JpZW50YXRpb25cclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgcG9zaXRpb25BcnJheSA9IFtdXHJcbiAgICAgIGxldCBoZWlnaHRcclxuICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgYSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgcG9zaXRpb25BcnJheS5wdXNoKGEueCwgYS55LCBhLnopXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgIGhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodCh0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdKVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBhID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgICAgaGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2goYS54LCBhLnksIGEueilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgaGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0pXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2goYS54LCBhLnksIGEueilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgICAgbGV0IEJvdW5kaW5nU3BoZXJlID0gQ2VzaXVtLkJvdW5kaW5nU3BoZXJlLmZyb21WZXJ0aWNlcyhwb3NpdGlvbkFycmF5KVxyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmZseVRvQm91bmRpbmdTcGhlcmUoQm91bmRpbmdTcGhlcmUsIHtcclxuICAgICAgICBvZmZzZXQ6IG9wdGlvbnMub3JpZW50YXRpb24gfHwge1xyXG4gICAgICAgICAgaGVhZGluZzogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMCksXHJcbiAgICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKC05MC4wKSxcclxuICAgICAgICAgIHJvbGw6IENlc2l1bS5NYXRoLnRvUmFkaWFucygwLjApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5omT5byA5a+M5paH5pys5qGGXHJcbiAgICovXHJcbiAgb3BlblJpY2hUZXh0RWRpdG9yKGUpIHtcclxuICAgIC8vIHZhciB1ZSA9IFVFLmdldEVkaXRvcignYXBwJyk7XHJcbiAgICByaWNoVGV4dC5vcGVuKFxyXG4gICAgICB0aGlzLm9wdGlvbnMuaWQsXHJcbiAgICAgIHRoaXMub3B0aW9ucy5uYW1lLFxyXG4gICAgICB0aGlzLm9wdGlvbnMucmljaFRleHRDb250ZW50XHJcbiAgICApXHJcbiAgICByaWNoVGV4dC5wcmltYXJ5Q2FsbEJhY2sgPSBjb250ZW50ID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLnJpY2hUZXh0Q29udGVudCA9IGNvbnRlbnRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHN0YXRpYyBub2RlRWRpdDIodGhhdCwgY2IgPSAoKSA9PiB7IH0pIHtcclxuICAvLyAgIHRoYXQucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAvLyAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSkge1xyXG4gIC8vICAgICBjYign5LiK5LiA5qyh5rWL6YeP5pyq57uT5p2fJylcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyh0cnVlKVxyXG4gIC8vICAgICB0aGF0LnRpcCA9IG5ldyBNb3VzZVRpcCgn6K+36YCJ5oup5LiA5Liq6aG254K577yM5Y+z6ZSu5Y+W5raIJywgdGhhdC5zZGspXHJcbiAgLy8gICAgIHRoYXQuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGF0LnNkaylcclxuICAvLyAgICAgdGhhdC5ub2RlUG9pbnRzID0gW11cclxuICAvLyAgICAgbGV0IHNlbGVjdFBvaW50XHJcbiAgLy8gICAgIGxldCBvcmlnaW5hbFBvc2l0aW9uXHJcbiAgLy8gICAgIGxldCBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gIC8vICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gIC8vICAgICAgIClcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBuZXdwb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG5cclxuICAvLyAgICAgdGhhdC5ldmVudC5tb3VzZV9sZWZ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgLy8gICAgICAgICAgIGNhcnRlc2lhbixcclxuICAvLyAgICAgICAgICAgdGhhdC5zZGsudmlld2VyXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBvcmlnaW5hbFBvc2l0aW9uID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF1cclxuICAvLyAgICAgICAgIGxldCBlbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAvLyAgICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gIC8vICAgICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubG5nLFxyXG4gIC8vICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxhdCxcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5hbHRcclxuICAvLyAgICAgICAgICAgKSxcclxuICAvLyAgICAgICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgLy8gICAgICAgICAgICAgaW1hZ2U6IHRoYXQuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgLy8gICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gIC8vICAgICAgICAgICAgIGhlaWdodDogMTUsXHJcbiAgLy8gICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfSlcclxuICAvLyAgICAgICAgIHRoYXQubm9kZVBvaW50cy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXgsIDAsIGVudGl0eSlcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMuc3BsaWNlKFxyXG4gIC8vICAgICAgICAgICBzZWxlY3RQb2ludC5pbmRleCxcclxuICAvLyAgICAgICAgICAgMCxcclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF1cclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhhdC5yZW5ld1Bvc2l0aW9ucyh0aGF0Lm9wdGlvbnMucG9zaXRpb25zKVxyXG4gIC8vICAgICAgICAgdGhhdC5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5sZW5ndGhCeU1ldGVyID0gdGhhdC5jb21wdXRlRGlzdGFuY2UoXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMsXHJcbiAgLy8gICAgICAgICAgIDIsXHJcbiAgLy8gICAgICAgICAgIHRoYXQuZ3JvdW5kXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICB0aGF0Lmxlbmd0aFVuaXQgPSB0aGF0Lm9wdGlvbnMubGVuZ3RoVW5pdFxyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICB2YXIgcGljayA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5waWNrKG1vdmVtZW50LnBvc2l0aW9uKVxyXG4gIC8vICAgICAgICAgaWYgKFxyXG4gIC8vICAgICAgICAgICBwaWNrICYmXHJcbiAgLy8gICAgICAgICAgIHBpY2suaWQgJiZcclxuICAvLyAgICAgICAgICAgcGljay5pZC5uYW1lICYmXHJcbiAgLy8gICAgICAgICAgIHBpY2suaWQubmFtZSA9PT0gJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnXHJcbiAgLy8gICAgICAgICApIHtcclxuICAvLyAgICAgICAgICAgc2VsZWN0UG9pbnQgPSBwaWNrLmlkXHJcbiAgLy8gICAgICAgICAgIHRoYXQubm9kZVBvaW50cy5zcGxpY2UocGljay5pZC5pbmRleCwgMSlcclxuICAvLyAgICAgICAgICAgdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZShwaWNrLmlkKVxyXG4gIC8vICAgICAgICAgICB0aGF0LnRpcC5zZXRfdGV4dCgn5bem6ZSu5byA5aeL77yM5Y+z6ZSu57uT5p2f77yMQ1RSTCvlj7PplK7mkqTplIAnKVxyXG4gIC8vICAgICAgICAgICBvcmlnaW5hbFBvc2l0aW9uID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAvLyAgICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5zZGsudmlld2VyXHJcbiAgLy8gICAgICAgICAgIClcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pXHJcblxyXG4gIC8vICAgICB0aGF0LmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IG9yaWdpbmFsUG9zaXRpb25cclxuICAvLyAgICAgICAgIGNiKG51bGwsIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIGxldCBwb3NpdGlvbnMgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zXHJcbiAgLy8gICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gIC8vICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2goXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uc1tpXS5hbHRcclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgbmV3cG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgLy8gICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgLy8gICAgICAgKVxyXG4gIC8vICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoYXQubm9kZVBvaW50c1tpXSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgdGhhdC5ub2RlUG9pbnRzID0gW11cclxuICAvLyAgICAgICB0aGF0LmV2ZW50LmRlc3Ryb3koKVxyXG4gIC8vICAgICAgIHRoYXQudGlwLmRlc3Ryb3koKVxyXG4gIC8vICAgICB9KVxyXG5cclxuICAvLyAgICAgdGhhdC5ldmVudC5tb3VzZV9tb3ZlKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgLy8gICAgICAgICAgIGNhcnRlc2lhbixcclxuICAvLyAgICAgICAgICAgdGhhdC5zZGsudmlld2VyXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gIC8vICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gIC8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gIC8vICAgICAgICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICAgICAgcG9zaXRpb25zW2ldLmxhdCxcclxuICAvLyAgICAgICAgICAgICBwb3NpdGlvbnNbaV0uYWx0XHJcbiAgLy8gICAgICAgICAgIClcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIG5ld3Bvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gIC8vICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBpZiAodGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGggPT09IDEpIHtcclxuICAvLyAgICAgICAgICAgdGhhdC5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gIC8vICAgICAgICAgICBdXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAvLyAgICAgICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gIC8vICAgICAgICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgLy8gICAgICAgICAgICAgYWx0OiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHRoYXQudGlwLnNldFBvc2l0aW9uKFxyXG4gIC8vICAgICAgICAgY2FydGVzaWFuLFxyXG4gIC8vICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAvLyAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAvLyAgICAgICApXHJcbiAgLy8gICAgIH0pXHJcblxyXG4gIC8vICAgICB0aGF0LmV2ZW50Lm1vdXNlX3JpZ2h0X2tleWJvYXJkX2N0cmwoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAvLyAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMucG9wKClcclxuICAvLyAgICAgICAgIHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUoXHJcbiAgLy8gICAgICAgICAgIHRoYXQubm9kZVBvaW50c1t0aGF0Lm5vZGVQb2ludHMubGVuZ3RoIC0gMV1cclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIHRoYXQubm9kZVBvaW50cy5wb3AoKVxyXG4gIC8vICAgICAgICAgaWYgKHNlbGVjdFBvaW50LmluZGV4ID09PSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgICBpZiAodGhhdC5ub2RlUG9pbnRzW3NlbGVjdFBvaW50LmluZGV4IC0gMV0pIHtcclxuICAvLyAgICAgICAgICAgICBzZWxlY3RQb2ludCA9IHRoYXQubm9kZVBvaW50c1tzZWxlY3RQb2ludC5pbmRleCAtIDFdXHJcbiAgLy8gICAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgICAgc2VsZWN0UG9pbnQuaW5kZXggPSAwXHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pXHJcblxyXG4gIC8vICAgICB0aGF0LmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gIC8vICAgICAgIHJldHVybiBuZXdwb3NpdGlvbnNcclxuICAvLyAgICAgfSwgZmFsc2UpXHJcblxyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICBsZXQgZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgLy8gICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgLy8gICAgICAgICBpbmRleDogaSxcclxuICAvLyAgICAgICAgIHBvc2l0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gIC8vICAgICAgICAgKSxcclxuICAvLyAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gIC8vICAgICAgICAgICBpbWFnZTogdGhhdC5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvcG9pbnQucG5nJyxcclxuICAvLyAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gIC8vICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gIC8vICAgICAgICAgICBkaXNhYmxlRGVwdGhUZXN0RGlzdGFuY2U6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pXHJcbiAgLy8gICAgICAgdGhhdC5ub2RlUG9pbnRzLnB1c2goZW50aXR5KVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBub2RlRWRpdChjZCkge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgdGhpcy5ub3NlVG9UYWlsID0gZmFsc2VcclxuICAgIC8vIHRoaXMuc21vb3RoID0gZmFsc2VcclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IDBcclxuICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSkge1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKHRydWUpXHJcbiAgICAgIHRoaXMuX25vZGVFZGl0Q2FsbGJhY2sgPSBjZFxyXG4gICAgICB0aGlzLnRpcCA9IG5ldyBNb3VzZVRpcCgn6K+36YCJ5oup5LiA5Liq6aG254K577yM5Y+z6ZSu5Y+W5raIJywgdGhpcy5zZGspXHJcbiAgICAgIHRoaXMuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGlzLnNkaylcclxuICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0ID0gbmV3IENvbnRyb2xsZXIodGhpcy5zZGspXHJcblxyXG4gICAgICBsZXQgc2VsZWN0UG9pbnRcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdmFyIHBpY2sgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUucGljayhtb3ZlbWVudC5wb3NpdGlvbilcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBwaWNrICYmXHJcbiAgICAgICAgICBwaWNrLmlkICYmXHJcbiAgICAgICAgICBwaWNrLmlkLm5hbWUgJiZcclxuICAgICAgICAgIHBpY2suaWQubmFtZSA9PT0gJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBzZWxlY3RQb2ludCA9IHBpY2suaWRcclxuICAgICAgICAgIHRoaXMuQ29udHJvbGxlck9iamVjdC5wb3NpdGlvbiA9XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdXHJcbiAgICAgICAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QuZWRpdFRyYW5zbGF0aW9uYWwoKVxyXG4gICAgICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgICAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QuY29udHJvbGxlckNhbGxCYWNrID0gcGFyYW1zID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdFBvaW50LmluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24ubGF0LFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmFsdFxyXG4gICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICAgICAgICBsbmc6IHBhcmFtcy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgICAgICAgICBsYXQ6IHBhcmFtcy5wb3NpdGlvbi5sYXQsXHJcbiAgICAgICAgICAgICAgICBhbHQ6IHBhcmFtcy5wb3NpdGlvbi5hbHRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSBwYXJhbXMucG9zaXRpb25cclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sbmcgJiYgKHRoaXMuX2VsbXMubG5nW3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSBwYXJhbXMucG9zaXRpb24ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubG5nSW5wdXQgJiYgKHRoaXMuX2VsbXMubG5nSW5wdXRbc2VsZWN0UG9pbnQuaW5kZXhdLnZhbHVlID0gcGFyYW1zLnBvc2l0aW9uLmxuZy50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxhdCAmJiAodGhpcy5fZWxtcy5sYXRbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHBhcmFtcy5wb3NpdGlvbi5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sYXRJbnB1dCAmJiAodGhpcy5fZWxtcy5sYXRJbnB1dFtzZWxlY3RQb2ludC5pbmRleF0udmFsdWUgPSBwYXJhbXMucG9zaXRpb24ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMuYWx0ICYmICh0aGlzLl9lbG1zLmFsdFtzZWxlY3RQb2ludC5pbmRleF0uaW5uZXJIVE1MID0gcGFyYW1zLnBvc2l0aW9uLmFsdC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmFsdElucHV0ICYmICh0aGlzLl9lbG1zLmFsdElucHV0W3NlbGVjdFBvaW50LmluZGV4XS52YWx1ZSA9IHBhcmFtcy5wb3NpdGlvbi5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgc2VsZWN0UG9pbnQucG9zaXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24ubG5nLFxyXG4gICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5sYXQsXHJcbiAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmFsdFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgICAgICB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICAgIHRoaXMudGlwID0gbnVsbFxyXG4gICAgICAgIHRoaXMuQ29udHJvbGxlck9iamVjdC5kZXN0cm95KClcclxuXHJcbiAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICAgICAgdGhpcy5fbm9kZUVkaXRDYWxsYmFjayA9IG51bGxcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHRoaXMudGlwLnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAgICAgICApXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoKCkgPT4ge1xyXG4gICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgIHRoaXMuX25vZGVFZGl0Q2FsbGJhY2sodGhpcy5vcHRpb25zLnBvc2l0aW9ucywgdGhpcy5sZW5ndGhCeU1ldGVyKVxyXG4gICAgICAgIHJldHVybiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICB9LCBmYWxzZSlcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBlbnRpdHkgPSB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgICAgICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICB3aWR0aDogMTUsXHJcbiAgICAgICAgICAgIGhlaWdodDogMTUsXHJcbiAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICBjb2xvcjogQ2VzaXVtLkNvbG9yLldISVRFLndpdGhBbHBoYSgwLjk5KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5ub2RlUG9pbnRzLnB1c2goZW50aXR5KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZU5vZGVFZGl0KCkge1xyXG4gICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgdGhpcy5Db250cm9sbGVyT2JqZWN0ICYmIHRoaXMuQ29udHJvbGxlck9iamVjdC5kZXN0cm95KClcclxuICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgPSBudWxsXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLm5vZGVQb2ludHNbaV0pXHJcbiAgICB9XHJcbiAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgdGhpcy5fbm9kZUVkaXRDYWxsYmFjayA9IG51bGxcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOWIoOmZpFxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZSgpIHtcclxuICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgdGhpcy5sYWJlbCAmJiB0aGlzLmxhYmVsLnJlbW92ZSgpXHJcbiAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMuZW50aXR5KVxyXG4gICAgdGhpcy5lbnRpdHkgPSBudWxsXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmICF0aGlzLl9EaWFsb2dPYmplY3QuaXNEZXN0cm95KSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuc2RrLnJlbW92ZUluY2V0YW5jZSh0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICBhd2FpdCBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gIH1cclxuXHJcbiAgLyoqQGRlc2Mg5omT5byA5bmz56e75Yqf6IO9XHJcbiAgICpcclxuICAgKiBAbWVtYmVyT2YgU291cmNlXHJcbiAgICogQHBhcmFtIHN0YXR1cyB7Ym9vbGVhbn1cclxuICAgKlxyXG4gICAqICovXHJcbiAgc2V0IHBvc2l0aW9uRWRpdGluZyhzdGF0dXMpIHtcclxuICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSB8fCAhdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nID0gc3RhdHVzXHJcbiAgICBpZiAoc3RhdHVzID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgdGhpcy5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgdGhpcy50aXAgPSBuZXcgTW91c2VUaXAoJ+eCueWHu+m8oOagh+W3pumUruehruiupO+8jOWPs+mUruWPlua2iCcsIHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLmxhYmVsICYmXHJcbiAgICAgICAgKHRoaXMubGFiZWwuZW50aXR5LmJpbGxib2FyZC5jb2xvciA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoXHJcbiAgICAgICAgICBgcmdiYSgyNTUsMjU1LDI1NSwwLjkpYFxyXG4gICAgICAgICkpXHJcbiAgICAgIHRoaXMucGlja2luZyA9IGZhbHNlXHJcbiAgICAgIGxldCBwb3NpdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpKVxyXG4gICAgICAvLyBsZXQgcG9zaXRpb25zMiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocG9zaXRpb25zKSlcclxuICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vICAgbGV0IGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbnMyW2ldLmxuZywgcG9zaXRpb25zMltpXS5sYXQpKVxyXG4gICAgICAvLyAgIHBvc2l0aW9uczJbaV0gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgLy8gICAgIHBvc2l0aW9uczJbaV0ubG5nLFxyXG4gICAgICAvLyAgICAgcG9zaXRpb25zMltpXS5sYXQsXHJcbiAgICAgIC8vICAgICBOdW1iZXIoKHBvc2l0aW9uczJbaV0uYWx0ICsgTnVtYmVyKGhlaWdodCkpLnRvRml4ZWQoMikpXHJcbiAgICAgIC8vICAgKVxyXG4gICAgICAvLyB9XHJcbiAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgcG9zaXRpb25zOiBbLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uc11cclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHBvc2l0aW9uc1tpXSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgcG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICBwb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBjZW50ZXIgPSBwb3NpdGlvbnNbTWF0aC5mbG9vcihwb3NpdGlvbnMubGVuZ3RoIC8gMildXHJcbiAgICAgIGxldCBkaXNwYXJpdHkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNlbnRlci54IC0gcG9zaXRpb25zW2ldLnhcclxuICAgICAgICBkaXNwYXJpdHkucHVzaCh7XHJcbiAgICAgICAgICB4OiBjZW50ZXIueCAtIHBvc2l0aW9uc1tpXS54LFxyXG4gICAgICAgICAgeTogY2VudGVyLnkgLSBwb3NpdGlvbnNbaV0ueSxcclxuICAgICAgICAgIHo6IGNlbnRlci56IC0gcG9zaXRpb25zW2ldLnpcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgbmV3UCA9IHtcclxuICAgICAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0uelxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gbGV0IHBvczg0ID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAgICAgICAgIC8vICAgbmV3UCxcclxuICAgICAgICAgIC8vICAgdGhpcy5zZGsudmlld2VyXHJcbiAgICAgICAgICAvLyApXHJcbiAgICAgICAgICAvLyBsZXQgaGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLmdldEhlaWdodChDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21EZWdyZWVzKHBvczg0LmxuZywgcG9zODQubGF0KSlcclxuICAgICAgICAgIC8vIHBvczg0LmFsdCA9IE51bWJlcigocG9zODQuYWx0ICsgTnVtYmVyKGhlaWdodCkpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAvLyBuZXdQID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAvLyAgIHBvczg0LmxuZyxcclxuICAgICAgICAgIC8vICAgcG9zODQubGF0LFxyXG4gICAgICAgICAgLy8gICBwb3M4NC5hbHRcclxuICAgICAgICAgIC8vIClcclxuICAgICAgICAgIG5ld3Bvc2l0aW9ucy5wdXNoKG5ld1ApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwb3NpdGlvbjg0ID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAgICAgICAgIG5ld3Bvc2l0aW9uc1swXSxcclxuICAgICAgICAgIHRoaXMuc2RrLnZpZXdlclxyXG4gICAgICAgIClcclxuICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3Bvc2l0aW9uODQubG5nLCBwb3NpdGlvbjg0LmxhdCwgcG9zaXRpb244NC5hbHRdXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgbG5nOiBwb3NpdGlvbjg0LmxuZyxcclxuICAgICAgICAgIGxhdDogcG9zaXRpb244NC5sYXQsXHJcbiAgICAgICAgICBhbHQ6IHBvc2l0aW9uODQuYWx0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGlwLnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAgICAgICApXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnpcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwb3NpdGlvbnNMbmdMYXQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3cG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KG5ld3Bvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICAgICAgcG9zaXRpb24uYWx0ID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgIHBvc2l0aW9uc0xuZ0xhdC5wdXNoKHBvc2l0aW9uKVxyXG5cclxuICAgICAgICAgIHRoaXMuX2VsbXMubG5nICYmICh0aGlzLl9lbG1zLmxuZ1tpXS5pbm5lckhUTUwgPSBwb3NpdGlvbi5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMubG5nSW5wdXQgJiYgKHRoaXMuX2VsbXMubG5nSW5wdXRbaV0udmFsdWUgPSBwb3NpdGlvbi5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGF0ICYmICh0aGlzLl9lbG1zLmxhdFtpXS5pbm5lckhUTUwgPSBwb3NpdGlvbi5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGF0SW5wdXQgJiYgKHRoaXMuX2VsbXMubGF0SW5wdXRbaV0udmFsdWUgPSBwb3NpdGlvbi5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMuYWx0ICYmICh0aGlzLl9lbG1zLmFsdFtpXS5pbm5lckhUTUwgPSBwb3NpdGlvbi5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMuYWx0SW5wdXQgJiYgKHRoaXMuX2VsbXMuYWx0SW5wdXRbaV0udmFsdWUgPSBwb3NpdGlvbi5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnMgPSBwb3NpdGlvbnNMbmdMYXRcclxuICAgICAgICB0aGlzLnByZXZpb3VzLnBvc2l0aW9ucyA9IHBvc2l0aW9uc0xuZ0xhdFxyXG5cclxuICAgICAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnNMbmdMYXQgPSBwb3NpdGlvbnNMbmdMYXRcclxuICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucywgKCk9PntcclxuICAgICAgICAgIGlmKHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrKClcclxuICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2sgPSBudWxsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgICApXHJcbiAgICAgICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHtcclxuICAgICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgbGV0IHBvcyA9IHtcclxuICAgICAgICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICAgICAgICB4OiAobW92ZW1lbnQucG9zaXRpb24xLnggKyBtb3ZlbWVudC5wb3NpdGlvbjIueCkgLyAyLFxyXG4gICAgICAgICAgICAgIHk6IChtb3ZlbWVudC5wb3NpdGlvbjEueSArIG1vdmVtZW50LnBvc2l0aW9uMi55KSAvIDJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGVuZFRpbWUgLSBzdGFydFRpbWUgPj0gNTAwKSB7XHJcbiAgICAgICAgICAgIC8vIOmVv+aMieWPlua2iFxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGVmdEV2ZW50KHBvcywgY2FydGVzaWFuKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKG5ld3Bvc2l0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3cG9zaXRpb25zXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBwb3NpdGlvbnNcclxuICAgICAgICB9XHJcbiAgICAgIH0sIGZhbHNlKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmxhYmVsIHx8ICF0aGlzLmxhYmVsLmVudGl0eSkge1xyXG4gICAgICAgIHRoaXMubGFiZWwuZW50aXR5LmJpbGxib2FyZC5jb2xvciA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoXHJcbiAgICAgICAgICBgcmdiYSgyNTUsMjU1LDI1NSwxKWBcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5waWNraW5nID0gdHJ1ZVxyXG4gICAgICBpZiAodGhpcy5ldmVudCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICApXHJcbiAgICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICAgIF1cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgbGF0OiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgICAgYWx0OiBmcm9tRGVncmVlc0FycmF5WzJdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICAgIF1cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgbGF0OiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgICAgYWx0OiBmcm9tRGVncmVlc0FycmF5WzJdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHBvc2l0aW9uRWRpdGluZygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nXHJcbiAgfVxyXG5cclxuICBvcGVuUG9zaXRpb25FZGl0aW5nKGNkKSB7XHJcbiAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IHRydWVcclxuICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrID0gY2RcclxuICB9XHJcblxyXG4gIGdldCBsZW5ndGhDaGFuZ2VDYWxsQmFjaygpIHtcclxuICAgIHJldHVybiB0aGlzLl9sZW5ndGhDaGFuZ2VDYWxsQmFja1xyXG4gIH1cclxuXHJcbiAgc2V0IGxlbmd0aENoYW5nZUNhbGxCYWNrIChjZCkge1xyXG4gICAgdGhpcy5fbGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgPSBjZFxyXG4gIH1cclxuXHJcbiAgc2V0RElWKG9wdGlvbnMgPSB7IGRvbWlkOiAnJywgeDogMTAsIHk6IDEwIH0pIHtcclxuICAgIG9wdGlvbnMueCA9IG9wdGlvbnMueCB8fCBvcHRpb25zLnggPT09IDAgPyBvcHRpb25zLnggOiAxMFxyXG4gICAgb3B0aW9ucy55ID0gb3B0aW9ucy55IHx8IG9wdGlvbnMueSA9PT0gMCA/IG9wdGlvbnMueSA6IDEwXHJcblxyXG4gICAgbGV0IHBvaW50cyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcG9pbnRzLnB1c2goW1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0XHJcbiAgICAgIF0pXHJcbiAgICB9XHJcbiAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhwb2ludHMpXHJcbiAgICBsZXQgbGVuZ3RoID0gdHVyZi5sZW5ndGgobGluZSwgeyB1bml0czogJ2tpbG9tZXRlcnMnIH0pXHJcbiAgICBsZXQgc2xpY2VkID0gdHVyZi5saW5lU2xpY2VBbG9uZyhsaW5lLCAwLCBsZW5ndGggLyAyLCB7XHJcbiAgICAgIHVuaXRzOiAna2lsb21ldGVycydcclxuICAgIH0pXHJcblxyXG4gICAgbGV0IHNpdGVJbmZvRG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3B0aW9ucy5kb21pZClcclxuICAgIGxldCBzaXRlSW5mb1Bvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgIC4uLnNsaWNlZC5nZW9tZXRyeS5jb29yZGluYXRlc1tzbGljZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV1cclxuICAgIClcclxuICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS5wb3N0UmVuZGVyLmFkZEV2ZW50TGlzdGVuZXIocGVyY2VudGFnZSA9PiB7XHJcbiAgICAgIC8v6L2s5o2i5Yiw5bGP5bmV5Z2Q5qCHXHJcbiAgICAgIGlmIChcclxuICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snIHx8XHJcbiAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJydcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHdpbnBvcyA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jYXJ0ZXNpYW5Ub0NhbnZhc0Nvb3JkaW5hdGVzKFxyXG4gICAgICAgICAgc2l0ZUluZm9Qb3NpdGlvblxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAod2lucG9zKSB7XHJcbiAgICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5sZWZ0ID0gKHdpbnBvcy54ICsgb3B0aW9ucy54KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUudG9wID0gKHdpbnBvcy55ICsgb3B0aW9ucy55KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgUG9seWxpbmVPYmplY3RcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBSUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQXBCQTtBQUFBO0FBa0JBO0FBR0E7QUFDQTtBQUNBO0FBUUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBRUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBakJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF6QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtEQTtBQXpEQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBVkE7QUFBQTtBQVFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFsQkE7QUFBQTtBQUFBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQTZIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0E7QUFzREE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFZQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFPQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF0SEE7QUFBQTtBQUFBO0FBeUhBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBbHVCQTtBQUFBO0FBQUE7QUFBQTtBQW91QkE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUdBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUF2REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEwREE7QUFJQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBRUE7QUF5QkE7QUFBQTtBQXRCQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBMUdBO0FBQUE7QUFBQTtBQUFBO0FBNEdBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFaQTtBQUFBO0FBQUE7QUFBQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFBQTtBQUFBO0FBNE5BO0FBQ0E7QUFBQTtBQXZOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUlBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWw5REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBZUE7QUFBQTtBQVpBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSEE7QUFBQTtBQUFBO0FBT0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFIQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQXREQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQTIxREEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Obj/Base/PolylineObject/index.js\n"); /***/ }), @@ -3238,7 +3238,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ \"./node_modules/@babel/runtime/helpers/typeof.js\");\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var js_md5__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! js-md5 */ \"./node_modules/js-md5/src/md5.js\");\n/* harmony import */ var js_md5__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(js_md5__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _proj__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./proj */ \"./src/Tools/proj.js\");\n/* harmony import */ var _projConvert__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./projConvert */ \"./src/Tools/projConvert.js\");\n/* harmony import */ var _projectionConvert__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./projectionConvert */ \"./src/Tools/projectionConvert.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Global/global */ \"./src/Global/global.js\");\n/* harmony import */ var _Obj_Materail_FlowPictureMaterialProperty__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Obj/Materail/FlowPictureMaterialProperty */ \"./src/Obj/Materail/FlowPictureMaterialProperty.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n/**\r\n * @name: index\r\n * @author: Administrator\r\n * @date: 2022-06-09 16:46\r\n * @description:index\r\n * @update: 2022-06-09 16:46\r\n */\n\n\n\n\n\n\n\nvar Tools = /*#__PURE__*/function () {\n /**\r\n * @constructor\r\n * @desc 工具类\r\n * */\n function Tools(sdk, options) {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default()(this, Tools);\n this.sdk = sdk;\n if (this.sdk) {\n this.name_map = this.sdk.proj.name_map;\n this.epsg_map = this.sdk.proj.epsg_map;\n this.convert = this.sdk.proj.convert;\n this.getAllProjection = this.sdk.proj.getAllProjection;\n this.projectionIsExists = this.sdk.proj.projectionIsExists;\n this.degreesToDMS = this.sdk.proj.degreesToDMS;\n this.dmsToDecimal = this.sdk.proj.dmsToDecimal;\n }\n this.options = _objectSpread({}, options);\n }\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default()(Tools, [{\n key: \"POST\",\n get: function get() {\n return 'POST';\n }\n }, {\n key: \"GET\",\n get: function get() {\n return 'GET';\n }\n }, {\n key: \"degreesToRadians\",\n value:\n /**\r\n * @description 将角度转换为弧度\r\n * @method degreesToRadians\r\n * @param degrees {number} 弧度制\r\n * @return radians {number}\r\n * @memberOf Tools\r\n * @example let radians = tool.degreesToRadians(20)\r\n * */\n function degreesToRadians(degrees) {\n return turf.degreesToRadians(Number(degrees)); // 1.0471975511965976\n }\n\n /**\r\n * @description 将弧度转换为角度\r\n * @method radiansToDegrees\r\n * @param radians {number} 弧度制\r\n * @return degrees {number}\r\n * @memberOf Tools\r\n * @example let degrees = tool.radiansToDegrees(2)\r\n * */\n }, {\n key: \"radiansToDegrees\",\n value: function radiansToDegrees(radians) {\n return turf.radiansToDegrees(Number(radians)); // 1.0471975511965976\n }\n\n /**\r\n * @desc 随机字符串\r\n * @function randomString\r\n * @memberOf extra\r\n * @param {number} [e=32] 字符串长度\r\n * @returns {string} str 字符串\r\n * @memberOf Tools\r\n * @example let strings=tool.randomString()\r\n * */\n }, {\n key: \"randomString\",\n value: function randomString(e) {\n /* e = e || 32\r\n var t = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678',\r\n a = t.length,\r\n n = ''\r\n for (let i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a))*/\n return Cesium.createGuid();\n }\n }, {\n key: \"getSourceRootPath\",\n value: function getSourceRootPath() {\n var sdkName = 'YJEarth.min.js';\n var scripts = document.querySelectorAll('script');\n var prefix = '';\n scripts.forEach(function (item) {\n if (item.src && item.src.indexOf(sdkName) > -1) {\n var arr = item.src.split('/');\n arr.pop();\n prefix = arr.join('/');\n }\n });\n return prefix;\n }\n\n /**@description 笛卡尔坐标转经纬度\r\n * @method cartesian3Towgs84\r\n * @param cartesian {Cesium.Cartesian3} 笛卡尔坐标\r\n * @param viewer\r\n * @param cartesian.x {number}\r\n * @param cartesian.y {number}\r\n * @param cartesian.z {number}\r\n * @memberOf Tools\r\n * @return {object} wgs84 返回wgs84坐标\r\n * */\n }, {\n key: \"cartesian3Towgs84\",\n value: function cartesian3Towgs84(cartesian, viewer) {\n var ellipsoid = viewer.scene.globe.ellipsoid;\n var cartesian3 = new Cesium.Cartesian3(cartesian.x, cartesian.y, cartesian.z);\n var cartographic = ellipsoid.cartesianToCartographic(cartesian3);\n var lat = Cesium.Math.toDegrees(cartographic.latitude);\n var lng = Cesium.Math.toDegrees(cartographic.longitude);\n var alt = cartographic.height < 0 ? 0 : cartographic.height;\n // var alt = cartographic.height\n return {\n lng: lng,\n lat: lat,\n alt: alt\n };\n }\n\n /**\r\n * @desc 计算多线段长度\r\n * @method computeDistance\r\n * @memberOf Tools\r\n *@param positions {Array.<{lng:number, lat:number,alt:number}>}坐标数组\r\n * @param [fractionDigits=2] 保留小数点位数\r\n * @param [ground=true] 是否贴地\r\n * */\n }, {\n key: \"computeDistance\",\n value: (function () {\n var _computeDistance = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee() {\n var positions,\n fractionDigits,\n type,\n length,\n i,\n position1,\n position2,\n distance,\n _i,\n _position,\n _position2,\n _distance,\n meters,\n lineString2,\n line2,\n d,\n res,\n coordinates,\n arr,\n _iterator,\n _step,\n item,\n index,\n r,\n l,\n _i2,\n _position3,\n _position4,\n _distance2,\n _args = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n positions = _args.length > 0 && _args[0] !== undefined ? _args[0] : [];\n fractionDigits = _args.length > 1 && _args[1] !== undefined ? _args[1] : 2;\n type = _args.length > 2 && _args[2] !== undefined ? _args[2] : '空间长度';\n if (!(positions.length < 2)) {\n _context.next = 7;\n break;\n }\n return _context.abrupt(\"return\", 0);\n case 7:\n length = 0;\n _context.t0 = type;\n _context.next = _context.t0 === '空间长度' ? 11 : _context.t0 === '投影长度' ? 13 : _context.t0 === '地表长度' ? 15 : 48;\n break;\n case 11:\n for (i = 0; i < positions.length - 1; i++) {\n position1 = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n position2 = Cesium.Cartesian3.fromDegrees(positions[i + 1].lng, positions[i + 1].lat, positions[i + 1].alt);\n distance = Cesium.Cartesian3.distance(position1, position2);\n length = length + distance;\n }\n return _context.abrupt(\"break\", 49);\n case 13:\n for (_i = 0; _i < positions.length - 1; _i++) {\n _position = Cesium.Cartesian3.fromDegrees(positions[_i].lng, positions[_i].lat, 0);\n _position2 = Cesium.Cartesian3.fromDegrees(positions[_i + 1].lng, positions[_i + 1].lat, 0);\n _distance = Cesium.Cartesian3.distance(_position, _position2);\n length = length + _distance;\n }\n return _context.abrupt(\"break\", 49);\n case 15:\n lineString2 = [];\n positions.forEach(function (item) {\n lineString2.push([item.lng, item.lat, item.alt]);\n });\n line2 = turf.lineString(lineString2);\n d = turf.length(line2) * 1000;\n meters = d > 20 ? d / 20 : d;\n res = this.chunkLine(positions, meters);\n coordinates = [];\n res.forEach(function (Feature, index) {\n if (index === 0) {\n coordinates = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(Feature.geometry.coordinates);\n } else {\n coordinates.push(Feature.geometry.coordinates[1]);\n }\n });\n arr = [];\n _iterator = _createForOfIteratorHelper(coordinates);\n _context.prev = 25;\n _iterator.s();\n case 27:\n if ((_step = _iterator.n()).done) {\n _context.next = 37;\n break;\n }\n item = _step.value;\n index = coordinates.indexOf(item);\n _context.next = 32;\n return this.sampleHeight({\n lng: item[0],\n lat: item[1],\n alt: 0\n }, index);\n case 32:\n r = _context.sent;\n r.position.alt = r.position.alt < 0 ? 0 : r.position.alt;\n arr.push(r);\n case 35:\n _context.next = 27;\n break;\n case 37:\n _context.next = 42;\n break;\n case 39:\n _context.prev = 39;\n _context.t1 = _context[\"catch\"](25);\n _iterator.e(_context.t1);\n case 42:\n _context.prev = 42;\n _iterator.f();\n return _context.finish(42);\n case 45:\n l = arr.length - 1;\n for (_i2 = 0; _i2 < arr.length - 1; _i2++) {\n _position3 = Cesium.Cartesian3.fromDegrees(arr[_i2].position.lng, arr[_i2].position.lat, 0);\n _position4 = Cesium.Cartesian3.fromDegrees(arr[_i2 + 1].position.lng, arr[_i2 + 1].position.lat, 0);\n _distance2 = Cesium.Cartesian3.distance(_position3, _position4);\n length = length + _distance2;\n }\n return _context.abrupt(\"break\", 49);\n case 48:\n return _context.abrupt(\"break\", 49);\n case 49:\n return _context.abrupt(\"return\", length.toFixed(fractionDigits));\n case 50:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this, [[25, 39, 42, 45]]);\n }));\n function computeDistance() {\n return _computeDistance.apply(this, arguments);\n }\n return computeDistance;\n }())\n }, {\n key: \"computeDistance2\",\n value: function computeDistance2() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var fractionDigits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n var ground = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n if (positions.length < 2) {\n return 0;\n } else {\n var length = 0;\n if (ground) {\n var lineString = [];\n positions.forEach(function (item) {\n lineString.push([item.lng, item.lat, item.alt]);\n });\n var line = turf.lineString(lineString);\n length = turf.length(line) * 1000;\n } else {\n for (var i = 0; i < positions.length - 1; i++) {\n var position1 = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n var position2 = Cesium.Cartesian3.fromDegrees(positions[i + 1].lng, positions[i + 1].lat, positions[i + 1].alt);\n var distance = Cesium.Cartesian3.distance(position1, position2);\n length = length + distance;\n }\n }\n return length.toFixed(fractionDigits);\n }\n }\n }, {\n key: \"sampleHeight\",\n value: function () {\n var _sampleHeight = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee2(p1, index) {\n var p2;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return this.sampleHeightMostDetailed([p1]);\n case 2:\n p2 = _context2.sent;\n p1.alt = p2[0].height;\n return _context2.abrupt(\"return\", {\n position: p1,\n index: index\n });\n case 5:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function sampleHeight(_x, _x2) {\n return _sampleHeight.apply(this, arguments);\n }\n return sampleHeight;\n }()\n /**@description 计算多边形面积\r\n * @method computeArea\r\n * @memberOf Tools\r\n * @param positions {Array.<{lng:number, lat:number,alt:number}>}\r\n * @param [fractionDigits=2] {number} 精确到小数点多少位\r\n * @return {number} 面积\r\n * */\n }, {\n key: \"computeArea\",\n value: function computeArea(positions) {\n var fractionDigits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n if (positions.length < 3) {\n return 0;\n } else {\n var p = [];\n positions.forEach(function (item) {\n p.push([item.lng, item.lat]);\n });\n p.push(p[0]);\n var polygon = turf.polygon([p]);\n var triangles = turf.tesselate(polygon);\n return Number(turf.area(triangles).toFixed(fractionDigits));\n }\n }\n }, {\n key: \"computeSignedArea\",\n value: function computeSignedArea(viewer, path) {\n var _this = this;\n var fromDegreesArray = [];\n var fromDegreesArray2 = [];\n for (var i = 0; i < path.length; i++) {\n fromDegreesArray.push(path[i].lng, path[i].lat);\n fromDegreesArray2.push([path[i].lng, path[i].lat]);\n }\n var line = turf.lineString(fromDegreesArray2);\n var bbox = turf.bbox(line);\n var longRadians = Cesium.Math.toRadians(bbox[2] - bbox[0]);\n var latRadians = Cesium.Math.toRadians(bbox[3] - bbox[1]);\n var granularity;\n if (longRadians > latRadians) {\n granularity = longRadians / 10;\n } else {\n granularity = latRadians / 10;\n }\n\n // let granularity = Math.PI / Math.pow(2, 11);\n // granularity = granularity / 1250;\n var polygonGeometry = new Cesium.PolygonGeometry.fromPositions({\n positions: Cesium.Cartesian3.fromDegreesArray(fromDegreesArray),\n vertexFormat: Cesium.PerInstanceColorAppearance.FLAT_VERTEX_FORMAT,\n granularity: granularity\n });\n //创建自定义平面几何体\n var geom = new Cesium.PolygonGeometry.createGeometry(polygonGeometry);\n if (!geom || !geom.attributes || !geom.attributes.position) {\n return 0;\n }\n var indices = geom.indices; //获取顶点索引数据\n var positions = geom.attributes.position.values;\n function returnPosition(position, index) {\n var pos3 = new Cesium.Cartesian3(positions[index * 3], positions[index * 3 + 1], positions[index * 3 + 2]);\n var position1 = viewer.scene.clampToHeight(pos3) || pos3;\n // let pos84 = await _this.cartesian3Towgs84(position1, viewer)\n // let height = 0\n // try {\n // let position2 = await Cesium.sampleTerrainMostDetailed(\n // viewer.scene.terrainProvider,\n // [Cesium.Cartographic.fromCartesian(pos3)]\n // )\n // height = position2[0].height\n // } catch (error) {\n // height = 0\n // }\n // if (height > pos84.alt) {\n // pos84.alt = height\n // }\n return position1;\n }\n var area = 0;\n for (var index = 0; index < indices.length; index += 3) {\n var pos0 = returnPosition(positions, indices[index]);\n var pos1 = returnPosition(positions, indices[index + 1]);\n var pos2 = returnPosition(positions, indices[index + 2]);\n // let entity = viewer.entities.add({\n // name: \"三角面\",\n // polygon: {\n // hierarchy: [pos0, pos1, pos2],\n // perPositionHeight: true,\n // material: Cesium.Color.fromRandom(),\n // outline: true,\n // outlineColor: Cesium.Color.BLACK,\n // },\n // });\n\n var v0 = Cesium.Cartesian3.subtract(pos0, pos1, new Cesium.Cartesian3());\n var v1 = Cesium.Cartesian3.subtract(pos2, pos1, new Cesium.Cartesian3());\n var cross = Cesium.Cartesian3.cross(v0, v1, v0);\n area = area + Cesium.Cartesian3.magnitude(cross) * 0.5;\n }\n return Number(area.toFixed(2));\n }\n\n /**\r\n * @desc 创建圆\r\n *@method createCircle\r\n * @param point {object} 圆心坐标\r\n * @param point.lng {number} 经度\r\n * @param point.lat {number} 纬度\r\n * @param radius {number} 半径 单位:米\r\n * @param [options]\r\n * @param [options.steps=360] {number} 段数\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"createCircle\",\n value: function createCircle(point) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n steps: 360\n };\n if (Number(radius) <= 0) {\n radius = 0.01;\n }\n var center = [Number(point.lng), Number(point.lat)];\n var coordinates = turf.circle(center, radius / 1000, options).geometry.coordinates[0];\n var positions = [];\n coordinates.forEach(function (item) {\n positions = positions.concat(item);\n });\n return positions;\n }\n\n /**\r\n * @desc 创建椭圆\r\n *@method createEllipse\r\n * @param point {object} 圆心坐标\r\n * @param point.lng {number} 经度\r\n * @param point.lat {number} 纬度\r\n * @param [options]\r\n * @param [options.granularity=0.1] {number} 椭圆上点之间的角度\r\n * @param [options.semiMinorAxis=10] {number} 短半轴长度 单位:米\r\n * @param [options.semiMajorAxis=20] {number} 长半轴长度 单位:米\r\n * @param [options.bearing=0] {number} 椭圆旋转角度 单位:米\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"createEllipse\",\n value: function createEllipse(point) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n granularity: 0.1,\n semiMinorAxis: 10,\n semiMajorAxis: 20,\n bearing: 0,\n height: 0\n };\n if (!options.granularity) {\n options.granularity = 0.1;\n }\n if (!options.height) {\n options.height = 0;\n }\n if (!options.semiMinorAxis) {\n options.semiMinorAxis = 0.00001;\n }\n if (!options.semiMajorAxis) {\n options.semiMajorAxis = 0.00001;\n }\n var ellipseGeometry = new Cesium.EllipseOutlineGeometry({\n center: Cesium.Cartesian3.fromDegrees(Number(point.lng), Number(point.lat)),\n semiMajorAxis: Number(options.semiMajorAxis),\n semiMinorAxis: Number(options.semiMinorAxis),\n height: Number(options.height),\n granularity: Cesium.Math.toRadians(options.granularity),\n rotation: Cesium.Math.toRadians(options.bearing)\n });\n var ellipse = Cesium.EllipseOutlineGeometry.createGeometry(ellipseGeometry);\n if (!ellipse || !ellipse.attributes || !ellipse.attributes.position) {\n return [];\n }\n var ellipsePositions = ellipse.attributes.position.values;\n var positions = [];\n for (var i = 0; i < ellipsePositions.length; i += 3) {\n var pos = new Cesium.Cartesian3(ellipsePositions[i], ellipsePositions[i + 1], ellipsePositions[i + 2]);\n positions.push(pos);\n }\n return positions;\n }\n\n /*计算2点的恒相线夹角*/\n }, {\n key: \"rhumbBearing\",\n value: function rhumbBearing(p1, p2) {\n var point1 = turf.point([p1.lng, p1.lat]);\n var point2 = turf.point([p2.lng, p2.lat]);\n return turf.rhumbBearing(point1, point2);\n }\n }, {\n key: \"computeCenter\",\n value: function computeCenter() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var arr = [];\n positions.forEach(function (item) {\n arr.push(turf.point([item.lng, item.lat]));\n });\n var features = turf.featureCollection(arr);\n var coordinates = turf.center(features).geometry.coordinates;\n return {\n lng: coordinates[0],\n lat: coordinates[1]\n };\n }\n\n //计算2点的中心点\n }, {\n key: \"computeMidpoint\",\n value: function computeMidpoint(point1, point2) {\n var p1 = turf.point([point1.lng, point1.lat]);\n var p2 = turf.point([point2.lng, point2.lat]);\n var center = turf.midpoint(p1, p2).geometry.coordinates;\n return {\n lng: center[0],\n lat: center[1]\n };\n }\n\n //计算\n }, {\n key: \"computeAttackArrow\",\n value: function computeAttackArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return this.computeArrow(positions, 0);\n }\n\n //计算钳击箭头\n }, {\n key: \"computePincerArrow\",\n value: function computePincerArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return this.computeArrow(positions);\n }\n\n //计算攻击箭头\n }, {\n key: \"computeArrow\",\n value: function computeArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n if (positions.length < 3) {\n return [];\n } else {\n var lnglatArr = [];\n // if(positions.every(pos => Number(pos.lng) >= 0) || positions.every(pos => Number(pos.lng) <= 0)) {\n // for (var i = 0; i < positions.length; i++) {\n // lnglatArr.push([positions[i].lng, positions[i].lat])\n // }\n // }\n // else {\n // for (var i = 0; i < positions.length; i++) {\n // if(positions[i].lng<0) {\n // lnglatArr.push([positions[i].lng+360, positions[i].lat])\n // }\n // else {\n // lnglatArr.push([positions[i].lng, positions[i].lat])\n // }\n // }\n // }\n for (var i = 0; i < positions.length; i++) {\n lnglatArr.push([positions[i].lng, positions[i].lat]);\n }\n var res;\n if (type) {\n res = xp.algorithm.doubleArrow(lnglatArr);\n } else {\n res = xp.algorithm.tailedAttackArrow(lnglatArr);\n }\n var index = JSON.stringify(res.polygonalPoint).indexOf('null');\n var returnData = [];\n if (index === -1) returnData = res.polygonalPoint;\n return returnData;\n }\n }\n\n // 计算集结地\n }, {\n key: \"computeAssemble\",\n value: function computeAssemble() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var is84 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (positions.length < 2) {\n return [];\n } else {\n var points = positions.length;\n var pnts = new Array();\n positions.forEach(function (item) {\n pnts.push([item.lng, item.lat]);\n });\n //console.log(\"pnts6666\",pnts);\n // pnts.push(tailPoint);\n // pnts.push(headerPoint);\n\n if (pnts.length === 2) {\n var _mid = P.PlotUtils.mid(pnts[0], pnts[1]);\n //let d = utils.MathDistance(pnts[0], mid) / 0.9\n var d = P.PlotUtils.distance(pnts[0], _mid) / 0.9;\n //console.log(\"d\",d);\n var pnt = P.PlotUtils.getThirdPoint(pnts[0], _mid, P.Constants.HALF_PI, d, true);\n pnts = [pnts[0], pnt, pnts[1]];\n //console.log(\"pnt\",pnt);\n //createPoint(Cesium.Cartesian3.fromDegrees(pnt[0], pnt[1]));\n }\n var mid = P.PlotUtils.mid(pnts[0], pnts[2]);\n pnts.push(mid, pnts[0], pnts[1]);\n var normals = [],\n pnt1 = undefined,\n pnt2 = undefined,\n pnt3 = undefined,\n result = [],\n result2 = [];\n for (var i = 0; i < pnts.length - 2; i++) {\n pnt1 = pnts[i];\n pnt2 = pnts[i + 1];\n pnt3 = pnts[i + 2];\n var normalPoints = P.PlotUtils.getBisectorNormals(0.4, pnt1, pnt2, pnt3);\n normals = normals.concat(normalPoints);\n }\n var count = normals.length;\n normals = [normals[count - 1]].concat(normals.slice(0, count - 1));\n for (var _i3 = 0; _i3 < pnts.length - 2; _i3++) {\n pnt1 = pnts[_i3];\n pnt2 = pnts[_i3 + 1];\n result = result.concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(pnt1));\n for (var t = 0; t <= P.Constants.FITTING_COUNT; t++) {\n var _pnt = P.PlotUtils.getCubicValue(t / P.Constants.FITTING_COUNT, pnt1, normals[_i3 * 2], normals[_i3 * 2 + 1], pnt2);\n result = result.concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(_pnt));\n }\n result = result.concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(pnt2));\n }\n if (is84) {\n return result;\n } else {\n return Cesium.Cartesian3.fromDegreesArray(result);\n }\n }\n }\n\n // 计算直线箭头\n }, {\n key: \"computeStraightArrow\",\n value: function computeStraightArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var is84 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (positions.length < 2) {\n return [];\n }\n var point1 = [positions[0].lng, positions[0].lat];\n var point2 = [positions[1].lng, positions[1].lat];\n if (positions[0].lng === positions[1].lng && positions[0].lat === positions[1].lat) {\n if (is84) {\n return [positions[0], positions[0], positions[0]];\n } else {\n var cartesian3 = Cesium.Cartesian3.fromDegrees(positions[0].lng, positions[0].lat);\n return [cartesian3, cartesian3, cartesian3];\n }\n }\n var lnglatArr = [];\n for (var i = 0; i < positions.length; i++) {\n lnglatArr.push([positions[i].lng, positions[i].lat]);\n }\n var res;\n res = xp.algorithm.fineArrow(point1, point2);\n if (is84) {\n var pos84 = [];\n for (var _i4 = 0; _i4 < res.length; _i4++) {\n var pos = this.cartesian3Towgs84(res[_i4], this.sdk.viewer);\n pos84.push(pos.lng, pos.lat);\n }\n return pos84;\n }\n return res;\n }\n }, {\n key: \"getMaterial\",\n value: function getMaterial() {\n var color = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '#2ab0c2';\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var entity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var newParam = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var material = '';\n var arr = {\n '7': 10,\n '8': 3,\n '9': 4,\n '10': 4,\n '11': 4,\n '12': 2\n };\n if (entity) {\n arr[type + ''] ? entity.polyline.width = entity.polyline.oriWidth + arr[type + ''] : entity.polyline.width = entity.polyline.oriWidth;\n }\n switch (Number(type)) {\n case 1:\n //虚线\n material = new Cesium.PolylineDashMaterialProperty({\n color: Cesium.Color.fromCssColorString(color),\n dashLength: 10 //短划线长度\n });\n break;\n case 2:\n //泛光\n material = new Cesium.PolylineGlowMaterialProperty({\n glowPower: 0.2,\n color: Cesium.Color.fromCssColorString(color)\n });\n break;\n case 3:\n //尾迹光线\n material = new Cesium.PolylineFlowMaterialProperty({\n color: color,\n speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n rotate: newParam.rotate\n });\n break;\n case 4:\n //多尾迹光线\n material = new Cesium.PolylineFlowMultMaterialProperty({\n color: color,\n speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n rotate: newParam.rotate\n });\n break;\n case 5: //普通流动虚线\n // material = new Cesium.FlowDashedLineFlowMaterialProperty({\n // color: color,\n // uType: 0,\n // speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n // // dashSize: newParam.dashSize,\n // space: newParam.space,\n // scale: 1.0\n // })\n // break\n case 6:\n //流动虚线2\n var that = this;\n var repeatX;\n material = new Cesium.FlowDashedLineFlowMaterialProperty({\n color: color,\n uType: type == 5 ? 0 : 1,\n speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n // dashSize: newParam.dashSize,\n space: newParam.space,\n scale: new Cesium.CallbackProperty(function () {\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var oriPositions = entity.polyline.positions.getValue();\n if (!Cesium.defined(oriPositions)) {\n return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < oriPositions.length - 1; ++i) {\n distance += Cesium.Cartesian3.distance(oriPositions[i], oriPositions[i + 1]);\n }\n //屏幕坐标\n var point1 = new Cesium.Cartesian2(0, that.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(that.sdk.viewer.canvas.clientWidth / 2, that.sdk.viewer.canvas.clientHeight);\n var cartesian1 = that.sdk.viewer.scene.pickPosition(point1);\n var cartesian2 = that.sdk.viewer.scene.pickPosition(point2);\n if (cartesian1 && cartesian2) {\n var distance2 = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n repeatX = distance2 * 2 / distance;\n }\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n var _oriPositions = sdk3dEntity.polyline.positions.getValue();\n if (!Cesium.defined(_oriPositions)) {\n return 1.0;\n }\n var _distance3 = 0;\n for (var _i5 = 0; _i5 < _oriPositions.length - 1; ++_i5) {\n _distance3 += Cesium.Cartesian3.distance(_oriPositions[_i5], _oriPositions[_i5 + 1]);\n }\n //屏幕坐标\n var _point = new Cesium.Cartesian2(0, sdk3d.viewer.canvas.clientHeight);\n var _point2 = new Cesium.Cartesian2(sdk3d.viewer.canvas.clientWidth / 2, sdk3d.viewer.canvas.clientHeight);\n var _cartesian = sdk3d.viewer.scene.pickPosition(_point);\n var _cartesian2 = sdk3d.viewer.scene.pickPosition(_point2);\n if (_cartesian && _cartesian2) {\n var _distance4 = Cesium.Cartesian3.distance(_cartesian, _cartesian2);\n repeatX = _distance4 * 2 / _distance3;\n }\n return repeatX;\n }\n })\n });\n break;\n case 7: //流动箭头1\n case 8: //流动箭头2\n case 9: //流动箭头3\n case 10: //流动箭头4\n case 11: //流动箭头5\n case 12:\n //流动箭头6\n var param = {\n color: color,\n image: this.getSourceRootPath() + \"/img/arrow/\".concat(type - 6, \".png\"),\n space: newParam.space,\n speed: newParam.speed\n };\n param.speed = newParam.rotate ? param.speed : 0 - param.speed;\n this.getFlowTexture(this, param, entity);\n break;\n default:\n material = Cesium.Color.fromCssColorString(color);\n break;\n }\n return material;\n }\n }, {\n key: \"getFlowTexture\",\n value: function getFlowTexture(that, options, entity) {\n var canvasEle = document.createElement('canvas');\n var ctx = canvasEle.getContext('2d');\n var myImg = new Image();\n // myImg.src = that.getSourceRootPath() + '/img/arrow/1.png'\n myImg.src = options.image;\n myImg.onload = function () {\n options.space = Math.max(0.1, options.space);\n if (options.speed > 0 || options.speed == 0) {\n canvasEle.width = myImg.width * (options.space + 1);\n canvasEle.height = myImg.height;\n ctx.drawImage(myImg, myImg.width * (options.space / 2), 0);\n } else {\n ctx.clearRect(0, 0, canvasEle.width, canvasEle.height);\n canvasEle.width = myImg.width * (options.space + 1);\n canvasEle.height = myImg.height;\n ctx.save(); // 保存当前状态\n ctx.translate(canvasEle.width / 2, canvasEle.height / 2); // 移动原点至中心\n ctx.rotate(Math.PI); // (弧度制)\n ctx.translate(-canvasEle.width / 2, -canvasEle.height / 2); // 移回原点\n ctx.drawImage(myImg, myImg.width * (options.space / 2), 0);\n ctx.restore(); // 恢复状态\n }\n\n // let repeat = getRepeat()\n // }, false)\n // entity.polyline.material.oriRepeat = that.getSceenLine(entity, options, canvasEle)\n // entity.polyline.material.oriSpeed = undefined\n var beforeSpeed = 0,\n repeat = 0;\n entity.polyline.material = new Cesium.LineTextureMaterialProperty({\n color: options.color,\n image: canvasEle,\n speed: options.speed,\n repeat: new Cesium.CallbackProperty(function () {\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var positionProperty = entity.polyline.positions;\n var positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime);\n if (!Cesium.defined(positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < positions.length - 1; ++i) {\n // if (that.sdk.viewer.scene.mode===Cesium.SceneMode.SCENE2D){}\n distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]);\n }\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = that.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = that.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = that.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n var result;\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n var speed = repeatX / entity.polyline.oriRepeat;\n entity.polyline.oriSpeed = speed;\n entity.polyline.oriRepeatX = repeatX;\n // } else {\n // entity.polyline.material.oriRepeat = repeatX\n // }\n beforeSpeed = speed;\n repeat = repeatX;\n result = new Cesium.Cartesian2(repeatX, speed || 1.0);\n } else {\n result = new Cesium.Cartesian2(repeat || entity.polyline.oriRepeatX, beforeSpeed || entity.polyline.oriSpeed);\n }\n return result;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n var _positionProperty = sdk3dEntity.polyline.positions;\n var _positions = _positionProperty.getValue(sdk3d.viewer.clock.currentTime);\n if (!Cesium.defined(_positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var _distance5 = 0;\n for (var _i6 = 0; _i6 < _positions.length - 1; ++_i6) {\n // if (that.sdk.viewer.scene.mode===Cesium.SceneMode.SCENE2D){}\n _distance5 += Cesium.Cartesian3.distance(_positions[_i6], _positions[_i6 + 1]);\n }\n var _repeatX = _distance5 / sdk3dEntity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var _cameraHeight = sdk3d.viewer.camera.positionCartographic.height;\n var _boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var _drawingBufferWidth = sdk3d.viewer.canvas.clientWidth;\n var _drawingBufferHeight = sdk3d.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var _groundResolution = sdk3d.viewer.scene.camera.getPixelSize(_boundingSphere, _drawingBufferWidth, _drawingBufferHeight);\n var _result;\n if (_groundResolution > 700) {\n _repeatX *= _groundResolution / _cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n var _speed = _repeatX / sdk3dEntity.polyline.oriRepeat;\n sdk3dEntity.polyline.oriSpeed = _speed;\n sdk3dEntity.polyline.oriRepeatX = _repeatX;\n // } else {\n // entity.polyline.material.oriRepeat = repeatX\n // }\n beforeSpeed = _speed;\n repeat = _repeatX;\n _result = new Cesium.Cartesian2(_repeatX, _speed || 1.0);\n } else {\n _result = new Cesium.Cartesian2(repeat || sdk3dEntity.polyline.oriRepeatX, beforeSpeed || sdk3dEntity.polyline.oriSpeed);\n }\n return _result;\n }\n\n // return repeatX;\n })\n });\n var oriRepeat = that.getSceenLine(entity, options, canvasEle);\n oriRepeat && (entity.polyline.oriRepeat = oriRepeat);\n };\n }\n /**获取当前满屏横线速度 */\n }, {\n key: \"getSceenLine\",\n value: function getSceenLine(entity, options, canvasEle) {\n var point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight);\n // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1)\n // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2)\n var ray = this.sdk.viewer.camera.getPickRay(point1);\n var cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n var ray2 = this.sdk.viewer.camera.getPickRay(point2);\n var cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n if (cartesian1 && cartesian2) {\n var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = this.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = this.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = this.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = this.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n // repeatX *= groundResolution / cameraHeight / ((myImg.width / myImg.height * 5) + 1);\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n } else {\n repeatX = undefined;\n }\n if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id);\n return sdk3dEntity.polyline.oriRepeatX;\n }\n }\n }\n\n /*创建直箭头图片*/\n }, {\n key: \"create_arrow1_picture\",\n value: function create_arrow1_picture(color) {\n var canvas = new fabric.Canvas('canvas');\n canvas.width = 150;\n canvas.height = 75;\n var w_offset = 35;\n var h_offset = 20;\n var fill = color;\n var polygon = new fabric.Polygon([{\n x: canvas.width,\n y: canvas.height / 2\n },\n //箭头右边顶点\n {\n x: canvas.width - w_offset,\n y: canvas.height\n },\n //顺时针\n {\n x: canvas.width - w_offset,\n y: canvas.height - h_offset\n },\n //\n {\n x: canvas.width / 2,\n y: canvas.height - h_offset\n },\n //\n {\n x: canvas.width / 2,\n y: h_offset\n },\n //\n {\n x: canvas.width - w_offset,\n y: h_offset\n },\n //\n {\n x: canvas.width - w_offset,\n y: 0\n } //\n ], {\n fill: fill\n });\n canvas.add(polygon);\n return canvas.toDataURL();\n }\n\n /*创建箭头图片*/\n }, {\n key: \"create_arrow2_picture\",\n value: function create_arrow2_picture(color) {\n var canvas = new fabric.Canvas('canvas');\n canvas.width = 75;\n canvas.height = 75;\n var w_offset1 = 35;\n var w_offset2 = 40;\n var fill = color;\n var polygon = new fabric.Polygon([{\n x: canvas.width,\n y: canvas.height / 2\n }, {\n x: canvas.width - w_offset1,\n y: canvas.height\n }, {\n x: canvas.width - w_offset1 - w_offset2,\n y: canvas.height\n }, {\n x: canvas.width - w_offset2,\n y: canvas.height / 2\n }, {\n x: canvas.width - w_offset1 - w_offset2,\n y: 0\n }, {\n x: canvas.width - w_offset1,\n y: 0\n }], {\n fill: fill\n });\n canvas.add(polygon);\n return canvas.toDataURL();\n }\n }, {\n key: \"sampleHeightMostDetailed\",\n value: function sampleHeightMostDetailed(positions) {\n var cartesians = [];\n positions.forEach(function (item) {\n cartesians.push(new Cesium.Cartographic.fromDegrees(item.lng, item.lat));\n });\n return this.sdk.viewer.scene.sampleHeightMostDetailed(cartesians);\n }\n }, {\n key: \"flyHome\",\n value: function flyHome() {\n var duration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 3;\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_11__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_11__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_11__[\"closeViewFollow\"])(this.sdk);\n if (this.sdk.viewer.CAMERA_DEFAULT_VIEW_RECTANGLE) {\n var destination = this.sdk.viewer.CAMERA_DEFAULT_VIEW_RECTANGLE.destination;\n var orientation = this.sdk.viewer.CAMERA_DEFAULT_VIEW_RECTANGLE.orientation;\n this.sdk.viewer.camera.flyTo({\n destination: Cesium.Cartesian3.fromDegrees(destination.lng, destination.lat, destination.alt),\n orientation: {\n heading: Cesium.Math.toRadians(orientation.heading || 0),\n pitch: Cesium.Math.toRadians(orientation.pitch || 0),\n roll: Cesium.Math.toRadians(orientation.roll || 0)\n },\n duration: duration\n });\n } else {\n this.sdk.viewer.camera.flyHome(duration);\n }\n }\n\n /**\r\n * @description 设置拾取操作启停\r\n * @method setPickStatus\r\n * @param [status=true] {boolean}\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"setPickStatus\",\n value: function setPickStatus() {\n var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n } // YJ.getEarth().interaction.picking.enabled = status\n\n /**\r\n * @description 创建点缓冲区 返回缓冲区坐标\r\n * @method create_point_buffer\r\n * @param point {object} 坐标参数\r\n * @param [radius=5] {number} 缓冲距离 (单位:米)\r\n * @param option\r\n * @param point.lng {number} 经度\r\n * @param point.lat {number} 纬度\r\n * @memberOf Tools\r\n * @returns {Array} 返回缓冲区坐标数组\r\n */\n }, {\n key: \"create_point_buffer\",\n value: function create_point_buffer(point) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n var option = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n steps: 10\n };\n var p = turf.point([Number(point.lng), Number(point.lat)]);\n var buffered = turf.buffer(p, Number(radius) / 1000, option);\n return buffered.geometry.coordinates;\n }\n\n /**\r\n * @description 创建线缓冲区 返回缓冲区坐标\r\n * @method create_line_buffer\r\n * @param points {Array.} 坐标参数\r\n * @param [radius=5] {number} 缓冲距离 (单位:米)\r\n * @memberOf Tools\r\n * @returns {Array} 返回缓冲区坐标数组\r\n * @example let points = [{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"}]\r\n * let radius = 10\r\n * let area_buffer = sdk.create_line_buffer(points,radius)\r\n * */\n }, {\n key: \"create_line_buffer\",\n value: function create_line_buffer(points) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n if (points.length === 1) {\n return this.create_point_buffer(points[0], radius);\n } else if (points.length === 0) {\n return false;\n } else {\n var arr = [];\n points.forEach(function (point) {\n arr.push([Number(point.lng), Number(point.lat)]);\n });\n var line = turf.lineString(arr);\n var buffered = turf.buffer(line, Number(radius) / 1000);\n return buffered.geometry.coordinates;\n }\n }\n\n /**\r\n * @description 创建面缓冲区 返回缓冲区坐标\r\n * @method create_area_buffer\r\n * @param points {Array.} 坐标参数\r\n * @param [radius=5] {number} 缓冲距离 (单位:米)\r\n * @memberOf Tools\r\n * @returns {Array} 返回缓冲区坐标数组\r\n * @example let points = [{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"}]\r\n * let radius = 10\r\n * let area_buffer = sdk.create_area_buffer(points,radius)\r\n * */\n }, {\n key: \"create_area_buffer\",\n value: function create_area_buffer(points) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n if (points.length === 1) {\n return this.create_point_buffer(points[0], radius);\n } else if (points.length === 0) {\n return false;\n } else if (points.length === 2) {\n return this.create_line_buffer(points, radius);\n } else {\n var arr = [];\n points.forEach(function (point) {\n arr.push([Number(point.lng), Number(point.lat)]);\n });\n arr.push(arr[0]);\n var poly = turf.polygon([arr]);\n var buffered = turf.buffer(poly, Number(radius) / 1000);\n return buffered.geometry.coordinates;\n }\n }\n\n /**\r\n * @desc 计算多点范围\r\n * @method cal_envelope\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"cal_envelope\",\n value: function cal_envelope() {\n var points = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n if (points.length < 2) {\n console.error('坐标数量不能少于2个');\n } else {\n var arr = [];\n points.forEach(function (p) {\n arr.push(turf.point([p.lng, p.lat]));\n });\n var features = turf.featureCollection(arr);\n return turf.envelope(features).geometry.coordinates[0];\n }\n }\n\n /**\r\n * @desc 按指定距离分段\r\n * @method chunkLine\r\n * @param positions {Array}\r\n * @param meters\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"chunkLine\",\n value: function chunkLine() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var meters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n if (positions.length < 2) {\n return [];\n } else {\n var arr = [];\n positions.forEach(function (it) {\n arr.push([it.lng, it.lat]);\n });\n var line = turf.lineString(arr);\n var chunk = turf.lineChunk(line, meters / 1000);\n var __map = new Map();\n chunk.features.forEach(function (value) {\n value.geometry.coordinates.forEach(function (value1) {\n var key = value1.join(',');\n var val = {\n lng: value1[0],\n lat: value1[1]\n };\n __map.set(key, val);\n });\n });\n return chunk.features;\n }\n }\n\n /**\r\n * @desc 标注以sinx的半个周期的形式弹跳\r\n * */\n }, {\n key: \"billboardAnimation\",\n value: function billboardAnimation(viewer, _ref) {\n var id = _ref.id,\n _ref$offset = _ref.offset,\n offset = _ref$offset === void 0 ? 10 : _ref$offset,\n _ref$times = _ref.times,\n times = _ref$times === void 0 ? 3 : _ref$times;\n var entity = viewer.entities.getById(id);\n if (entity) {\n var pi = Math.PI;\n var tt = 60;\n var of = pi / tt;\n var h = 0;\n var src_p = this.cartesian3Towgs84(entity.position.getValue(), viewer);\n // let height = src_p.alt\n // entity.position = new Cesium.CallbackProperty(() => {\n // let height = offset * Math.sin(h) + src_p.alt\n // h += of\n // return Cesium.Cartesian3.fromDegrees(src_p.lng, src_p.lat, height)\n // }, false)\n var ti = setInterval(function () {\n h += of;\n var height = offset * Math.sin(h) + src_p.alt;\n if (h > pi) h = 0;\n entity.position = Cesium.Cartesian3.fromDegrees(src_p.lng, src_p.lat, height);\n }, 30);\n setTimeout(function () {\n clearInterval(ti);\n entity.position = Cesium.Cartesian3.fromDegrees(src_p.lng, src_p.lat, src_p.alt);\n }, 3000);\n }\n }\n\n /**@desc 绘制扇形\r\n * @method sector\r\n * @memberOf Tools*/\n }, {\n key: \"calSector\",\n value: function calSector() {\n var center = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100;\n var bearing1 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 25;\n var bearing2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 45;\n var steps = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 360;\n var is84 = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n var c = turf.point([center.lng, center.lat]);\n var coordinates = turf.sector(c, radius / 1000, bearing1, bearing2, {\n steps: steps\n }).geometry.coordinates;\n var positions = [];\n coordinates.forEach(function (array) {\n array.forEach(function (item) {\n var pos;\n if (is84) {\n pos = {\n lng: item[0],\n lat: item[1]\n };\n } else {\n pos = Cesium.Cartesian3.fromDegrees(item[0], item[1]);\n }\n positions.push(pos);\n });\n });\n return positions;\n }\n\n /**\r\n * @desc获取紧贴高度\r\n * @param position 坐标\r\n */\n }, {\n key: \"getClampToHeight\",\n value: (function () {\n var _getClampToHeight = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee3(position) {\n var objectsToExclude,\n pos3,\n position1,\n height1,\n height2,\n position2,\n _args3 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n objectsToExclude = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : [];\n if (!(!this.sdk || !this.sdk.viewer)) {\n _context3.next = 3;\n break;\n }\n return _context3.abrupt(\"return\", 0);\n case 3:\n pos3 = new Cesium.Cartesian3.fromDegrees(position.lng, position.lat);\n _context3.prev = 4;\n _context3.next = 7;\n return this.sdk.viewer.scene.clampToHeight(pos3, objectsToExclude);\n case 7:\n _context3.t0 = _context3.sent;\n if (_context3.t0) {\n _context3.next = 10;\n break;\n }\n _context3.t0 = pos3;\n case 10:\n position1 = _context3.t0;\n _context3.next = 16;\n break;\n case 13:\n _context3.prev = 13;\n _context3.t1 = _context3[\"catch\"](4);\n position1 = pos3;\n case 16:\n _context3.next = 18;\n return this.cartesian3Towgs84(position1, this.sdk.viewer).alt;\n case 18:\n height1 = _context3.sent;\n height2 = 0;\n _context3.prev = 20;\n if (!this.sdk.viewer.scene.terrainProvider.availability) {\n _context3.next = 26;\n break;\n }\n _context3.next = 24;\n return Cesium.sampleTerrainMostDetailed(this.sdk.viewer.scene.terrainProvider, [Cesium.Cartographic.fromDegrees(position.lng, position.lat)]);\n case 24:\n position2 = _context3.sent;\n position2[0].height && (height2 = position2[0].height);\n case 26:\n _context3.next = 31;\n break;\n case 28:\n _context3.prev = 28;\n _context3.t2 = _context3[\"catch\"](20);\n height2 = 0;\n case 31:\n if (!(height1 > height2)) {\n _context3.next = 35;\n break;\n }\n return _context3.abrupt(\"return\", Number(height1.toFixed(2)));\n case 35:\n return _context3.abrupt(\"return\", Number(height2.toFixed(2)));\n case 36:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, this, [[4, 13], [20, 28]]);\n }));\n function getClampToHeight(_x3) {\n return _getClampToHeight.apply(this, arguments);\n }\n return getClampToHeight;\n }()\n /**\r\n * @desc 深拷贝对象\r\n * */\n )\n }, {\n key: \"deepCopyObj\",\n value: function deepCopyObj(obj) {\n var newobj = null;\n // 处理数组 - 使用原生Array构造函数创建新数组\n if (Array.isArray(obj)) {\n newobj = [];\n // 只拷贝数组元素,不拷贝可能存在的扩展方法\n for (var i = 0; i < obj.length; i++) {\n newobj[i] = this.deepCopyObj(obj[i]);\n }\n return newobj;\n }\n\n // 处理对象\n else if (obj && _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(obj) === 'object') {\n newobj = {};\n for (var _i7 in obj) {\n // 排除指定属性和方法属性\n if (_i7 !== 'earth' && _i7 !== 'Dialog' && typeof obj[_i7] !== 'function') {\n newobj[_i7] = this.deepCopyObj(obj[_i7]);\n }\n }\n return newobj;\n } else newobj = obj;\n return newobj;\n }\n\n /**\r\n * @desc 度分秒转换\r\n * */\n }, {\n key: \"projConvert\",\n value: function projConvert() {\n var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var closeCallBack = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n if (status) {\n Object(_projConvert__WEBPACK_IMPORTED_MODULE_9__[\"open\"])(this.sdk, closeCallBack);\n } else {\n Object(_projConvert__WEBPACK_IMPORTED_MODULE_9__[\"close\"])();\n }\n }\n /**\r\n * @desc 投影转换\r\n * */\n }, {\n key: \"projectionConvert\",\n value: function projectionConvert() {\n var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var closeCallBack = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n if (status) {\n Object(_projectionConvert__WEBPACK_IMPORTED_MODULE_10__[\"open\"])(this.sdk, closeCallBack);\n } else {\n Object(_projectionConvert__WEBPACK_IMPORTED_MODULE_10__[\"close\"])();\n }\n }\n\n /**\r\n * @desc 导出excel\r\n */\n // 导出属性\n }, {\n key: \"exportExcel\",\n value: function exportExcel(data) {\n var label = '';\n for (var key in data[0]) {\n label += \"\".concat(key, \"\");\n }\n label += '';\n var url = 'data:application/vnd.ms-excel;base64,',\n tmplWorkbookXML = '' + 'Axel Richter{created}' + '' + '' + '' + '' + '{worksheets}',\n tmplWorksheetXML = '{rows}
',\n tmplCellXML = '{data}',\n base64 = function base64(s) {\n return window.btoa(unescape(encodeURIComponent(s)));\n },\n format = function format(s, c) {\n return s.replace(/{(\\w+)}/g, function (m, p) {\n return c[p];\n });\n };\n var ctx = \"\";\n var workbookXML = \"\";\n var worksheetsXML = \"\";\n var rowsXML = \"\";\n var pil = 0;\n for (var i = 0; i < data.length; i++) {\n if (i == 0) {\n rowsXML += label;\n }\n rowsXML += '';\n for (var _key in data[i]) {\n ctx = {\n nameType: 'String',\n data: data[i][_key]\n };\n rowsXML += format(tmplCellXML, ctx);\n }\n rowsXML += '';\n if (i > 0 && i / 60000 % 1 === 0) {\n pil++;\n ctx = {\n rows: rowsXML,\n nameWS: 'Sheet' + i\n };\n worksheetsXML += format(tmplWorksheetXML, ctx);\n rowsXML = \"\";\n rowsXML += label;\n }\n }\n ctx = {\n rows: rowsXML,\n nameWS: 'Sheet'\n };\n worksheetsXML += format(tmplWorksheetXML, ctx);\n rowsXML = \"\";\n ctx = {\n created: new Date().getTime(),\n worksheets: worksheetsXML\n };\n workbookXML = format(tmplWorkbookXML, ctx);\n var link = document.createElement(\"A\");\n link.href = url + base64(workbookXML);\n link.download = \"矢量数据导出.xls\";\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n /**\r\n * @desc Gzip解压\r\n */\n }, {\n key: \"decompressGzip\",\n value: function decompressGzip(compressedData) {\n var decompressedData = pako.inflate(compressedData);\n // 将解压缩后的数据转换为字符串\n var decompressedString = new TextDecoder().decode(decompressedData);\n return decompressedString;\n }\n\n /**\r\n * @desc cmyk转rbg\r\n * @param {*} color\r\n * @returns\r\n */\n }, {\n key: \"cmykToRgb\",\n value: function cmykToRgb(color) {\n var c = color.c,\n m = color.m,\n y = color.y,\n k = color.k;\n var rgb = {\n r: 0,\n g: 0,\n b: 0\n };\n rgb.c = c / 100;\n rgb.m = m / 100;\n rgb.y = y / 100;\n rgb.k = k / 100;\n rgb.r = 1 - Math.min(1, rgb.c * (1 - rgb.k) + rgb.k);\n rgb.g = 1 - Math.min(1, rgb.m * (1 - rgb.k) + rgb.k);\n rgb.b = 1 - Math.min(1, rgb.y * (1 - rgb.k) + rgb.k);\n rgb.r = Math.round(rgb.r * 255);\n rgb.g = Math.round(rgb.g * 255);\n rgb.b = Math.round(rgb.b * 255);\n return \"rgb(\".concat(rgb.r, \", \").concat(rgb.g, \", \").concat(rgb.b, \")\");\n }\n }, {\n key: \"convertPxToRem\",\n value: function convertPxToRem(sdk, selector) {\n var htmlFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize);\n var list = [];\n var elementList = [];\n if (selector) {\n list = document.getElementById(sdk.div_id).querySelectorAll(selector);\n for (var i = 0; i < list.length; i++) {\n var _elementList;\n (_elementList = elementList).push.apply(_elementList, [list[i]].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(list[i].querySelectorAll('*'))));\n }\n } else {\n elementList = document.getElementById(sdk.div_id).querySelectorAll('*');\n }\n elementList.forEach(function (element) {\n var style = element.style;\n var rules = Array.from(style).filter(function (prop) {\n return typeof prop === 'string' && prop.endsWith('px');\n });\n rules.forEach(function (prop) {\n var pxValue = parseFloat(style[prop]);\n var remValue = pxValue / htmlFontSize;\n element.style[prop] = \"\".concat(remValue, \"rem\");\n });\n });\n }\n }, {\n key: \"isConvex\",\n value: function isConvex() {\n var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var length = arr.length;\n var pre = 0,\n curr = 0;\n for (var i = 0; i < length; ++i) {\n var dx1 = arr[(i + 1) % length].lng - arr[i].lng;\n var dx2 = arr[(i + 2) % length].lng - arr[(i + 1) % length].lng;\n var dy1 = arr[(i + 1) % length].lat - arr[i].lat;\n var dy2 = arr[(i + 2) % length].lat - arr[(i + 1) % length].lat;\n curr = dx1 * dy2 - dx2 * dy1;\n if (curr != 0) {\n if (curr > 0 && pre < 0 || curr < 0 && pre > 0) return false;else pre = curr;\n }\n }\n return true;\n }\n }, {\n key: \"getDateTimeString\",\n value: function getDateTimeString() {\n // 创建一个表示当前时间的 Date 对象\n var now = new Date();\n // 获取年份\n var year = now.getFullYear();\n // 获取月份(从 0 开始,所以要加 1),并将其转换为两位字符串,不足两位在前面补零\n var month = String(now.getMonth() + 1).padStart(2, '0');\n // 获取日期,并将其转换为两位字符串,不足两位在前面补零\n var day = String(now.getDate()).padStart(2, '0');\n // 获取小时,并将其转换为两位字符串,不足两位在前面补零\n var hours = String(now.getHours()).padStart(2, '0');\n // 获取分钟,并将其转换为两位字符串,不足两位在前面补零\n var minutes = String(now.getMinutes()).padStart(2, '0');\n // 获取秒,并将其转换为两位字符串,不足两位在前面补零\n var seconds = String(now.getSeconds()).padStart(2, '0');\n // 获取毫秒,并将其转换为三位字符串,不足三位在前面补零\n var milliseconds = String(now.getMilliseconds()).padStart(3, '0');\n // 将年、月、日、时、分、秒、毫秒拼接成所需的字符串\n return \"\".concat(year).concat(month).concat(day).concat(hours).concat(minutes).concat(seconds).concat(milliseconds);\n }\n }, {\n key: \"replaceHost\",\n value: function replaceHost(url, host) {\n var newUrl = url;\n if (!url || !host) {\n return url;\n }\n try {\n if (!url.startsWith(\"http\")) {\n //说明是本地的json,在磁盘中存在的\n if (!url.includes(\":\")) {\n if (this.options.host) {\n var o = new URL(url, this.options.host);\n newUrl = o.href;\n }\n }\n return newUrl;\n } else {\n // 移除可能的用户名:密码前缀\n var authRegex = /^[^@]+@/;\n if (authRegex.test(url)) {\n url = url.replace(authRegex, '');\n }\n\n // 添加协议前缀(如果没有)\n if (!/^[a-z]+:\\/\\//i.test(url)) {\n url = 'http://' + url;\n }\n var parsedUrl = new URL(url);\n var parsedUrl2 = new URL(host);\n var hostname = parsedUrl.hostname;\n var port = parsedUrl.port;\n\n // 处理IPv6地址(如果有括号)\n if (hostname.startsWith('[') && hostname.endsWith(']')) {\n hostname = hostname.slice(1, -1);\n }\n if ((hostname === 'localhost' || hostname === '127.0.0.1') && parseInt(port, 10) !== 55110) {\n parsedUrl.port = parsedUrl2.port;\n parsedUrl.protocol = parsedUrl2.protocol;\n newUrl = parsedUrl.toString();\n }\n return newUrl;\n }\n } catch (error) {\n return newUrl;\n }\n }\n }, {\n key: \"message\",\n value: function message() {\n var option = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var type = option.type || 'success';\n var text = option.text || '';\n var duration = option.duration || 1500;\n var message = document.getElementById('YJ-custom-message');\n if (message) {\n document.body.removeChild(message);\n }\n message = document.createElement('div');\n message.id = 'YJ-custom-message';\n if (type == 'success') {\n message.innerHTML = \"\\n \".concat(text, \"\\n \");\n } else if (type == 'warning') {\n message.innerHTML = \"\\n \".concat(text, \"\\n \");\n }\n document.body.appendChild(message);\n message.classList.add(type);\n }\n }], [{\n key: \"_md5\",\n value: function _md5(text) {\n return js_md5__WEBPACK_IMPORTED_MODULE_7___default()(text).toUpperCase();\n }\n }]);\n}();\n/* harmony default export */ __webpack_exports__[\"default\"] = (Tools);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvVG9vbHMvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVG9vbHMvaW5kZXguanM/MTNjZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQG5hbWU6IGluZGV4XHJcbiAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3JcclxuICogQGRhdGU6IDIwMjItMDYtMDkgMTY6NDZcclxuICogQGRlc2NyaXB0aW9u77yaaW5kZXhcclxuICogQHVwZGF0ZTogMjAyMi0wNi0wOSAxNjo0NlxyXG4gKi9cclxuaW1wb3J0IG1kNSBmcm9tICdqcy1tZDUnXHJcbmltcG9ydCB7IFByb2ogfSBmcm9tICcuL3Byb2onXHJcbmltcG9ydCB7IG9wZW4gYXMgcHJvakNvbnZlcnRPcGVuLCBjbG9zZSBhcyBwcm9qQ29udmVydENsb3NlIH0gZnJvbSAnLi9wcm9qQ29udmVydCdcclxuaW1wb3J0IHsgb3BlbiBhcyBwcm9qZWN0aW9uQ29udmVydE9wZW4sIGNsb3NlIGFzIHByb2plY3Rpb25Db252ZXJ0Q2xvc2UgfSBmcm9tICcuL3Byb2plY3Rpb25Db252ZXJ0J1xyXG5pbXBvcnQgeyBzZXRBY3RpdmVWaWV3ZXIsIGNsb3NlUm90YXRlQXJvdW5kLCBjbG9zZVZpZXdGb2xsb3cgfSBmcm9tICcuLi9HbG9iYWwvZ2xvYmFsJ1xyXG5pbXBvcnQgRmxvd1BpY3R1cmVNYXRlcmlhbFByb3BlcnR5IGZyb20gJy4uL09iai9NYXRlcmFpbC9GbG93UGljdHVyZU1hdGVyaWFsUHJvcGVydHknXHJcbmltcG9ydCB7IHN5bmNEYXRhLCBnZXQzRFZpZXcgfSBmcm9tICcuLi9HbG9iYWwvTXVsdGlWaWV3cG9ydE1vZGUnXHJcblxyXG5jbGFzcyBUb29scyB7XHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQGRlc2Mg5bel5YW357G7XHJcbiAgICogKi9cclxuICBjb25zdHJ1Y3RvcihzZGssIG9wdGlvbnMpIHtcclxuICAgIHRoaXMuc2RrID0gc2RrXHJcbiAgICBpZiAodGhpcy5zZGspIHtcclxuICAgICAgdGhpcy5uYW1lX21hcCA9IHRoaXMuc2RrLnByb2oubmFtZV9tYXBcclxuICAgICAgdGhpcy5lcHNnX21hcCA9IHRoaXMuc2RrLnByb2ouZXBzZ19tYXBcclxuICAgICAgdGhpcy5jb252ZXJ0ID0gdGhpcy5zZGsucHJvai5jb252ZXJ0XHJcbiAgICAgIHRoaXMuZ2V0QWxsUHJvamVjdGlvbiA9IHRoaXMuc2RrLnByb2ouZ2V0QWxsUHJvamVjdGlvblxyXG4gICAgICB0aGlzLnByb2plY3Rpb25Jc0V4aXN0cyA9IHRoaXMuc2RrLnByb2oucHJvamVjdGlvbklzRXhpc3RzXHJcbiAgICAgIHRoaXMuZGVncmVlc1RvRE1TID0gdGhpcy5zZGsucHJvai5kZWdyZWVzVG9ETVNcclxuICAgICAgdGhpcy5kbXNUb0RlY2ltYWwgPSB0aGlzLnNkay5wcm9qLmRtc1RvRGVjaW1hbFxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucyA9IHsgLi4ub3B0aW9ucyB9XHJcbiAgfVxyXG5cclxuICBnZXQgUE9TVCgpIHtcclxuICAgIHJldHVybiAnUE9TVCdcclxuICB9XHJcblxyXG4gIGdldCBHRVQoKSB7XHJcbiAgICByZXR1cm4gJ0dFVCdcclxuICB9XHJcblxyXG5cclxuICBzdGF0aWMgX21kNSh0ZXh0KSB7XHJcbiAgICByZXR1cm4gbWQ1KHRleHQpLnRvVXBwZXJDYXNlKClcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24g5bCG6KeS5bqm6L2s5o2i5Li65byn5bqmXHJcbiAgICogQG1ldGhvZCBkZWdyZWVzVG9SYWRpYW5zXHJcbiAgICogQHBhcmFtIGRlZ3JlZXMge251bWJlcn0g5byn5bqm5Yi2XHJcbiAgICogQHJldHVybiByYWRpYW5zIHtudW1iZXJ9XHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcbiAgICogQGV4YW1wbGUgbGV0IHJhZGlhbnMgPSB0b29sLmRlZ3JlZXNUb1JhZGlhbnMoMjApXHJcbiAgICogKi9cclxuICBkZWdyZWVzVG9SYWRpYW5zKGRlZ3JlZXMpIHtcclxuICAgIHJldHVybiB0dXJmLmRlZ3JlZXNUb1JhZGlhbnMoTnVtYmVyKGRlZ3JlZXMpKSAvLyAxLjA0NzE5NzU1MTE5NjU5NzZcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDlsIblvKfluqbovazmjaLkuLrop5LluqZcclxuICAgKiBAbWV0aG9kIHJhZGlhbnNUb0RlZ3JlZXNcclxuICAgKiBAcGFyYW0gcmFkaWFucyB7bnVtYmVyfSDlvKfluqbliLZcclxuICAgKiBAcmV0dXJuIGRlZ3JlZXMge251bWJlcn1cclxuICAgKiBAbWVtYmVyT2YgVG9vbHNcclxuXHJcbiAgICogQGV4YW1wbGUgbGV0IGRlZ3JlZXMgPSB0b29sLnJhZGlhbnNUb0RlZ3JlZXMoMilcclxuICAgKiAqL1xyXG4gIHJhZGlhbnNUb0RlZ3JlZXMocmFkaWFucykge1xyXG4gICAgcmV0dXJuIHR1cmYucmFkaWFuc1RvRGVncmVlcyhOdW1iZXIocmFkaWFucykpIC8vIDEuMDQ3MTk3NTUxMTk2NTk3NlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg6ZqP5py65a2X56ym5LiyXHJcbiAgICogQGZ1bmN0aW9uIHJhbmRvbVN0cmluZ1xyXG4gICAqIEBtZW1iZXJPZiBleHRyYVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZT0zMl0g5a2X56ym5Liy6ZW/5bqmXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gc3RyIOWtl+espuS4slxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqIEBleGFtcGxlIGxldCBzdHJpbmdzPXRvb2wucmFuZG9tU3RyaW5nKClcclxuICAgKiAqL1xyXG4gIHJhbmRvbVN0cmluZyhlKSB7XHJcbiAgICAvKiAgICBlID0gZSB8fCAzMlxyXG4gICAgICAgIHZhciB0ID0gJ0FCQ0RFRkdISktNTlBRUlNUV1hZWmFiY2RlZmhpamttbnByc3R3eHl6MjM0NTY3OCcsXHJcbiAgICAgICAgICBhID0gdC5sZW5ndGgsXHJcbiAgICAgICAgICBuID0gJydcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGU7IGkrKykgbiArPSB0LmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhKSkqL1xyXG4gICAgcmV0dXJuIENlc2l1bS5jcmVhdGVHdWlkKClcclxuICB9XHJcblxyXG4gIGdldFNvdXJjZVJvb3RQYXRoKCkge1xyXG4gICAgbGV0IHNka05hbWUgPSAnWUpFYXJ0aC5taW4uanMnXHJcbiAgICBsZXQgc2NyaXB0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpXHJcbiAgICBsZXQgcHJlZml4ID0gJydcclxuICAgIHNjcmlwdHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5zcmMgJiYgaXRlbS5zcmMuaW5kZXhPZihzZGtOYW1lKSA+IC0xKSB7XHJcbiAgICAgICAgbGV0IGFyciA9IGl0ZW0uc3JjLnNwbGl0KCcvJylcclxuICAgICAgICBhcnIucG9wKClcclxuICAgICAgICBwcmVmaXggPSBhcnIuam9pbignLycpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICByZXR1cm4gcHJlZml4XHJcbiAgfVxyXG5cclxuICAvKipAZGVzY3JpcHRpb24g56yb5Y2h5bCU5Z2Q5qCH6L2s57uP57qs5bqmXHJcbiAgICogQG1ldGhvZCBjYXJ0ZXNpYW4zVG93Z3M4NFxyXG4gICAqIEBwYXJhbSBjYXJ0ZXNpYW4ge0Nlc2l1bS5DYXJ0ZXNpYW4zfSDnrJvljaHlsJTlnZDmoIdcclxuICAgKiBAcGFyYW0gdmlld2VyXHJcbiAgICogQHBhcmFtIGNhcnRlc2lhbi54IHtudW1iZXJ9XHJcbiAgICogQHBhcmFtIGNhcnRlc2lhbi55IHtudW1iZXJ9XHJcbiAgICogQHBhcmFtIGNhcnRlc2lhbi56IHtudW1iZXJ9XHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcbiAgICogQHJldHVybiB7b2JqZWN0fSB3Z3M4NCDov5Tlm553Z3M4NOWdkOagh1xyXG4gICAqICovXHJcbiAgY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB2aWV3ZXIpIHtcclxuICAgIHZhciBlbGxpcHNvaWQgPSB2aWV3ZXIuc2NlbmUuZ2xvYmUuZWxsaXBzb2lkXHJcbiAgICB2YXIgY2FydGVzaWFuMyA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMyhcclxuICAgICAgY2FydGVzaWFuLngsXHJcbiAgICAgIGNhcnRlc2lhbi55LFxyXG4gICAgICBjYXJ0ZXNpYW4uelxyXG4gICAgKVxyXG4gICAgdmFyIGNhcnRvZ3JhcGhpYyA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhjYXJ0ZXNpYW4zKVxyXG4gICAgdmFyIGxhdCA9IENlc2l1bS5NYXRoLnRvRGVncmVlcyhjYXJ0b2dyYXBoaWMubGF0aXR1ZGUpXHJcbiAgICB2YXIgbG5nID0gQ2VzaXVtLk1hdGgudG9EZWdyZWVzKGNhcnRvZ3JhcGhpYy5sb25naXR1ZGUpXHJcbiAgICB2YXIgYWx0ID0gY2FydG9ncmFwaGljLmhlaWdodCA8IDAgPyAwIDogY2FydG9ncmFwaGljLmhlaWdodFxyXG4gICAgLy8gdmFyIGFsdCA9IGNhcnRvZ3JhcGhpYy5oZWlnaHRcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxuZzogbG5nLFxyXG4gICAgICBsYXQ6IGxhdCxcclxuICAgICAgYWx0OiBhbHQsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyDorqHnrpflpJrnur/mrrXplb/luqZcclxuICAgKiBAbWV0aG9kIGNvbXB1dGVEaXN0YW5jZVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqQHBhcmFtIHBvc2l0aW9ucyB7QXJyYXkuPHtsbmc6bnVtYmVyLCBsYXQ6bnVtYmVyLGFsdDpudW1iZXJ9Pn3lnZDmoIfmlbDnu4RcclxuICAgKiBAcGFyYW0gW2ZyYWN0aW9uRGlnaXRzPTJdIOS/neeVmeWwj+aVsOeCueS9jeaVsFxyXG4gICAqIEBwYXJhbSBbZ3JvdW5kPXRydWVdIOaYr+WQpui0tOWcsFxyXG4gICAqICovXHJcbiAgYXN5bmMgY29tcHV0ZURpc3RhbmNlKHBvc2l0aW9ucyA9IFtdLCBmcmFjdGlvbkRpZ2l0cyA9IDIsIHR5cGUgPSAn56m66Ze06ZW/5bqmJykge1xyXG4gICAgaWYgKHBvc2l0aW9ucy5sZW5ndGggPCAyKSB7XHJcbiAgICAgIHJldHVybiAwXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgbGVuZ3RoID0gMFxyXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICBjYXNlICfnqbrpl7Tplb/luqYnOlxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uMSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHBvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXQsIHBvc2l0aW9uc1tpXS5hbHQpO1xyXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbjIgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaSArIDFdLmxuZywgcG9zaXRpb25zW2kgKyAxXS5sYXQsIHBvc2l0aW9uc1tpICsgMV0uYWx0KTtcclxuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShwb3NpdGlvbjEsIHBvc2l0aW9uMik7XHJcbiAgICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aCArIGRpc3RhbmNlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJ+aKleW9semVv+W6pic6XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24xID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uMiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHBvc2l0aW9uc1tpICsgMV0ubG5nLCBwb3NpdGlvbnNbaSArIDFdLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb24xLCBwb3NpdGlvbjIpO1xyXG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggKyBkaXN0YW5jZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICflnLDooajplb/luqYnOlxyXG4gICAgICAgICAgbGV0IG1ldGVyc1xyXG4gICAgICAgICAgbGV0IGxpbmVTdHJpbmcyID0gW11cclxuICAgICAgICAgIHBvc2l0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGxpbmVTdHJpbmcyLnB1c2goW2l0ZW0ubG5nLCBpdGVtLmxhdCwgaXRlbS5hbHRdKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxldCBsaW5lMiA9IHR1cmYubGluZVN0cmluZyhsaW5lU3RyaW5nMilcclxuICAgICAgICAgIGxldCBkID0gdHVyZi5sZW5ndGgobGluZTIpICogMTAwMFxyXG4gICAgICAgICAgbWV0ZXJzID0gZCA+IDIwID8gZCAvIDIwIDogZFxyXG5cclxuICAgICAgICAgIGxldCByZXMgPSB0aGlzLmNodW5rTGluZShwb3NpdGlvbnMsIG1ldGVycylcclxuICAgICAgICAgIGxldCBjb29yZGluYXRlcyA9IFtdXHJcbiAgICAgICAgICByZXMuZm9yRWFjaCgoRmVhdHVyZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgPSBbLi4uRmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlc11cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb29yZGluYXRlcy5wdXNoKEZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsZXQgYXJyID0gW11cclxuICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb29yZGluYXRlcykge1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNvb3JkaW5hdGVzLmluZGV4T2YoaXRlbSk7XHJcbiAgICAgICAgICAgIGxldCByID0gYXdhaXQgdGhpcy5zYW1wbGVIZWlnaHQoeyBsbmc6IGl0ZW1bMF0sIGxhdDogaXRlbVsxXSwgYWx0OiAwIH0sIGluZGV4KVxyXG4gICAgICAgICAgICByLnBvc2l0aW9uLmFsdCA9IHIucG9zaXRpb24uYWx0IDwgMCA/IDAgOiByLnBvc2l0aW9uLmFsdFxyXG4gICAgICAgICAgICBhcnIucHVzaChyKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IGwgPSBhcnIubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uMSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGFycltpXS5wb3NpdGlvbi5sbmcsIGFycltpXS5wb3NpdGlvbi5sYXQsIDApO1xyXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbjIgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhhcnJbaSArIDFdLnBvc2l0aW9uLmxuZywgYXJyW2kgKyAxXS5wb3NpdGlvbi5sYXQsIDApO1xyXG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmRpc3RhbmNlKHBvc2l0aW9uMSwgcG9zaXRpb24yKTtcclxuICAgICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoICsgZGlzdGFuY2VcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBsZW5ndGgudG9GaXhlZChmcmFjdGlvbkRpZ2l0cylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbXB1dGVEaXN0YW5jZTIocG9zaXRpb25zID0gW10sIGZyYWN0aW9uRGlnaXRzID0gMiwgZ3JvdW5kID0gdHJ1ZSkge1xyXG4gICAgaWYgKHBvc2l0aW9ucy5sZW5ndGggPCAyKSB7XHJcbiAgICAgIHJldHVybiAwXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgbGVuZ3RoID0gMFxyXG4gICAgICBpZiAoZ3JvdW5kKSB7XHJcbiAgICAgICAgbGV0IGxpbmVTdHJpbmcgPSBbXVxyXG4gICAgICAgIHBvc2l0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBsaW5lU3RyaW5nLnB1c2goW2l0ZW0ubG5nLCBpdGVtLmxhdCwgaXRlbS5hbHRdKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgbGV0IGxpbmUgPSB0dXJmLmxpbmVTdHJpbmcobGluZVN0cmluZylcclxuICAgICAgICBsZW5ndGggPSB0dXJmLmxlbmd0aChsaW5lKSAqIDEwMDBcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHBvc2l0aW9uMSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHBvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXQsIHBvc2l0aW9uc1tpXS5hbHQpO1xyXG4gICAgICAgICAgY29uc3QgcG9zaXRpb24yID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2kgKyAxXS5sbmcsIHBvc2l0aW9uc1tpICsgMV0ubGF0LCBwb3NpdGlvbnNbaSArIDFdLmFsdCk7XHJcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmRpc3RhbmNlKHBvc2l0aW9uMSwgcG9zaXRpb24yKTtcclxuICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aCArIGRpc3RhbmNlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBsZW5ndGgudG9GaXhlZChmcmFjdGlvbkRpZ2l0cylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHNhbXBsZUhlaWdodChwMSwgaW5kZXgpIHtcclxuICAgIGxldCBwMiA9IGF3YWl0IHRoaXMuc2FtcGxlSGVpZ2h0TW9zdERldGFpbGVkKFtwMV0pXHJcbiAgICBwMS5hbHQgPSBwMlswXS5oZWlnaHRcclxuICAgIHJldHVybiB7IHBvc2l0aW9uOiBwMSwgaW5kZXggfVxyXG4gIH1cclxuXHJcbiAgLyoqQGRlc2NyaXB0aW9uIOiuoeeul+Wkmui+ueW9oumdouenr1xyXG4gICAqIEBtZXRob2QgY29tcHV0ZUFyZWFcclxuICAgKiBAbWVtYmVyT2YgVG9vbHNcclxuICAgKiBAcGFyYW0gcG9zaXRpb25zIHtBcnJheS48e2xuZzpudW1iZXIsIGxhdDpudW1iZXIsYWx0Om51bWJlcn0+fVxyXG4gICAqIEBwYXJhbSBbZnJhY3Rpb25EaWdpdHM9Ml0ge251bWJlcn0g57K+56Gu5Yiw5bCP5pWw54K55aSa5bCR5L2NXHJcbiAgICogQHJldHVybiB7bnVtYmVyfSAg6Z2i56evXHJcbiAgICogKi9cclxuICBjb21wdXRlQXJlYShwb3NpdGlvbnMsIGZyYWN0aW9uRGlnaXRzID0gMikge1xyXG4gICAgaWYgKHBvc2l0aW9ucy5sZW5ndGggPCAzKSB7XHJcbiAgICAgIHJldHVybiAwXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgcCA9IFtdXHJcbiAgICAgIHBvc2l0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgcC5wdXNoKFtpdGVtLmxuZywgaXRlbS5sYXRdKVxyXG4gICAgICB9KVxyXG4gICAgICBwLnB1c2gocFswXSlcclxuICAgICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24oW3BdKVxyXG4gICAgICBsZXQgdHJpYW5nbGVzID0gdHVyZi50ZXNzZWxhdGUocG9seWdvbik7XHJcblxyXG4gICAgICByZXR1cm4gTnVtYmVyKHR1cmYuYXJlYSh0cmlhbmdsZXMpLnRvRml4ZWQoZnJhY3Rpb25EaWdpdHMpKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29tcHV0ZVNpZ25lZEFyZWEodmlld2VyLCBwYXRoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheTIgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChwYXRoW2ldLmxuZywgcGF0aFtpXS5sYXQpXHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXkyLnB1c2goW3BhdGhbaV0ubG5nLCBwYXRoW2ldLmxhdF0pXHJcbiAgICB9XHJcbiAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhmcm9tRGVncmVlc0FycmF5Mik7XHJcbiAgICBsZXQgYmJveCA9IHR1cmYuYmJveChsaW5lKTtcclxuICAgIGxldCBsb25nUmFkaWFucyA9IENlc2l1bS5NYXRoLnRvUmFkaWFucyhiYm94WzJdIC0gYmJveFswXSk7XHJcbiAgICBsZXQgbGF0UmFkaWFucyA9IENlc2l1bS5NYXRoLnRvUmFkaWFucyhiYm94WzNdIC0gYmJveFsxXSk7XHJcbiAgICBsZXQgZ3JhbnVsYXJpdHlcclxuICAgIGlmIChsb25nUmFkaWFucyA+IGxhdFJhZGlhbnMpIHtcclxuICAgICAgZ3JhbnVsYXJpdHkgPSBsb25nUmFkaWFucyAvIDEwXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZ3JhbnVsYXJpdHkgPSBsYXRSYWRpYW5zIC8gMTBcclxuICAgIH1cclxuXHJcbiAgICAvLyBsZXQgZ3JhbnVsYXJpdHkgPSBNYXRoLlBJIC8gTWF0aC5wb3coMiwgMTEpO1xyXG4gICAgLy8gZ3JhbnVsYXJpdHkgPSBncmFudWxhcml0eSAvIDEyNTA7XHJcbiAgICBsZXQgcG9seWdvbkdlb21ldHJ5ID0gbmV3IENlc2l1bS5Qb2x5Z29uR2VvbWV0cnkuZnJvbVBvc2l0aW9ucyh7XHJcbiAgICAgIHBvc2l0aW9uczogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShmcm9tRGVncmVlc0FycmF5KSxcclxuICAgICAgdmVydGV4Rm9ybWF0OiBDZXNpdW0uUGVySW5zdGFuY2VDb2xvckFwcGVhcmFuY2UuRkxBVF9WRVJURVhfRk9STUFULFxyXG4gICAgICBncmFudWxhcml0eTogZ3JhbnVsYXJpdHksXHJcbiAgICB9KTtcclxuICAgIC8v5Yib5bu66Ieq5a6a5LmJ5bmz6Z2i5Yeg5L2V5L2TXHJcbiAgICBsZXQgZ2VvbSA9IG5ldyBDZXNpdW0uUG9seWdvbkdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5KHBvbHlnb25HZW9tZXRyeSk7XHJcbiAgICBpZiAoIWdlb20gfHwgIWdlb20uYXR0cmlidXRlcyB8fCAhZ2VvbS5hdHRyaWJ1dGVzLnBvc2l0aW9uKSB7XHJcbiAgICAgIHJldHVybiAwXHJcbiAgICB9XHJcbiAgICBjb25zdCBpbmRpY2VzID0gZ2VvbS5pbmRpY2VzOyAvL+iOt+WPlumhtueCuee0ouW8leaVsOaNrlxyXG4gICAgY29uc3QgcG9zaXRpb25zID0gZ2VvbS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcztcclxuICAgIGZ1bmN0aW9uIHJldHVyblBvc2l0aW9uKHBvc2l0aW9uLCBpbmRleCkge1xyXG4gICAgICBsZXQgcG9zMyA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMyhcclxuICAgICAgICBwb3NpdGlvbnNbaW5kZXggKiAzXSxcclxuICAgICAgICBwb3NpdGlvbnNbaW5kZXggKiAzICsgMV0sXHJcbiAgICAgICAgcG9zaXRpb25zW2luZGV4ICogMyArIDJdXHJcbiAgICAgICk7XHJcbiAgICAgIGxldCBwb3NpdGlvbjEgPSB2aWV3ZXIuc2NlbmUuY2xhbXBUb0hlaWdodChwb3MzKSB8fCBwb3MzXHJcbiAgICAgIC8vIGxldCBwb3M4NCA9IGF3YWl0IF90aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uMSwgdmlld2VyKVxyXG4gICAgICAvLyBsZXQgaGVpZ2h0ID0gMFxyXG4gICAgICAvLyB0cnkge1xyXG4gICAgICAvLyAgIGxldCBwb3NpdGlvbjIgPSBhd2FpdCBDZXNpdW0uc2FtcGxlVGVycmFpbk1vc3REZXRhaWxlZChcclxuICAgICAgLy8gICAgIHZpZXdlci5zY2VuZS50ZXJyYWluUHJvdmlkZXIsXHJcbiAgICAgIC8vICAgICBbQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tQ2FydGVzaWFuKHBvczMpXVxyXG4gICAgICAvLyAgIClcclxuICAgICAgLy8gICBoZWlnaHQgPSBwb3NpdGlvbjJbMF0uaGVpZ2h0XHJcbiAgICAgIC8vIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vICAgaGVpZ2h0ID0gMFxyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGlmIChoZWlnaHQgPiBwb3M4NC5hbHQpIHtcclxuICAgICAgLy8gICBwb3M4NC5hbHQgPSBoZWlnaHRcclxuICAgICAgLy8gfVxyXG4gICAgICByZXR1cm4gcG9zaXRpb24xXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGFyZWEgPSAwXHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaW5kaWNlcy5sZW5ndGg7IGluZGV4ICs9IDMpIHtcclxuICAgICAgY29uc3QgcG9zMCA9IHJldHVyblBvc2l0aW9uKHBvc2l0aW9ucywgaW5kaWNlc1tpbmRleF0pO1xyXG4gICAgICBjb25zdCBwb3MxID0gcmV0dXJuUG9zaXRpb24ocG9zaXRpb25zLCBpbmRpY2VzW2luZGV4ICsgMV0pO1xyXG4gICAgICBjb25zdCBwb3MyID0gcmV0dXJuUG9zaXRpb24ocG9zaXRpb25zLCBpbmRpY2VzW2luZGV4ICsgMl0pO1xyXG4gICAgICAvLyBsZXQgZW50aXR5ID0gdmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgIC8vICAgbmFtZTogXCLkuInop5LpnaJcIixcclxuICAgICAgLy8gICBwb2x5Z29uOiB7XHJcbiAgICAgIC8vICAgICBoaWVyYXJjaHk6IFtwb3MwLCBwb3MxLCBwb3MyXSxcclxuICAgICAgLy8gICAgIHBlclBvc2l0aW9uSGVpZ2h0OiB0cnVlLFxyXG4gICAgICAvLyAgICAgbWF0ZXJpYWw6IENlc2l1bS5Db2xvci5mcm9tUmFuZG9tKCksXHJcbiAgICAgIC8vICAgICBvdXRsaW5lOiB0cnVlLFxyXG4gICAgICAvLyAgICAgb3V0bGluZUNvbG9yOiBDZXNpdW0uQ29sb3IuQkxBQ0ssXHJcbiAgICAgIC8vICAgfSxcclxuICAgICAgLy8gfSk7XHJcblxyXG4gICAgICBsZXQgdjAgPSBDZXNpdW0uQ2FydGVzaWFuMy5zdWJ0cmFjdChwb3MwLCBwb3MxLCBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoKSlcclxuICAgICAgbGV0IHYxID0gQ2VzaXVtLkNhcnRlc2lhbjMuc3VidHJhY3QocG9zMiwgcG9zMSwgbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKCkpXHJcbiAgICAgIGxldCBjcm9zcyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmNyb3NzKHYwLCB2MSwgdjApO1xyXG4gICAgICBhcmVhID0gKGFyZWEgKyBDZXNpdW0uQ2FydGVzaWFuMy5tYWduaXR1ZGUoY3Jvc3MpICogMC41KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIE51bWJlcihhcmVhLnRvRml4ZWQoMikpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyDliJvlu7rlnIZcclxuICAgKkBtZXRob2QgY3JlYXRlQ2lyY2xlXHJcbiAgICogQHBhcmFtIHBvaW50IHtvYmplY3R9IOWchuW/g+WdkOagh1xyXG4gICAqIEBwYXJhbSBwb2ludC5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIHBvaW50LmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gcmFkaXVzIHtudW1iZXJ9IOWNiuW+hCAg5Y2V5L2N77ya57GzXHJcbiAgICogQHBhcmFtIFtvcHRpb25zXVxyXG4gICAqIEBwYXJhbSBbb3B0aW9ucy5zdGVwcz0zNjBdIHtudW1iZXJ9IOauteaVsFxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG5cclxuICAgKiAqL1xyXG4gIGNyZWF0ZUNpcmNsZShwb2ludCwgcmFkaXVzID0gMSwgb3B0aW9ucyA9IHsgc3RlcHM6IDM2MCB9KSB7XHJcbiAgICBpZiAoTnVtYmVyKHJhZGl1cykgPD0gMCkge1xyXG4gICAgICByYWRpdXMgPSAwLjAxXHJcbiAgICB9XHJcbiAgICB2YXIgY2VudGVyID0gW051bWJlcihwb2ludC5sbmcpLCBOdW1iZXIocG9pbnQubGF0KV1cclxuICAgIGxldCBjb29yZGluYXRlcyA9IHR1cmYuY2lyY2xlKGNlbnRlciwgcmFkaXVzIC8gMTAwMCwgb3B0aW9ucykuZ2VvbWV0cnlcclxuICAgICAgLmNvb3JkaW5hdGVzWzBdXHJcbiAgICBsZXQgcG9zaXRpb25zID0gW11cclxuICAgIGNvb3JkaW5hdGVzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgcG9zaXRpb25zID0gcG9zaXRpb25zLmNvbmNhdChpdGVtKVxyXG4gICAgfSlcclxuICAgIHJldHVybiBwb3NpdGlvbnNcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIOWIm+W7uuakreWchlxyXG4gICAqQG1ldGhvZCBjcmVhdGVFbGxpcHNlXHJcbiAgICogQHBhcmFtIHBvaW50IHtvYmplY3R9IOWchuW/g+WdkOagh1xyXG4gICAqIEBwYXJhbSBwb2ludC5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIHBvaW50LmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gW29wdGlvbnNdXHJcbiAgICogQHBhcmFtIFtvcHRpb25zLmdyYW51bGFyaXR5PTAuMV0ge251bWJlcn0g5qSt5ZyG5LiK54K55LmL6Ze055qE6KeS5bqmXHJcbiAgICogQHBhcmFtIFtvcHRpb25zLnNlbWlNaW5vckF4aXM9MTBdIHtudW1iZXJ9IOefreWNiui9tOmVv+W6piAg5Y2V5L2N77ya57GzXHJcbiAgICogQHBhcmFtIFtvcHRpb25zLnNlbWlNYWpvckF4aXM9MjBdIHtudW1iZXJ9IOmVv+WNiui9tOmVv+W6piAg5Y2V5L2N77ya57GzXHJcbiAgICogQHBhcmFtIFtvcHRpb25zLmJlYXJpbmc9MF0ge251bWJlcn0g5qSt5ZyG5peL6L2s6KeS5bqmICDljZXkvY3vvJrnsbNcclxuICAgKiBAbWVtYmVyT2YgVG9vbHNcclxuXHJcbiAgICogKi9cclxuICBjcmVhdGVFbGxpcHNlKHBvaW50LCBvcHRpb25zID0geyBncmFudWxhcml0eTogMC4xLCBzZW1pTWlub3JBeGlzOiAxMCwgc2VtaU1ham9yQXhpczogMjAsIGJlYXJpbmc6IDAsIGhlaWdodDogMCB9KSB7XHJcbiAgICBpZiAoIW9wdGlvbnMuZ3JhbnVsYXJpdHkpIHtcclxuICAgICAgb3B0aW9ucy5ncmFudWxhcml0eSA9IDAuMVxyXG4gICAgfVxyXG4gICAgaWYgKCFvcHRpb25zLmhlaWdodCkge1xyXG4gICAgICBvcHRpb25zLmhlaWdodCA9IDBcclxuICAgIH1cclxuICAgIGlmICghb3B0aW9ucy5zZW1pTWlub3JBeGlzKSB7XHJcbiAgICAgIG9wdGlvbnMuc2VtaU1pbm9yQXhpcyA9IDAuMDAwMDFcclxuICAgIH1cclxuICAgIGlmICghb3B0aW9ucy5zZW1pTWFqb3JBeGlzKSB7XHJcbiAgICAgIG9wdGlvbnMuc2VtaU1ham9yQXhpcyA9IDAuMDAwMDFcclxuICAgIH1cclxuICAgIGxldCBlbGxpcHNlR2VvbWV0cnkgPSBuZXcgQ2VzaXVtLkVsbGlwc2VPdXRsaW5lR2VvbWV0cnkoe1xyXG4gICAgICBjZW50ZXI6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKE51bWJlcihwb2ludC5sbmcpLCBOdW1iZXIocG9pbnQubGF0KSksXHJcbiAgICAgIHNlbWlNYWpvckF4aXM6IE51bWJlcihvcHRpb25zLnNlbWlNYWpvckF4aXMpLFxyXG4gICAgICBzZW1pTWlub3JBeGlzOiBOdW1iZXIob3B0aW9ucy5zZW1pTWlub3JBeGlzKSxcclxuICAgICAgaGVpZ2h0OiBOdW1iZXIob3B0aW9ucy5oZWlnaHQpLFxyXG4gICAgICBncmFudWxhcml0eTogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKG9wdGlvbnMuZ3JhbnVsYXJpdHkpLFxyXG4gICAgICByb3RhdGlvbjogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKG9wdGlvbnMuYmVhcmluZyksXHJcbiAgICB9KVxyXG4gICAgbGV0IGVsbGlwc2UgPSBDZXNpdW0uRWxsaXBzZU91dGxpbmVHZW9tZXRyeS5jcmVhdGVHZW9tZXRyeShlbGxpcHNlR2VvbWV0cnkpXHJcbiAgICBpZiAoIWVsbGlwc2UgfHwgIWVsbGlwc2UuYXR0cmlidXRlcyB8fCAhZWxsaXBzZS5hdHRyaWJ1dGVzLnBvc2l0aW9uKSB7XHJcbiAgICAgIHJldHVybiBbXVxyXG4gICAgfVxyXG4gICAgY29uc3QgZWxsaXBzZVBvc2l0aW9ucyA9IGVsbGlwc2UuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXM7XHJcbiAgICBsZXQgcG9zaXRpb25zID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxsaXBzZVBvc2l0aW9ucy5sZW5ndGg7IGkgKz0gMykge1xyXG4gICAgICBsZXQgcG9zID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKFxyXG4gICAgICAgIGVsbGlwc2VQb3NpdGlvbnNbaV0sXHJcbiAgICAgICAgZWxsaXBzZVBvc2l0aW9uc1tpICsgMV0sXHJcbiAgICAgICAgZWxsaXBzZVBvc2l0aW9uc1tpICsgMl1cclxuICAgICAgKVxyXG4gICAgICBwb3NpdGlvbnMucHVzaChwb3MpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gcG9zaXRpb25zXHJcbiAgfVxyXG5cclxuICAvKuiuoeeulzLngrnnmoTmgZLnm7jnur/lpLnop5IqL1xyXG4gIHJodW1iQmVhcmluZyhwMSwgcDIpIHtcclxuICAgIHZhciBwb2ludDEgPSB0dXJmLnBvaW50KFtwMS5sbmcsIHAxLmxhdF0sKTtcclxuICAgIHZhciBwb2ludDIgPSB0dXJmLnBvaW50KFtwMi5sbmcsIHAyLmxhdF0sKTtcclxuICAgIHJldHVybiB0dXJmLnJodW1iQmVhcmluZyhwb2ludDEsIHBvaW50Mik7XHJcbiAgfVxyXG5cclxuXHJcbiAgY29tcHV0ZUNlbnRlcihwb3NpdGlvbnMgPSBbXSkge1xyXG4gICAgbGV0IGFyciA9IFtdXHJcbiAgICBwb3NpdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBhcnIucHVzaCh0dXJmLnBvaW50KFtpdGVtLmxuZywgaXRlbS5sYXRdKSlcclxuICAgIH0pXHJcbiAgICB2YXIgZmVhdHVyZXMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKGFycilcclxuXHJcbiAgICB2YXIgY29vcmRpbmF0ZXMgPSB0dXJmLmNlbnRlcihmZWF0dXJlcykuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxuZzogY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgIGxhdDogY29vcmRpbmF0ZXNbMV0sXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL+iuoeeulzLngrnnmoTkuK3lv4PngrlcclxuICBjb21wdXRlTWlkcG9pbnQocG9pbnQxLCBwb2ludDIpIHtcclxuICAgIGxldCBwMSA9IHR1cmYucG9pbnQoW3BvaW50MS5sbmcsIHBvaW50MS5sYXRdKVxyXG4gICAgbGV0IHAyID0gdHVyZi5wb2ludChbcG9pbnQyLmxuZywgcG9pbnQyLmxhdF0pXHJcbiAgICB2YXIgY2VudGVyID0gdHVyZi5taWRwb2ludChwMSwgcDIpLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgICByZXR1cm4geyBsbmc6IGNlbnRlclswXSwgbGF0OiBjZW50ZXJbMV0gfVxyXG4gIH1cclxuXHJcbiAgLy/orqHnrpdcclxuICBjb21wdXRlQXR0YWNrQXJyb3cocG9zaXRpb25zID0gW10pIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXB1dGVBcnJvdyhwb3NpdGlvbnMsIDApXHJcbiAgfVxyXG5cclxuICAvL+iuoeeul+mSs+WHu+eureWktFxyXG4gIGNvbXB1dGVQaW5jZXJBcnJvdyhwb3NpdGlvbnMgPSBbXSkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUFycm93KHBvc2l0aW9ucylcclxuICB9XHJcblxyXG4gIC8v6K6h566X5pS75Ye7566t5aS0XHJcbiAgY29tcHV0ZUFycm93KHBvc2l0aW9ucyA9IFtdLCB0eXBlID0gMSkge1xyXG4gICAgaWYgKHBvc2l0aW9ucy5sZW5ndGggPCAzKSB7XHJcbiAgICAgIHJldHVybiBbXVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFyIGxuZ2xhdEFyciA9IFtdXHJcbiAgICAgIC8vIGlmKHBvc2l0aW9ucy5ldmVyeShwb3MgPT4gTnVtYmVyKHBvcy5sbmcpID49IDApIHx8IHBvc2l0aW9ucy5ldmVyeShwb3MgPT4gTnVtYmVyKHBvcy5sbmcpIDw9IDApKSB7XHJcbiAgICAgIC8vICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgLy8gICAgIGxuZ2xhdEFyci5wdXNoKFtwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0XSlcclxuICAgICAgLy8gICB9XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gZWxzZSB7XHJcbiAgICAgIC8vICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgLy8gICAgIGlmKHBvc2l0aW9uc1tpXS5sbmc8MCkge1xyXG4gICAgICAvLyAgICAgICBsbmdsYXRBcnIucHVzaChbcG9zaXRpb25zW2ldLmxuZyszNjAsIHBvc2l0aW9uc1tpXS5sYXRdKVxyXG4gICAgICAvLyAgICAgfVxyXG4gICAgICAvLyAgICAgZWxzZSB7XHJcbiAgICAgIC8vICAgICAgIGxuZ2xhdEFyci5wdXNoKFtwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0XSlcclxuICAgICAgLy8gICAgIH1cclxuICAgICAgLy8gICB9XHJcbiAgICAgIC8vIH1cclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsbmdsYXRBcnIucHVzaChbcG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdF0pXHJcbiAgICAgIH1cclxuICAgICAgdmFyIHJlc1xyXG4gICAgICBpZiAodHlwZSkge1xyXG4gICAgICAgIHJlcyA9IHhwLmFsZ29yaXRobS5kb3VibGVBcnJvdyhsbmdsYXRBcnIpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzID0geHAuYWxnb3JpdGhtLnRhaWxlZEF0dGFja0Fycm93KGxuZ2xhdEFycilcclxuICAgICAgfVxyXG4gICAgICB2YXIgaW5kZXggPSBKU09OLnN0cmluZ2lmeShyZXMucG9seWdvbmFsUG9pbnQpLmluZGV4T2YoJ251bGwnKVxyXG4gICAgICB2YXIgcmV0dXJuRGF0YSA9IFtdXHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybkRhdGEgPSByZXMucG9seWdvbmFsUG9pbnRcclxuICAgICAgcmV0dXJuIHJldHVybkRhdGFcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOiuoeeul+mbhue7k+WcsFxyXG4gIGNvbXB1dGVBc3NlbWJsZShwb3NpdGlvbnMgPSBbXSwgaXM4NCA9IGZhbHNlKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIFtdXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgcG9pbnRzID0gcG9zaXRpb25zLmxlbmd0aDtcclxuICAgICAgbGV0IHBudHMgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgcG9zaXRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBwbnRzLnB1c2goW2l0ZW0ubG5nLCBpdGVtLmxhdF0pO1xyXG4gICAgICB9KTtcclxuICAgICAgLy9jb25zb2xlLmxvZyhcInBudHM2NjY2XCIscG50cyk7XHJcbiAgICAgIC8vIHBudHMucHVzaCh0YWlsUG9pbnQpO1xyXG4gICAgICAvLyBwbnRzLnB1c2goaGVhZGVyUG9pbnQpO1xyXG5cclxuICAgICAgaWYgKHBudHMubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgbGV0IG1pZCA9IFAuUGxvdFV0aWxzLm1pZChwbnRzWzBdLCBwbnRzWzFdKVxyXG4gICAgICAgIC8vbGV0IGQgPSB1dGlscy5NYXRoRGlzdGFuY2UocG50c1swXSwgbWlkKSAvIDAuOVxyXG4gICAgICAgIGxldCBkID0gUC5QbG90VXRpbHMuZGlzdGFuY2UocG50c1swXSwgbWlkKSAvIDAuOVxyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJkXCIsZCk7XHJcbiAgICAgICAgbGV0IHBudCA9IFAuUGxvdFV0aWxzLmdldFRoaXJkUG9pbnQocG50c1swXSwgbWlkLCBQLkNvbnN0YW50cy5IQUxGX1BJLCBkLCB0cnVlKVxyXG4gICAgICAgIHBudHMgPSBbcG50c1swXSwgcG50LCBwbnRzWzFdXTtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwicG50XCIscG50KTtcclxuICAgICAgICAvL2NyZWF0ZVBvaW50KENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHBudFswXSwgcG50WzFdKSk7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG1pZCA9IFAuUGxvdFV0aWxzLm1pZChwbnRzWzBdLCBwbnRzWzJdKVxyXG4gICAgICBwbnRzLnB1c2gobWlkLCBwbnRzWzBdLCBwbnRzWzFdKVxyXG5cclxuICAgICAgbGV0IFtub3JtYWxzLCBwbnQxLCBwbnQyLCBwbnQzLCByZXN1bHQsIHJlc3VsdDJdID0gW1tdLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBbXSwgW11dXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG50cy5sZW5ndGggLSAyOyBpKyspIHtcclxuICAgICAgICBwbnQxID0gcG50c1tpXVxyXG4gICAgICAgIHBudDIgPSBwbnRzW2kgKyAxXVxyXG4gICAgICAgIHBudDMgPSBwbnRzW2kgKyAyXVxyXG4gICAgICAgIGxldCBub3JtYWxQb2ludHMgPSBQLlBsb3RVdGlscy5nZXRCaXNlY3Rvck5vcm1hbHMoMC40LCBwbnQxLCBwbnQyLCBwbnQzKVxyXG4gICAgICAgIG5vcm1hbHMgPSBub3JtYWxzLmNvbmNhdChub3JtYWxQb2ludHMpXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGNvdW50ID0gbm9ybWFscy5sZW5ndGhcclxuICAgICAgbm9ybWFscyA9IFtub3JtYWxzW2NvdW50IC0gMV1dLmNvbmNhdChub3JtYWxzLnNsaWNlKDAsIGNvdW50IC0gMSkpXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG50cy5sZW5ndGggLSAyOyBpKyspIHtcclxuICAgICAgICBwbnQxID0gcG50c1tpXVxyXG4gICAgICAgIHBudDIgPSBwbnRzW2kgKyAxXVxyXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoWy4uLnBudDFdKVxyXG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDw9IFAuQ29uc3RhbnRzLkZJVFRJTkdfQ09VTlQ7IHQrKykge1xyXG4gICAgICAgICAgbGV0IHBudCA9IFAuUGxvdFV0aWxzLmdldEN1YmljVmFsdWUodCAvIFAuQ29uc3RhbnRzLkZJVFRJTkdfQ09VTlQsIHBudDEsIG5vcm1hbHNbaSAqIDJdLCBub3JtYWxzW2kgKiAyICsgMV0sIHBudDIpXHJcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KFsuLi5wbnRdKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KFsuLi5wbnQyXSlcclxuICAgICAgfVxyXG4gICAgICBpZiAoaXM4NCkge1xyXG4gICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShyZXN1bHQpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOiuoeeul+ebtOe6v+eureWktFxyXG4gIGNvbXB1dGVTdHJhaWdodEFycm93KHBvc2l0aW9ucyA9IFtdLCBpczg0ID0gZmFsc2UpIHtcclxuICAgIGlmIChwb3NpdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gW11cclxuICAgIH1cclxuICAgIGxldCBwb2ludDEgPSBbcG9zaXRpb25zWzBdLmxuZywgcG9zaXRpb25zWzBdLmxhdF1cclxuICAgIGxldCBwb2ludDIgPSBbcG9zaXRpb25zWzFdLmxuZywgcG9zaXRpb25zWzFdLmxhdF1cclxuICAgIGlmIChwb3NpdGlvbnNbMF0ubG5nID09PSBwb3NpdGlvbnNbMV0ubG5nICYmIHBvc2l0aW9uc1swXS5sYXQgPT09IHBvc2l0aW9uc1sxXS5sYXQpIHtcclxuICAgICAgaWYgKGlzODQpIHtcclxuICAgICAgICByZXR1cm4gW3Bvc2l0aW9uc1swXSwgcG9zaXRpb25zWzBdLCBwb3NpdGlvbnNbMF1dXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IGNhcnRlc2lhbjMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbMF0ubG5nLCBwb3NpdGlvbnNbMF0ubGF0KVxyXG4gICAgICAgIHJldHVybiBbY2FydGVzaWFuMywgY2FydGVzaWFuMywgY2FydGVzaWFuM11cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGxuZ2xhdEFyciA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsbmdsYXRBcnIucHVzaChbcG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdF0pXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc1xyXG4gICAgcmVzID0geHAuYWxnb3JpdGhtLmZpbmVBcnJvdyhwb2ludDEsIHBvaW50MilcclxuICAgIGlmIChpczg0KSB7XHJcbiAgICAgIGxldCBwb3M4NCA9IFtdXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocmVzW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgcG9zODQucHVzaChwb3MubG5nLCBwb3MubGF0KVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwb3M4NFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc1xyXG4gIH1cclxuXHJcbiAgZ2V0TWF0ZXJpYWwoY29sb3IgPSAnIzJhYjBjMicsIHR5cGUgPSAwLCBlbnRpdHkgPSBudWxsLCBuZXdQYXJhbSA9IHt9KSB7XHJcbiAgICBsZXQgbWF0ZXJpYWwgPSAnJ1xyXG4gICAgbGV0IGFyciA9IHtcclxuICAgICAgJzcnOiAxMCxcclxuICAgICAgJzgnOiAzLFxyXG4gICAgICAnOSc6IDQsXHJcbiAgICAgICcxMCc6IDQsXHJcbiAgICAgICcxMSc6IDQsXHJcbiAgICAgICcxMic6IDJcclxuICAgIH1cclxuICAgIGlmIChlbnRpdHkpIHtcclxuICAgICAgYXJyW3R5cGUgKyAnJ10gPyAoZW50aXR5LnBvbHlsaW5lLndpZHRoID0gZW50aXR5LnBvbHlsaW5lLm9yaVdpZHRoICsgYXJyW3R5cGUgKyAnJ10pIDogKGVudGl0eS5wb2x5bGluZS53aWR0aCA9IGVudGl0eS5wb2x5bGluZS5vcmlXaWR0aClcclxuICAgIH1cclxuICAgIHN3aXRjaCAoTnVtYmVyKHR5cGUpKSB7XHJcblxyXG4gICAgICBjYXNlIDE6IC8v6Jma57q/XHJcbiAgICAgICAgbWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLlBvbHlsaW5lRGFzaE1hdGVyaWFsUHJvcGVydHkoe1xyXG4gICAgICAgICAgY29sb3I6IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoY29sb3IpLFxyXG4gICAgICAgICAgZGFzaExlbmd0aDogMTAsIC8v55+t5YiS57q/6ZW/5bqmXHJcbiAgICAgICAgfSlcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDI6IC8v5rOb5YWJXHJcbiAgICAgICAgbWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLlBvbHlsaW5lR2xvd01hdGVyaWFsUHJvcGVydHkoe1xyXG4gICAgICAgICAgZ2xvd1Bvd2VyOiAwLjIsXHJcbiAgICAgICAgICBjb2xvcjogQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhjb2xvciksXHJcbiAgICAgICAgfSlcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDM6IC8v5bC+6L+55YWJ57q/XHJcbiAgICAgICAgbWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLlBvbHlsaW5lRmxvd01hdGVyaWFsUHJvcGVydHkoe1xyXG4gICAgICAgICAgY29sb3I6IGNvbG9yLFxyXG4gICAgICAgICAgc3BlZWQ6IG5ld1BhcmFtLnJvdGF0ZSA/IG5ld1BhcmFtLnNwZWVkIDogMCAtIG5ld1BhcmFtLnNwZWVkLFxyXG4gICAgICAgICAgcm90YXRlOiBuZXdQYXJhbS5yb3RhdGVcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgNDogLy/lpJrlsL7ov7nlhYnnur9cclxuICAgICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uUG9seWxpbmVGbG93TXVsdE1hdGVyaWFsUHJvcGVydHkoe1xyXG4gICAgICAgICAgY29sb3I6IGNvbG9yLFxyXG4gICAgICAgICAgc3BlZWQ6IG5ld1BhcmFtLnJvdGF0ZSA/IG5ld1BhcmFtLnNwZWVkIDogMCAtIG5ld1BhcmFtLnNwZWVkLFxyXG4gICAgICAgICAgcm90YXRlOiBuZXdQYXJhbS5yb3RhdGVcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgNTogLy/mma7pgJrmtYHliqjomZrnur9cclxuICAgICAgLy8gbWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLkZsb3dEYXNoZWRMaW5lRmxvd01hdGVyaWFsUHJvcGVydHkoe1xyXG4gICAgICAvLyAgIGNvbG9yOiBjb2xvcixcclxuICAgICAgLy8gICB1VHlwZTogMCxcclxuICAgICAgLy8gICBzcGVlZDogbmV3UGFyYW0ucm90YXRlID8gbmV3UGFyYW0uc3BlZWQgOiAwIC0gbmV3UGFyYW0uc3BlZWQsXHJcbiAgICAgIC8vICAgLy8gZGFzaFNpemU6IG5ld1BhcmFtLmRhc2hTaXplLFxyXG4gICAgICAvLyAgIHNwYWNlOiBuZXdQYXJhbS5zcGFjZSxcclxuICAgICAgLy8gICBzY2FsZTogMS4wXHJcbiAgICAgIC8vIH0pXHJcbiAgICAgIC8vIGJyZWFrXHJcbiAgICAgIGNhc2UgNjogLy/mtYHliqjomZrnur8yXHJcbiAgICAgICAgbGV0IHRoYXQgPSB0aGlzXHJcbiAgICAgICAgbGV0IHJlcGVhdFhcclxuICAgICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uRmxvd0Rhc2hlZExpbmVGbG93TWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgICAgICBjb2xvcjogY29sb3IsXHJcbiAgICAgICAgICB1VHlwZTogdHlwZSA9PSA1ID8gMCA6IDEsXHJcbiAgICAgICAgICBzcGVlZDogbmV3UGFyYW0ucm90YXRlID8gbmV3UGFyYW0uc3BlZWQgOiAwIC0gbmV3UGFyYW0uc3BlZWQsXHJcbiAgICAgICAgICAvLyBkYXNoU2l6ZTogbmV3UGFyYW0uZGFzaFNpemUsXHJcbiAgICAgICAgICBzcGFjZTogbmV3UGFyYW0uc3BhY2UsXHJcbiAgICAgICAgICBzY2FsZTogbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gQ2VzaXVtLlNjZW5lTW9kZS5TQ0VORTNEKSB7XHJcbiAgICAgICAgICAgICAgbGV0IG9yaVBvc2l0aW9ucyA9IGVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCFDZXNpdW0uZGVmaW5lZChvcmlQb3NpdGlvbnMpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMS4wO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBsZXQgZGlzdGFuY2UgPSAwO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JpUG9zaXRpb25zLmxlbmd0aCAtIDE7ICsraSkge1xyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgKz0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2Uob3JpUG9zaXRpb25zW2ldLCBvcmlQb3NpdGlvbnNbaSArIDFdKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy/lsY/luZXlnZDmoIdcclxuICAgICAgICAgICAgICBsZXQgcG9pbnQxID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDAsIHRoYXQuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0KVxyXG4gICAgICAgICAgICAgIGxldCBwb2ludDIgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIodGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aCAvIDIsIHRoYXQuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0KVxyXG4gICAgICAgICAgICAgIGxldCBjYXJ0ZXNpYW4xID0gdGhhdC5zZGsudmlld2VyLnNjZW5lLnBpY2tQb3NpdGlvbihwb2ludDEpXHJcbiAgICAgICAgICAgICAgbGV0IGNhcnRlc2lhbjIgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MilcclxuICAgICAgICAgICAgICBpZiAoY2FydGVzaWFuMSAmJiBjYXJ0ZXNpYW4yKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGlzdGFuY2UyID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UoY2FydGVzaWFuMSwgY2FydGVzaWFuMik7XHJcbiAgICAgICAgICAgICAgICByZXBlYXRYID0gZGlzdGFuY2UyICogMiAvIGRpc3RhbmNlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiByZXBlYXRYO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxldCBzZGszZCA9IGdldDNEVmlldygpXHJcbiAgICAgICAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhhdC5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgICAgIGxldCBvcmlQb3NpdGlvbnMgPSBzZGszZEVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCFDZXNpdW0uZGVmaW5lZChvcmlQb3NpdGlvbnMpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMS4wO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBsZXQgZGlzdGFuY2UgPSAwO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JpUG9zaXRpb25zLmxlbmd0aCAtIDE7ICsraSkge1xyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgKz0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2Uob3JpUG9zaXRpb25zW2ldLCBvcmlQb3NpdGlvbnNbaSArIDFdKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy/lsY/luZXlnZDmoIdcclxuICAgICAgICAgICAgICBsZXQgcG9pbnQxID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDAsIHNkazNkLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0KVxyXG4gICAgICAgICAgICAgIGxldCBwb2ludDIgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoc2RrM2Qudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aCAvIDIsIHNkazNkLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0KVxyXG4gICAgICAgICAgICAgIGxldCBjYXJ0ZXNpYW4xID0gc2RrM2Qudmlld2VyLnNjZW5lLnBpY2tQb3NpdGlvbihwb2ludDEpXHJcbiAgICAgICAgICAgICAgbGV0IGNhcnRlc2lhbjIgPSBzZGszZC52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MilcclxuICAgICAgICAgICAgICBpZiAoY2FydGVzaWFuMSAmJiBjYXJ0ZXNpYW4yKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGlzdGFuY2UyID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UoY2FydGVzaWFuMSwgY2FydGVzaWFuMik7XHJcbiAgICAgICAgICAgICAgICByZXBlYXRYID0gZGlzdGFuY2UyICogMiAvIGRpc3RhbmNlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiByZXBlYXRYO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSA3OiAvL+a1geWKqOeureWktDFcclxuICAgICAgY2FzZSA4OiAvL+a1geWKqOeureWktDJcclxuICAgICAgY2FzZSA5OiAvL+a1geWKqOeureWktDNcclxuICAgICAgY2FzZSAxMDogLy/mtYHliqjnrq3lpLQ0XHJcbiAgICAgIGNhc2UgMTE6IC8v5rWB5Yqo566t5aS0NVxyXG4gICAgICBjYXNlIDEyOiAvL+a1geWKqOeureWktDZcclxuICAgICAgICBsZXQgcGFyYW0gPSB7XHJcbiAgICAgICAgICBjb2xvcjogY29sb3IsXHJcbiAgICAgICAgICBpbWFnZTogdGhpcy5nZXRTb3VyY2VSb290UGF0aCgpICsgYC9pbWcvYXJyb3cvJHt0eXBlIC0gNn0ucG5nYCxcclxuICAgICAgICAgIHNwYWNlOiBuZXdQYXJhbS5zcGFjZSxcclxuICAgICAgICAgIHNwZWVkOiBuZXdQYXJhbS5zcGVlZFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGFyYW0uc3BlZWQgPSBuZXdQYXJhbS5yb3RhdGUgPyBwYXJhbS5zcGVlZCA6IDAgLSBwYXJhbS5zcGVlZFxyXG5cclxuICAgICAgICB0aGlzLmdldEZsb3dUZXh0dXJlKHRoaXMsIHBhcmFtLCBlbnRpdHkpXHJcblxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgbWF0ZXJpYWwgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKGNvbG9yKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWF0ZXJpYWxcclxuICB9XHJcblxyXG4gIGdldEZsb3dUZXh0dXJlKHRoYXQsIG9wdGlvbnMsIGVudGl0eSkge1xyXG5cclxuICAgIGNvbnN0IGNhbnZhc0VsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgY29uc3QgY3R4ID0gY2FudmFzRWxlLmdldENvbnRleHQoJzJkJylcclxuICAgIGNvbnN0IG15SW1nID0gbmV3IEltYWdlKClcclxuICAgIC8vIG15SW1nLnNyYyA9IHRoYXQuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL2Fycm93LzEucG5nJ1xyXG4gICAgbXlJbWcuc3JjID0gb3B0aW9ucy5pbWFnZVxyXG4gICAgbXlJbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICBvcHRpb25zLnNwYWNlID0gTWF0aC5tYXgoMC4xLCBvcHRpb25zLnNwYWNlKTtcclxuICAgICAgaWYgKG9wdGlvbnMuc3BlZWQgPiAwIHx8IG9wdGlvbnMuc3BlZWQgPT0gMCkge1xyXG4gICAgICAgIGNhbnZhc0VsZS53aWR0aCA9IG15SW1nLndpZHRoICogKG9wdGlvbnMuc3BhY2UgKyAxKVxyXG4gICAgICAgIGNhbnZhc0VsZS5oZWlnaHQgPSBteUltZy5oZWlnaHRcclxuICAgICAgICBjdHguZHJhd0ltYWdlKG15SW1nLCBteUltZy53aWR0aCAqIChvcHRpb25zLnNwYWNlIC8gMiksIDApXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjYW52YXNFbGUud2lkdGgsIGNhbnZhc0VsZS5oZWlnaHQpO1xyXG4gICAgICAgIGNhbnZhc0VsZS53aWR0aCA9IG15SW1nLndpZHRoICogKG9wdGlvbnMuc3BhY2UgKyAxKVxyXG4gICAgICAgIGNhbnZhc0VsZS5oZWlnaHQgPSBteUltZy5oZWlnaHRcclxuICAgICAgICBjdHguc2F2ZSgpOyAvLyDkv53lrZjlvZPliY3nirbmgIFcclxuICAgICAgICBjdHgudHJhbnNsYXRlKGNhbnZhc0VsZS53aWR0aCAvIDIsIGNhbnZhc0VsZS5oZWlnaHQgLyAyKTsgLy8g56e75Yqo5Y6f54K56Iez5Lit5b+DXHJcbiAgICAgICAgY3R4LnJvdGF0ZShNYXRoLlBJKTsgLy8g77yI5byn5bqm5Yi277yJXHJcbiAgICAgICAgY3R4LnRyYW5zbGF0ZSgtY2FudmFzRWxlLndpZHRoIC8gMiwgLWNhbnZhc0VsZS5oZWlnaHQgLyAyKTsgLy8g56e75Zue5Y6f54K5XHJcbiAgICAgICAgY3R4LmRyYXdJbWFnZShteUltZywgbXlJbWcud2lkdGggKiAob3B0aW9ucy5zcGFjZSAvIDIpLCAwKVxyXG4gICAgICAgIGN0eC5yZXN0b3JlKCk7IC8vIOaBouWkjeeKtuaAgVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBsZXQgcmVwZWF0ID0gZ2V0UmVwZWF0KClcclxuICAgICAgLy8gfSwgZmFsc2UpXHJcbiAgICAgIC8vIGVudGl0eS5wb2x5bGluZS5tYXRlcmlhbC5vcmlSZXBlYXQgPSB0aGF0LmdldFNjZWVuTGluZShlbnRpdHksIG9wdGlvbnMsIGNhbnZhc0VsZSlcclxuICAgICAgLy8gZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsLm9yaVNwZWVkID0gdW5kZWZpbmVkXHJcbiAgICAgIGxldCBiZWZvcmVTcGVlZCA9IDAsIHJlcGVhdCA9IDBcclxuICAgICAgZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gbmV3IENlc2l1bS5MaW5lVGV4dHVyZU1hdGVyaWFsUHJvcGVydHkoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29sb3I6IG9wdGlvbnMuY29sb3IsXHJcbiAgICAgICAgICBpbWFnZTogY2FudmFzRWxlLFxyXG4gICAgICAgICAgc3BlZWQ6IG9wdGlvbnMuc3BlZWQsXHJcbiAgICAgICAgICByZXBlYXQ6IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhhdC5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IENlc2l1bS5TY2VuZU1vZGUuU0NFTkUzRCkge1xyXG4gICAgICAgICAgICAgIGxldCBwb3NpdGlvblByb3BlcnR5ID0gZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucztcclxuICAgICAgICAgICAgICBsZXQgcG9zaXRpb25zID0gcG9zaXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSh0aGF0LnNkay52aWV3ZXIuY2xvY2suY3VycmVudFRpbWUpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIUNlc2l1bS5kZWZpbmVkKHBvc2l0aW9ucykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMS4wLCAxLjApO1xyXG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIDEuMDtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGxldCBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoIC0gMTsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiAodGhhdC5zZGsudmlld2VyLnNjZW5lLm1vZGU9PT1DZXNpdW0uU2NlbmVNb2RlLlNDRU5FMkQpe31cclxuICAgICAgICAgICAgICAgIGRpc3RhbmNlICs9IENlc2l1bS5DYXJ0ZXNpYW4zLmRpc3RhbmNlKHBvc2l0aW9uc1tpXSwgcG9zaXRpb25zW2kgKyAxXSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBsZXQgcmVwZWF0WCA9IGRpc3RhbmNlIC8gZW50aXR5LnBvbHlsaW5lLndpZHRoLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgLy8g5qC55o2u5Zyw5Zu+57yp5pS+56iL5bqm6LCD5pW0cmVwZWF0WFxyXG4gICAgICAgICAgICAgIGxldCBjYW1lcmFIZWlnaHQgPSB0aGF0LnNkay52aWV3ZXIuY2FtZXJhLnBvc2l0aW9uQ2FydG9ncmFwaGljLmhlaWdodDtcclxuICAgICAgICAgICAgICBsZXQgYm91bmRpbmdTcGhlcmUgPSBuZXcgQ2VzaXVtLkJvdW5kaW5nU3BoZXJlKFxyXG4gICAgICAgICAgICAgICAgbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKC0xMDAwMDAwLCAwLCAwKSwgLy8g5Lit5b+D54K55Z2Q5qCHXHJcbiAgICAgICAgICAgICAgICA1MDAwMDAgLy8g5Y2K5b6E77yI6Led56a777yJXHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8g6I635Y+W57uY5Zu+57yT5Yay5Yy655qE5a695bqm5ZKM6auY5bqm77yI6YCa5bi45piv5bGP5bmV55qE5YiG6L6o546H77yJXHJcbiAgICAgICAgICAgICAgbGV0IGRyYXdpbmdCdWZmZXJXaWR0aCA9IHRoYXQuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgICAgICAgbGV0IGRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGF0LnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgLy8g5L2/55SoIGdldFBpeGVsU2l6ZSDmlrnms5Xojrflj5bljIXlm7TnkIPlnKjlsY/luZXkuIrnmoTlg4/ntKDlpKflsI9cclxuICAgICAgICAgICAgICBsZXQgZ3JvdW5kUmVzb2x1dGlvbiA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5jYW1lcmEuZ2V0UGl4ZWxTaXplKGJvdW5kaW5nU3BoZXJlLCBkcmF3aW5nQnVmZmVyV2lkdGgsIGRyYXdpbmdCdWZmZXJIZWlnaHQpXHJcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdFxyXG4gICAgICAgICAgICAgIGlmIChncm91bmRSZXNvbHV0aW9uID4gNzAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXBlYXRYICo9IGdyb3VuZFJlc29sdXRpb24gLyBjYW1lcmFIZWlnaHQgLyAob3B0aW9ucy5zcGFjZSAqIChjYW52YXNFbGUud2lkdGggLyBjYW52YXNFbGUuaGVpZ2h0ICogNSkgKyAxKTtcclxuICAgICAgICAgICAgICAgIC8vIGlmIChlbnRpdHkucG9seWxpbmUubWF0ZXJpYWwub3JpUmVwZWF0KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3BlZWQgPSByZXBlYXRYIC8gZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFxyXG4gICAgICAgICAgICAgICAgZW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkID0gc3BlZWRcclxuICAgICAgICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYID0gcmVwZWF0WFxyXG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vICAgZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsLm9yaVJlcGVhdCA9IHJlcGVhdFhcclxuICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgIGJlZm9yZVNwZWVkID0gc3BlZWRcclxuICAgICAgICAgICAgICAgIHJlcGVhdCA9IHJlcGVhdFhcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMihyZXBlYXRYLCBzcGVlZCB8fCAxLjApXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMihyZXBlYXQgfHwgZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFgsIGJlZm9yZVNwZWVkIHx8IGVudGl0eS5wb2x5bGluZS5vcmlTcGVlZClcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBsZXQgc2RrM2QgPSBnZXQzRFZpZXcoKVxyXG4gICAgICAgICAgICAgIGxldCBzZGszZEVudGl0eSA9IHNkazNkLnZpZXdlci5lbnRpdGllcy5nZXRCeUlkKHRoYXQub3B0aW9ucy5pZClcclxuICAgICAgICAgICAgICBsZXQgcG9zaXRpb25Qcm9wZXJ0eSA9IHNkazNkRW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucztcclxuICAgICAgICAgICAgICBsZXQgcG9zaXRpb25zID0gcG9zaXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZShzZGszZC52aWV3ZXIuY2xvY2suY3VycmVudFRpbWUpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIUNlc2l1bS5kZWZpbmVkKHBvc2l0aW9ucykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMS4wLCAxLjApO1xyXG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIDEuMDtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGxldCBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoIC0gMTsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiAodGhhdC5zZGsudmlld2VyLnNjZW5lLm1vZGU9PT1DZXNpdW0uU2NlbmVNb2RlLlNDRU5FMkQpe31cclxuICAgICAgICAgICAgICAgIGRpc3RhbmNlICs9IENlc2l1bS5DYXJ0ZXNpYW4zLmRpc3RhbmNlKHBvc2l0aW9uc1tpXSwgcG9zaXRpb25zW2kgKyAxXSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBsZXQgcmVwZWF0WCA9IGRpc3RhbmNlIC8gc2RrM2RFbnRpdHkucG9seWxpbmUud2lkdGguZ2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAvLyDmoLnmja7lnLDlm77nvKnmlL7nqIvluqbosIPmlbRyZXBlYXRYXHJcbiAgICAgICAgICAgICAgbGV0IGNhbWVyYUhlaWdodCA9IHNkazNkLnZpZXdlci5jYW1lcmEucG9zaXRpb25DYXJ0b2dyYXBoaWMuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgIGxldCBib3VuZGluZ1NwaGVyZSA9IG5ldyBDZXNpdW0uQm91bmRpbmdTcGhlcmUoXHJcbiAgICAgICAgICAgICAgICBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoLTEwMDAwMDAsIDAsIDApLCAvLyDkuK3lv4PngrnlnZDmoIdcclxuICAgICAgICAgICAgICAgIDUwMDAwMCAvLyDljYrlvoTvvIjot53nprvvvIlcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAvLyDojrflj5bnu5jlm77nvJPlhrLljLrnmoTlrr3luqblkozpq5jluqbvvIjpgJrluLjmmK/lsY/luZXnmoTliIbovqjnjofvvIlcclxuICAgICAgICAgICAgICBsZXQgZHJhd2luZ0J1ZmZlcldpZHRoID0gc2RrM2Qudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aDtcclxuICAgICAgICAgICAgICBsZXQgZHJhd2luZ0J1ZmZlckhlaWdodCA9IHNkazNkLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAvLyDkvb/nlKggZ2V0UGl4ZWxTaXplIOaWueazleiOt+WPluWMheWbtOeQg+WcqOWxj+W5leS4iueahOWDj+e0oOWkp+Wwj1xyXG4gICAgICAgICAgICAgIGxldCBncm91bmRSZXNvbHV0aW9uID0gc2RrM2Qudmlld2VyLnNjZW5lLmNhbWVyYS5nZXRQaXhlbFNpemUoYm91bmRpbmdTcGhlcmUsIGRyYXdpbmdCdWZmZXJXaWR0aCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgICAgICAgICAgICBsZXQgcmVzdWx0XHJcbiAgICAgICAgICAgICAgaWYgKGdyb3VuZFJlc29sdXRpb24gPiA3MDApIHtcclxuICAgICAgICAgICAgICAgIHJlcGVhdFggKj0gZ3JvdW5kUmVzb2x1dGlvbiAvIGNhbWVyYUhlaWdodCAvIChvcHRpb25zLnNwYWNlICogKGNhbnZhc0VsZS53aWR0aCAvIGNhbnZhc0VsZS5oZWlnaHQgKiA1KSArIDEpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgKGVudGl0eS5wb2x5bGluZS5tYXRlcmlhbC5vcmlSZXBlYXQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzcGVlZCA9IHJlcGVhdFggLyBzZGszZEVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRcclxuICAgICAgICAgICAgICAgIHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkID0gc3BlZWRcclxuICAgICAgICAgICAgICAgIHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFggPSByZXBlYXRYXHJcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gICBlbnRpdHkucG9seWxpbmUubWF0ZXJpYWwub3JpUmVwZWF0ID0gcmVwZWF0WFxyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgYmVmb3JlU3BlZWQgPSBzcGVlZFxyXG4gICAgICAgICAgICAgICAgcmVwZWF0ID0gcmVwZWF0WFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKHJlcGVhdFgsIHNwZWVkIHx8IDEuMClcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKHJlcGVhdCB8fCBzZGszZEVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYLCBiZWZvcmVTcGVlZCB8fCBzZGszZEVudGl0eS5wb2x5bGluZS5vcmlTcGVlZClcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgLy8gcmV0dXJuIHJlcGVhdFg7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgICBsZXQgb3JpUmVwZWF0ID0gdGhhdC5nZXRTY2VlbkxpbmUoZW50aXR5LCBvcHRpb25zLCBjYW52YXNFbGUpXHJcbiAgICAgIG9yaVJlcGVhdCAmJiAoZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdCA9IG9yaVJlcGVhdClcclxuICAgIH1cclxuICB9XHJcbiAgLyoq6I635Y+W5b2T5YmN5ruh5bGP5qiq57q/6YCf5bqmICovXHJcbiAgZ2V0U2NlZW5MaW5lKGVudGl0eSwgb3B0aW9ucywgY2FudmFzRWxlKSB7XHJcbiAgICBsZXQgcG9pbnQxID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDAsIHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0KVxyXG4gICAgbGV0IHBvaW50MiA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMih0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoIC8gMiwgdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAvLyB2YXIgY2FydGVzaWFuMSA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5waWNrUG9zaXRpb24ocG9pbnQxKVxyXG4gICAgLy8gdmFyIGNhcnRlc2lhbjIgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MilcclxuICAgIGxldCByYXkgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmdldFBpY2tSYXkocG9pbnQxKTtcclxuICAgIGxldCBjYXJ0ZXNpYW4xID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5LCB0aGlzLnNkay52aWV3ZXIuc2NlbmUpO1xyXG5cclxuICAgIGxldCByYXkyID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5nZXRQaWNrUmF5KHBvaW50Mik7XHJcbiAgICBsZXQgY2FydGVzaWFuMiA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5waWNrKHJheTIsIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcbiAgICBpZiAoY2FydGVzaWFuMSAmJiBjYXJ0ZXNpYW4yKSB7XHJcbiAgICAgIHZhciBkaXN0YW5jZSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmRpc3RhbmNlKGNhcnRlc2lhbjEsIGNhcnRlc2lhbjIpO1xyXG5cclxuICAgICAgdmFyIHJlcGVhdFggPSBkaXN0YW5jZSAvIGVudGl0eS5wb2x5bGluZS53aWR0aC5nZXRWYWx1ZSgpO1xyXG4gICAgICAvLyDmoLnmja7lnLDlm77nvKnmlL7nqIvluqbosIPmlbRyZXBlYXRYXHJcbiAgICAgIHZhciBjYW1lcmFIZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLnBvc2l0aW9uQ2FydG9ncmFwaGljLmhlaWdodDtcclxuICAgICAgdmFyIGJvdW5kaW5nU3BoZXJlID0gbmV3IENlc2l1bS5Cb3VuZGluZ1NwaGVyZShcclxuICAgICAgICBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoLTEwMDAwMDAsIDAsIDApLCAvLyDkuK3lv4PngrnlnZDmoIdcclxuICAgICAgICA1MDAwMDAgLy8g5Y2K5b6E77yI6Led56a777yJXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyDojrflj5bnu5jlm77nvJPlhrLljLrnmoTlrr3luqblkozpq5jluqbvvIjpgJrluLjmmK/lsY/luZXnmoTliIbovqjnjofvvIlcclxuICAgICAgdmFyIGRyYXdpbmdCdWZmZXJXaWR0aCA9IHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50V2lkdGg7XHJcbiAgICAgIHZhciBkcmF3aW5nQnVmZmVySGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgICAvLyDkvb/nlKggZ2V0UGl4ZWxTaXplIOaWueazleiOt+WPluWMheWbtOeQg+WcqOWxj+W5leS4iueahOWDj+e0oOWkp+Wwj1xyXG4gICAgICB2YXIgZ3JvdW5kUmVzb2x1dGlvbiA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jYW1lcmEuZ2V0UGl4ZWxTaXplKGJvdW5kaW5nU3BoZXJlLCBkcmF3aW5nQnVmZmVyV2lkdGgsIGRyYXdpbmdCdWZmZXJIZWlnaHQpXHJcbiAgICAgIC8vIHJlcGVhdFggKj0gZ3JvdW5kUmVzb2x1dGlvbiAvIGNhbWVyYUhlaWdodCAvICgobXlJbWcud2lkdGggLyBteUltZy5oZWlnaHQgKiA1KSArIDEpO1xyXG4gICAgICBpZiAoZ3JvdW5kUmVzb2x1dGlvbiA+IDcwMCkge1xyXG4gICAgICAgIHJlcGVhdFggKj0gZ3JvdW5kUmVzb2x1dGlvbiAvIGNhbWVyYUhlaWdodCAvIChvcHRpb25zLnNwYWNlICogKGNhbnZhc0VsZS53aWR0aCAvIGNhbnZhc0VsZS5oZWlnaHQgKiA1KSArIDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlcGVhdFggPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gQ2VzaXVtLlNjZW5lTW9kZS5TQ0VORTNEKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcGVhdFhcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgc2RrM2QgPSBnZXQzRFZpZXcoKVxyXG4gICAgICAgIGxldCBzZGszZEVudGl0eSA9IHNkazNkLnZpZXdlci5lbnRpdGllcy5nZXRCeUlkKHRoaXMub3B0aW9ucy5pZClcclxuICAgICAgICByZXR1cm4gc2RrM2RFbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKuWIm+W7uuebtOeureWktOWbvueJhyovXHJcbiAgY3JlYXRlX2Fycm93MV9waWN0dXJlKGNvbG9yKSB7XHJcbiAgICBsZXQgY2FudmFzID0gbmV3IGZhYnJpYy5DYW52YXMoJ2NhbnZhcycpXHJcbiAgICBjYW52YXMud2lkdGggPSAxNTBcclxuICAgIGNhbnZhcy5oZWlnaHQgPSA3NVxyXG4gICAgbGV0IHdfb2Zmc2V0ID0gMzVcclxuICAgIGxldCBoX29mZnNldCA9IDIwXHJcbiAgICBsZXQgZmlsbCA9IGNvbG9yXHJcbiAgICBsZXQgcG9seWdvbiA9IG5ldyBmYWJyaWMuUG9seWdvbihcclxuICAgICAgW1xyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoLCB5OiBjYW52YXMuaGVpZ2h0IC8gMiB9LCAvL+eureWktOWPs+i+uemhtueCuVxyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC0gd19vZmZzZXQsIHk6IGNhbnZhcy5oZWlnaHQgfSwgLy/pobrml7bpkohcclxuICAgICAgICB7IHg6IGNhbnZhcy53aWR0aCAtIHdfb2Zmc2V0LCB5OiBjYW52YXMuaGVpZ2h0IC0gaF9vZmZzZXQgfSwgLy9cclxuICAgICAgICB7IHg6IGNhbnZhcy53aWR0aCAvIDIsIHk6IGNhbnZhcy5oZWlnaHQgLSBoX29mZnNldCB9LCAvL1xyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC8gMiwgeTogaF9vZmZzZXQgfSwgLy9cclxuICAgICAgICB7IHg6IGNhbnZhcy53aWR0aCAtIHdfb2Zmc2V0LCB5OiBoX29mZnNldCB9LCAvL1xyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC0gd19vZmZzZXQsIHk6IDAgfSwgLy9cclxuICAgICAgXSxcclxuICAgICAge1xyXG4gICAgICAgIGZpbGwsXHJcbiAgICAgIH1cclxuICAgIClcclxuICAgIGNhbnZhcy5hZGQocG9seWdvbilcclxuXHJcbiAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgpXHJcbiAgfVxyXG5cclxuICAvKuWIm+W7uueureWktOWbvueJhyovXHJcblxyXG4gIGNyZWF0ZV9hcnJvdzJfcGljdHVyZShjb2xvcikge1xyXG4gICAgbGV0IGNhbnZhcyA9IG5ldyBmYWJyaWMuQ2FudmFzKCdjYW52YXMnKVxyXG4gICAgY2FudmFzLndpZHRoID0gNzVcclxuICAgIGNhbnZhcy5oZWlnaHQgPSA3NVxyXG4gICAgbGV0IHdfb2Zmc2V0MSA9IDM1XHJcbiAgICBsZXQgd19vZmZzZXQyID0gNDBcclxuICAgIGxldCBmaWxsID0gY29sb3JcclxuICAgIGxldCBwb2x5Z29uID0gbmV3IGZhYnJpYy5Qb2x5Z29uKFxyXG4gICAgICBbXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGgsIHk6IGNhbnZhcy5oZWlnaHQgLyAyIH0sXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldDEsIHk6IGNhbnZhcy5oZWlnaHQgfSxcclxuICAgICAgICB7IHg6IGNhbnZhcy53aWR0aCAtIHdfb2Zmc2V0MSAtIHdfb2Zmc2V0MiwgeTogY2FudmFzLmhlaWdodCB9LFxyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC0gd19vZmZzZXQyLCB5OiBjYW52YXMuaGVpZ2h0IC8gMiB9LFxyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC0gd19vZmZzZXQxIC0gd19vZmZzZXQyLCB5OiAwIH0sXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldDEsIHk6IDAgfSxcclxuICAgICAgXSxcclxuICAgICAge1xyXG4gICAgICAgIGZpbGwsXHJcbiAgICAgIH1cclxuICAgIClcclxuICAgIGNhbnZhcy5hZGQocG9seWdvbilcclxuXHJcbiAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgpXHJcbiAgfVxyXG5cclxuICBzYW1wbGVIZWlnaHRNb3N0RGV0YWlsZWQocG9zaXRpb25zKSB7XHJcbiAgICBsZXQgY2FydGVzaWFucyA9IFtdXHJcbiAgICBwb3NpdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBjYXJ0ZXNpYW5zLnB1c2gobmV3IENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMoaXRlbS5sbmcsIGl0ZW0ubGF0KSlcclxuICAgIH0pXHJcbiAgICByZXR1cm4gdGhpcy5zZGsudmlld2VyLnNjZW5lLnNhbXBsZUhlaWdodE1vc3REZXRhaWxlZChjYXJ0ZXNpYW5zKVxyXG4gIH1cclxuXHJcbiAgZmx5SG9tZShkdXJhdGlvbiA9IDMpIHtcclxuICAgIHNldEFjdGl2ZVZpZXdlcigwKVxyXG4gICAgY2xvc2VSb3RhdGVBcm91bmQodGhpcy5zZGspXHJcbiAgICBjbG9zZVZpZXdGb2xsb3codGhpcy5zZGspXHJcblxyXG4gICAgaWYgKHRoaXMuc2RrLnZpZXdlci5DQU1FUkFfREVGQVVMVF9WSUVXX1JFQ1RBTkdMRSkge1xyXG4gICAgICBsZXQgZGVzdGluYXRpb24gPSB0aGlzLnNkay52aWV3ZXIuQ0FNRVJBX0RFRkFVTFRfVklFV19SRUNUQU5HTEUuZGVzdGluYXRpb25cclxuICAgICAgbGV0IG9yaWVudGF0aW9uID0gdGhpcy5zZGsudmlld2VyLkNBTUVSQV9ERUZBVUxUX1ZJRVdfUkVDVEFOR0xFLm9yaWVudGF0aW9uXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG8oe1xyXG4gICAgICAgIGRlc3RpbmF0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhkZXN0aW5hdGlvbi5sbmcsIGRlc3RpbmF0aW9uLmxhdCwgZGVzdGluYXRpb24uYWx0KSxcclxuICAgICAgICBvcmllbnRhdGlvbjoge1xyXG4gICAgICAgICAgaGVhZGluZzogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKG9yaWVudGF0aW9uLmhlYWRpbmcgfHwgMCksXHJcbiAgICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKG9yaWVudGF0aW9uLnBpdGNoIHx8IDApLFxyXG4gICAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKG9yaWVudGF0aW9uLnJvbGwgfHwgMClcclxuICAgICAgICB9LFxyXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5SG9tZShkdXJhdGlvbilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDorr7nva7mi77lj5bmk43kvZzlkK/lgZxcclxuICAgKiBAbWV0aG9kIHNldFBpY2tTdGF0dXNcclxuICAgKiBAcGFyYW0gW3N0YXR1cz10cnVlXSB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyT2YgVG9vbHNcclxuICAgKiAqL1xyXG4gIHNldFBpY2tTdGF0dXMoc3RhdHVzID0gdHJ1ZSkge1xyXG4gICAgLy8gWUouZ2V0RWFydGgoKS5pbnRlcmFjdGlvbi5waWNraW5nLmVuYWJsZWQgPSBzdGF0dXNcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDliJvlu7rngrnnvJPlhrLljLog6L+U5Zue57yT5Yay5Yy65Z2Q5qCHXHJcbiAgICogQG1ldGhvZCBjcmVhdGVfcG9pbnRfYnVmZmVyXHJcbiAgICogQHBhcmFtIHBvaW50IHtvYmplY3R9IOWdkOagh+WPguaVsFxyXG4gICAqIEBwYXJhbSBbcmFkaXVzPTVdIHtudW1iZXJ9IOe8k+WGsui3neemuyAg77yI5Y2V5L2N77ya57Gz77yJXHJcbiAgICogQHBhcmFtIG9wdGlvblxyXG4gICAqIEBwYXJhbSBwb2ludC5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIHBvaW50LmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAbWVtYmVyT2YgVG9vbHNcclxuICAgKiBAcmV0dXJucyB7QXJyYXl9IOi/lOWbnue8k+WGsuWMuuWdkOagh+aVsOe7hFxyXG4gICAqL1xyXG4gIGNyZWF0ZV9wb2ludF9idWZmZXIocG9pbnQsIHJhZGl1cyA9IDUsIG9wdGlvbiA9IHsgc3RlcHM6IDEwIH0pIHtcclxuICAgIGxldCBwID0gdHVyZi5wb2ludChbTnVtYmVyKHBvaW50LmxuZyksIE51bWJlcihwb2ludC5sYXQpXSlcclxuICAgIGxldCBidWZmZXJlZCA9IHR1cmYuYnVmZmVyKHAsIE51bWJlcihyYWRpdXMpIC8gMTAwMCwgb3B0aW9uKVxyXG4gICAgcmV0dXJuIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24g5Yib5bu657q/57yT5Yay5Yy6IOi/lOWbnue8k+WGsuWMuuWdkOagh1xyXG4gICAqIEBtZXRob2QgY3JlYXRlX2xpbmVfYnVmZmVyXHJcbiAgICogQHBhcmFtIHBvaW50cyB7QXJyYXkuPGxuZzpcIlwiLGxhdDpcIlwiPn0g5Z2Q5qCH5Y+C5pWwXHJcbiAgICogQHBhcmFtIFtyYWRpdXM9NV0ge251bWJlcn0g57yT5Yay6Led56a7ICDvvIjljZXkvY3vvJrnsbPvvIlcclxuICAgKiBAbWVtYmVyT2YgVG9vbHNcclxuICAgKiBAcmV0dXJucyB7QXJyYXl9IOi/lOWbnue8k+WGsuWMuuWdkOagh+aVsOe7hFxyXG4gICAqIEBleGFtcGxlIGxldCBwb2ludHMgPSBbe2xuZzpcIlwiLGxhdDpcIlwifSx7bG5nOlwiXCIsbGF0OlwiXCJ9LHtsbmc6XCJcIixsYXQ6XCJcIn1dXHJcbiAgICogbGV0IHJhZGl1cyA9IDEwXHJcbiAgICogbGV0IGFyZWFfYnVmZmVyID0gc2RrLmNyZWF0ZV9saW5lX2J1ZmZlcihwb2ludHMscmFkaXVzKVxyXG4gICAqICovXHJcbiAgY3JlYXRlX2xpbmVfYnVmZmVyKHBvaW50cywgcmFkaXVzID0gNSkge1xyXG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlX3BvaW50X2J1ZmZlcihwb2ludHNbMF0sIHJhZGl1cylcclxuICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBhcnIgPSBbXVxyXG4gICAgICBwb2ludHMuZm9yRWFjaCgocG9pbnQpID0+IHtcclxuICAgICAgICBhcnIucHVzaChbTnVtYmVyKHBvaW50LmxuZyksIE51bWJlcihwb2ludC5sYXQpXSlcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxpbmUgPSB0dXJmLmxpbmVTdHJpbmcoYXJyKVxyXG4gICAgICBsZXQgYnVmZmVyZWQgPSB0dXJmLmJ1ZmZlcihsaW5lLCBOdW1iZXIocmFkaXVzKSAvIDEwMDApXHJcbiAgICAgIHJldHVybiBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIOWIm+W7uumdoue8k+WGsuWMuiDov5Tlm57nvJPlhrLljLrlnZDmoIdcclxuICAgKiBAbWV0aG9kIGNyZWF0ZV9hcmVhX2J1ZmZlclxyXG4gICAqIEBwYXJhbSBwb2ludHMge0FycmF5Ljxsbmc6XCJcIixsYXQ6XCJcIj59IOWdkOagh+WPguaVsFxyXG4gICAqIEBwYXJhbSBbcmFkaXVzPTVdIHtudW1iZXJ9IOe8k+WGsui3neemuyAg77yI5Y2V5L2N77ya57Gz77yJXHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcbiAgICogQHJldHVybnMge0FycmF5fSDov5Tlm57nvJPlhrLljLrlnZDmoIfmlbDnu4RcclxuICAgKiBAZXhhbXBsZSBsZXQgcG9pbnRzID0gW3tsbmc6XCJcIixsYXQ6XCJcIn0se2xuZzpcIlwiLGxhdDpcIlwifSx7bG5nOlwiXCIsbGF0OlwiXCJ9XVxyXG4gICAqIGxldCByYWRpdXMgPSAxMFxyXG4gICAqIGxldCBhcmVhX2J1ZmZlciA9IHNkay5jcmVhdGVfYXJlYV9idWZmZXIocG9pbnRzLHJhZGl1cylcclxuICAgKiAqL1xyXG4gIGNyZWF0ZV9hcmVhX2J1ZmZlcihwb2ludHMsIHJhZGl1cyA9IDUpIHtcclxuICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZV9wb2ludF9idWZmZXIocG9pbnRzWzBdLCByYWRpdXMpXHJcbiAgICB9IGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9IGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlX2xpbmVfYnVmZmVyKHBvaW50cywgcmFkaXVzKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGFyciA9IFtdXHJcbiAgICAgIHBvaW50cy5mb3JFYWNoKChwb2ludCkgPT4ge1xyXG4gICAgICAgIGFyci5wdXNoKFtOdW1iZXIocG9pbnQubG5nKSwgTnVtYmVyKHBvaW50LmxhdCldKVxyXG4gICAgICB9KVxyXG4gICAgICBhcnIucHVzaChhcnJbMF0pXHJcbiAgICAgIGxldCBwb2x5ID0gdHVyZi5wb2x5Z29uKFthcnJdKVxyXG4gICAgICBsZXQgYnVmZmVyZWQgPSB0dXJmLmJ1ZmZlcihwb2x5LCBOdW1iZXIocmFkaXVzKSAvIDEwMDApXHJcbiAgICAgIHJldHVybiBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg6K6h566X5aSa54K56IyD5Zu0XHJcbiAgICogQG1ldGhvZCBjYWxfZW52ZWxvcGVcclxuICAgKiBAbWVtYmVyT2YgVG9vbHNcclxuICAgKiAqL1xyXG4gIGNhbF9lbnZlbG9wZShwb2ludHMgPSBbXSkge1xyXG4gICAgaWYgKHBvaW50cy5sZW5ndGggPCAyKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ+WdkOagh+aVsOmHj+S4jeiDveWwkeS6jjLkuKonKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGFyciA9IFtdXHJcbiAgICAgIHBvaW50cy5mb3JFYWNoKChwKSA9PiB7XHJcbiAgICAgICAgYXJyLnB1c2godHVyZi5wb2ludChbcC5sbmcsIHAubGF0XSkpXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oYXJyKVxyXG4gICAgICByZXR1cm4gdHVyZi5lbnZlbG9wZShmZWF0dXJlcykuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIOaMieaMh+Wumui3neemu+WIhuautVxyXG4gICAqIEBtZXRob2QgY2h1bmtMaW5lXHJcbiAgICogQHBhcmFtIHBvc2l0aW9ucyB7QXJyYXl9XHJcbiAgICogQHBhcmFtIG1ldGVyc1xyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqICovXHJcbiAgY2h1bmtMaW5lKHBvc2l0aW9ucyA9IFtdLCBtZXRlcnMgPSAxMDAwKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIFtdXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgYXJyID0gW11cclxuICAgICAgcG9zaXRpb25zLmZvckVhY2goKGl0KSA9PiB7XHJcbiAgICAgICAgYXJyLnB1c2goW2l0LmxuZywgaXQubGF0XSlcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxpbmUgPSB0dXJmLmxpbmVTdHJpbmcoYXJyKVxyXG5cclxuICAgICAgbGV0IGNodW5rID0gdHVyZi5saW5lQ2h1bmsobGluZSwgbWV0ZXJzIC8gMTAwMClcclxuICAgICAgbGV0IF9fbWFwID0gbmV3IE1hcCgpXHJcbiAgICAgIGNodW5rLmZlYXR1cmVzLmZvckVhY2goKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdmFsdWUuZ2VvbWV0cnkuY29vcmRpbmF0ZXMuZm9yRWFjaCgodmFsdWUxKSA9PiB7XHJcbiAgICAgICAgICBsZXQga2V5ID0gdmFsdWUxLmpvaW4oJywnKVxyXG4gICAgICAgICAgbGV0IHZhbCA9IHsgbG5nOiB2YWx1ZTFbMF0sIGxhdDogdmFsdWUxWzFdIH1cclxuICAgICAgICAgIF9fbWFwLnNldChrZXksIHZhbClcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgICByZXR1cm4gY2h1bmsuZmVhdHVyZXNcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIOagh+azqOS7pXNpbnjnmoTljYrkuKrlkajmnJ/nmoTlvaLlvI/lvLnot7NcclxuICAgKiAqL1xyXG4gIGJpbGxib2FyZEFuaW1hdGlvbih2aWV3ZXIsIHsgaWQsIG9mZnNldCA9IDEwLCB0aW1lcyA9IDMgfSkge1xyXG4gICAgbGV0IGVudGl0eSA9IHZpZXdlci5lbnRpdGllcy5nZXRCeUlkKGlkKVxyXG4gICAgaWYgKGVudGl0eSkge1xyXG4gICAgICBsZXQgcGkgPSBNYXRoLlBJXHJcbiAgICAgIGxldCB0dCA9IDYwXHJcbiAgICAgIGxldCBvZiA9IHBpIC8gdHRcclxuXHJcbiAgICAgIGxldCBoID0gMFxyXG4gICAgICBsZXQgc3JjX3AgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KGVudGl0eS5wb3NpdGlvbi5nZXRWYWx1ZSgpLCB2aWV3ZXIpXHJcbiAgICAgIC8vIGxldCBoZWlnaHQgPSBzcmNfcC5hbHRcclxuICAgICAgLy8gZW50aXR5LnBvc2l0aW9uID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCgpID0+IHtcclxuICAgICAgLy8gICBsZXQgaGVpZ2h0ID0gb2Zmc2V0ICogTWF0aC5zaW4oaCkgKyBzcmNfcC5hbHRcclxuICAgICAgLy8gICBoICs9IG9mXHJcbiAgICAgIC8vICAgcmV0dXJuIENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHNyY19wLmxuZywgc3JjX3AubGF0LCBoZWlnaHQpXHJcbiAgICAgIC8vIH0sIGZhbHNlKVxyXG4gICAgICBsZXQgdGkgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgaCArPSBvZlxyXG4gICAgICAgIGxldCBoZWlnaHQgPSBvZmZzZXQgKiBNYXRoLnNpbihoKSArIHNyY19wLmFsdFxyXG4gICAgICAgIGlmIChoID4gcGkpIGggPSAwXHJcbiAgICAgICAgZW50aXR5LnBvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICBzcmNfcC5sbmcsXHJcbiAgICAgICAgICBzcmNfcC5sYXQsXHJcbiAgICAgICAgICBoZWlnaHRcclxuICAgICAgICApXHJcbiAgICAgIH0sIDMwKVxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjbGVhckludGVydmFsKHRpKVxyXG4gICAgICAgIGVudGl0eS5wb3NpdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgc3JjX3AubG5nLFxyXG4gICAgICAgICAgc3JjX3AubGF0LFxyXG4gICAgICAgICAgc3JjX3AuYWx0XHJcbiAgICAgICAgKVxyXG4gICAgICB9LCAzMDAwKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqQGRlc2Mg57uY5Yi25omH5b2iXHJcbiAgICogQG1ldGhvZCBzZWN0b3JcclxuICAgKiBAbWVtYmVyT2YgVG9vbHMqL1xyXG4gIGNhbFNlY3RvcihcclxuICAgIGNlbnRlciA9IHt9LFxyXG4gICAgcmFkaXVzID0gMTAwLFxyXG4gICAgYmVhcmluZzEgPSAyNSxcclxuICAgIGJlYXJpbmcyID0gNDUsXHJcbiAgICBzdGVwcyA9IDM2MCxcclxuICAgIGlzODQgPSBmYWxzZVxyXG4gICkge1xyXG4gICAgbGV0IGMgPSB0dXJmLnBvaW50KFtjZW50ZXIubG5nLCBjZW50ZXIubGF0XSlcclxuICAgIGxldCBjb29yZGluYXRlcyA9IHR1cmYuc2VjdG9yKGMsIHJhZGl1cyAvIDEwMDAsIGJlYXJpbmcxLCBiZWFyaW5nMiwgeyBzdGVwczogc3RlcHMgfSlcclxuICAgICAgLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgICBsZXQgcG9zaXRpb25zID0gW11cclxuICAgIGNvb3JkaW5hdGVzLmZvckVhY2goKGFycmF5KSA9PiB7XHJcbiAgICAgIGFycmF5LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBsZXQgcG9zXHJcbiAgICAgICAgaWYgKGlzODQpIHtcclxuICAgICAgICAgIHBvcyA9IHtcclxuICAgICAgICAgICAgbG5nOiBpdGVtWzBdLFxyXG4gICAgICAgICAgICBsYXQ6IGl0ZW1bMV0sXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcG9zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoaXRlbVswXSwgaXRlbVsxXSlcclxuICAgICAgICB9XHJcbiAgICAgICAgcG9zaXRpb25zLnB1c2gocG9zKVxyXG4gICAgICB9KVxyXG4gICAgfSlcclxuICAgIHJldHVybiBwb3NpdGlvbnNcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNj6I635Y+W57Sn6LS06auY5bqmXHJcbiAgICogQHBhcmFtIHBvc2l0aW9uIOWdkOagh1xyXG4gICAqL1xyXG4gIGFzeW5jIGdldENsYW1wVG9IZWlnaHQocG9zaXRpb24sIG9iamVjdHNUb0V4Y2x1ZGUgPSBbXSkge1xyXG4gICAgaWYgKCF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyKSB7XHJcbiAgICAgIHJldHVybiAwXHJcbiAgICB9XHJcbiAgICBsZXQgcG9zMyA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdCk7XHJcbiAgICBsZXQgcG9zaXRpb24xXHJcbiAgICB0cnkge1xyXG4gICAgICBwb3NpdGlvbjEgPSBhd2FpdCB0aGlzLnNkay52aWV3ZXIuc2NlbmUuY2xhbXBUb0hlaWdodChwb3MzLCBvYmplY3RzVG9FeGNsdWRlKSB8fCBwb3MzXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBwb3NpdGlvbjEgPSBwb3MzXHJcbiAgICB9XHJcbiAgICBsZXQgaGVpZ2h0MSA9IGF3YWl0IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb24xLCB0aGlzLnNkay52aWV3ZXIpLmFsdFxyXG4gICAgbGV0IGhlaWdodDIgPSAwXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5zZGsudmlld2VyLnNjZW5lLnRlcnJhaW5Qcm92aWRlci5hdmFpbGFiaWxpdHkpIHtcclxuICAgICAgICBsZXQgcG9zaXRpb24yID0gYXdhaXQgQ2VzaXVtLnNhbXBsZVRlcnJhaW5Nb3N0RGV0YWlsZWQoXHJcbiAgICAgICAgICB0aGlzLnNkay52aWV3ZXIuc2NlbmUudGVycmFpblByb3ZpZGVyLFxyXG4gICAgICAgICAgW0Nlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMocG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXQpXVxyXG4gICAgICAgIClcclxuICAgICAgICBwb3NpdGlvbjJbMF0uaGVpZ2h0ICYmIChoZWlnaHQyID0gcG9zaXRpb24yWzBdLmhlaWdodClcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgaGVpZ2h0MiA9IDBcclxuICAgIH1cclxuICAgIGlmIChoZWlnaHQxID4gaGVpZ2h0Mikge1xyXG4gICAgICByZXR1cm4gTnVtYmVyKGhlaWdodDEudG9GaXhlZCgyKSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gTnVtYmVyKGhlaWdodDIudG9GaXhlZCgyKSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIOa3seaLt+i0neWvueixoVxyXG4gICAqICovXHJcbiAgZGVlcENvcHlPYmoob2JqKSB7XHJcbiAgICBsZXQgbmV3b2JqID0gbnVsbDtcclxuICAgIC8vIOWkhOeQhuaVsOe7hCAtIOS9v+eUqOWOn+eUn0FycmF55p6E6YCg5Ye95pWw5Yib5bu65paw5pWw57uEXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XHJcbiAgICAgIG5ld29iaiA9IFtdO1xyXG4gICAgICAvLyDlj6rmi7fotJ3mlbDnu4TlhYPntKDvvIzkuI3mi7fotJ3lj6/og73lrZjlnKjnmoTmianlsZXmlrnms5VcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBuZXdvYmpbaV0gPSB0aGlzLmRlZXBDb3B5T2JqKG9ialtpXSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5ld29iajtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpITnkIblr7nosaFcclxuICAgIGVsc2UgaWYgKG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBuZXdvYmogPSB7fTtcclxuICAgICAgZm9yIChsZXQgaSBpbiBvYmopIHtcclxuICAgICAgICAvLyDmjpLpmaTmjIflrprlsZ7mgKflkozmlrnms5XlsZ7mgKdcclxuICAgICAgICBpZiAoaSAhPT0gJ2VhcnRoJyAmJiBpICE9PSAnRGlhbG9nJyAmJiB0eXBlb2Ygb2JqW2ldICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICBuZXdvYmpbaV0gPSB0aGlzLmRlZXBDb3B5T2JqKG9ialtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBuZXdvYmo7XHJcbiAgICB9XHJcbiAgICBlbHNlIG5ld29iaiA9IG9iajtcclxuICAgIHJldHVybiBuZXdvYmo7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyDluqbliIbnp5LovazmjaJcclxuICAgKiAqL1xyXG4gIHByb2pDb252ZXJ0KHN0YXR1cyA9IGZhbHNlLCBjbG9zZUNhbGxCYWNrID0gKCkgPT4geyB9KSB7XHJcbiAgICBpZiAoc3RhdHVzKSB7XHJcbiAgICAgIHByb2pDb252ZXJ0T3Blbih0aGlzLnNkaywgY2xvc2VDYWxsQmFjaylcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBwcm9qQ29udmVydENsb3NlKClcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg5oqV5b2x6L2s5o2iXHJcbiAgICogKi9cclxuICBwcm9qZWN0aW9uQ29udmVydChzdGF0dXMgPSBmYWxzZSwgY2xvc2VDYWxsQmFjayA9ICgpID0+IHsgfSkge1xyXG4gICAgaWYgKHN0YXR1cykge1xyXG4gICAgICBwcm9qZWN0aW9uQ29udmVydE9wZW4odGhpcy5zZGssIGNsb3NlQ2FsbEJhY2spXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcHJvamVjdGlvbkNvbnZlcnRDbG9zZSgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyDlr7zlh7pleGNlbFxyXG4gICAqL1xyXG4gIC8vIOWvvOWHuuWxnuaAp1xyXG4gIGV4cG9ydEV4Y2VsKGRhdGEpIHtcclxuICAgIGxldCBsYWJlbCA9ICc8Um93PidcclxuICAgIGZvciAobGV0IGtleSBpbiBkYXRhWzBdKSB7XHJcbiAgICAgIGxhYmVsICs9IGA8Q2VsbD48RGF0YSBzczpUeXBlPVwiU3RyaW5nXCI+JHtrZXl9PC9EYXRhPjwvQ2VsbD5gXHJcbiAgICB9XHJcbiAgICBsYWJlbCArPSAnPC9Sb3c+J1xyXG4gICAgbGV0IHVybCA9ICdkYXRhOmFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbDtiYXNlNjQsJyxcclxuICAgICAgdG1wbFdvcmtib29rWE1MID0gJzw/eG1sIHZlcnNpb249XCIxLjBcIj8+PD9tc28tYXBwbGljYXRpb24gcHJvZ2lkPVwiRXhjZWwuU2hlZXRcIj8+PFdvcmtib29rIHhtbG5zPVwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6c3ByZWFkc2hlZXRcIiB4bWxuczpzcz1cInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOnNwcmVhZHNoZWV0XCI+J1xyXG4gICAgICAgICsgJzxEb2N1bWVudFByb3BlcnRpZXMgeG1sbnM9XCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2VcIj48QXV0aG9yPkF4ZWwgUmljaHRlcjwvQXV0aG9yPjxDcmVhdGVkPntjcmVhdGVkfTwvQ3JlYXRlZD48L0RvY3VtZW50UHJvcGVydGllcz4nXHJcbiAgICAgICAgKyAnPFN0eWxlcz4nXHJcbiAgICAgICAgKyAnPFN0eWxlIHNzOklEPVwiQ3VycmVuY3lcIj48TnVtYmVyRm9ybWF0IHNzOkZvcm1hdD1cIkN1cnJlbmN5XCI+PC9OdW1iZXJGb3JtYXQ+PC9TdHlsZT4nXHJcbiAgICAgICAgKyAnPFN0eWxlIHNzOklEPVwiRGF0ZVwiPjxOdW1iZXJGb3JtYXQgc3M6Rm9ybWF0PVwiTWVkaXVtIERhdGVcIj48L051bWJlckZvcm1hdD48L1N0eWxlPidcclxuICAgICAgICArICc8L1N0eWxlcz4nXHJcbiAgICAgICAgKyAne3dvcmtzaGVldHN9PC9Xb3JrYm9vaz4nXHJcbiAgICAgICwgdG1wbFdvcmtzaGVldFhNTCA9ICc8V29ya3NoZWV0IHNzOk5hbWU9XCJ7bmFtZVdTfVwiPjxUYWJsZT48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIyNDBcIi8+e3Jvd3N9PC9UYWJsZT48L1dvcmtzaGVldD4nXHJcbiAgICAgICwgdG1wbENlbGxYTUwgPSAnPENlbGw+PERhdGEgc3M6VHlwZT1cIntuYW1lVHlwZX1cIj57ZGF0YX08L0RhdGE+PC9DZWxsPidcclxuICAgICAgLCBiYXNlNjQgPSBmdW5jdGlvbiAocykge1xyXG4gICAgICAgIHJldHVybiB3aW5kb3cuYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQocykpKVxyXG4gICAgICB9XHJcbiAgICAgICwgZm9ybWF0ID0gZnVuY3Rpb24gKHMsIGMpIHtcclxuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC97KFxcdyspfS9nLCBmdW5jdGlvbiAobSwgcCkge1xyXG4gICAgICAgICAgcmV0dXJuIGNbcF07XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgIGxldCBjdHggPSBcIlwiO1xyXG4gICAgbGV0IHdvcmtib29rWE1MID0gXCJcIjtcclxuICAgIGxldCB3b3Jrc2hlZXRzWE1MID0gXCJcIjtcclxuICAgIGxldCByb3dzWE1MID0gXCJcIjtcclxuXHJcbiAgICBsZXQgcGlsID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoaSA9PSAwKSB7XHJcbiAgICAgICAgcm93c1hNTCArPSBsYWJlbFxyXG4gICAgICB9XHJcbiAgICAgIHJvd3NYTUwgKz0gJzxSb3c+JztcclxuICAgICAgZm9yIChsZXQga2V5IGluIGRhdGFbaV0pIHtcclxuICAgICAgICBjdHggPSB7XHJcbiAgICAgICAgICBuYW1lVHlwZTogJ1N0cmluZycsXHJcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldW2tleV1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJvd3NYTUwgKz0gZm9ybWF0KHRtcGxDZWxsWE1MLCBjdHgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJvd3NYTUwgKz0gJzwvUm93Pic7XHJcbiAgICAgIGlmIChpID4gMCAmJiAoaSAvIDYwMDAwKSAlIDEgPT09IDApIHtcclxuICAgICAgICBwaWwrKztcclxuICAgICAgICBjdHggPSB7IHJvd3M6IHJvd3NYTUwsIG5hbWVXUzogJ1NoZWV0JyArIGkgfTtcclxuICAgICAgICB3b3Jrc2hlZXRzWE1MICs9IGZvcm1hdCh0bXBsV29ya3NoZWV0WE1MLCBjdHgpO1xyXG4gICAgICAgIHJvd3NYTUwgPSBcIlwiO1xyXG4gICAgICAgIHJvd3NYTUwgKz0gbGFiZWxcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY3R4ID0geyByb3dzOiByb3dzWE1MLCBuYW1lV1M6ICdTaGVldCcgfTtcclxuICAgIHdvcmtzaGVldHNYTUwgKz0gZm9ybWF0KHRtcGxXb3Jrc2hlZXRYTUwsIGN0eCk7XHJcbiAgICByb3dzWE1MID0gXCJcIjtcclxuICAgIGN0eCA9IHsgY3JlYXRlZDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSwgd29ya3NoZWV0czogd29ya3NoZWV0c1hNTCB9O1xyXG4gICAgd29ya2Jvb2tYTUwgPSBmb3JtYXQodG1wbFdvcmtib29rWE1MLCBjdHgpO1xyXG4gICAgbGV0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiQVwiKTtcclxuICAgIGxpbmsuaHJlZiA9IHVybCArIGJhc2U2NCh3b3JrYm9va1hNTCk7XHJcbiAgICBsaW5rLmRvd25sb2FkID0gXCLnn6Lph4/mlbDmja7lr7zlh7oueGxzXCJcclxuICAgIGxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgbGluay5jbGljaygpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIEd6aXDop6PljotcclxuICAgKi9cclxuICBkZWNvbXByZXNzR3ppcChjb21wcmVzc2VkRGF0YSkge1xyXG4gICAgbGV0IGRlY29tcHJlc3NlZERhdGEgPSBwYWtvLmluZmxhdGUoY29tcHJlc3NlZERhdGEpO1xyXG4gICAgLy8g5bCG6Kej5Y6L57yp5ZCO55qE5pWw5o2u6L2s5o2i5Li65a2X56ym5LiyXHJcbiAgICBsZXQgZGVjb21wcmVzc2VkU3RyaW5nID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGRlY29tcHJlc3NlZERhdGEpO1xyXG4gICAgcmV0dXJuIGRlY29tcHJlc3NlZFN0cmluZ1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2MgY215a+i9rHJiZ1xyXG4gICAqIEBwYXJhbSB7Kn0gY29sb3JcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGNteWtUb1JnYihjb2xvcikge1xyXG4gICAgbGV0IHsgYywgbSwgeSwgayB9ID0gY29sb3JcclxuICAgIGxldCByZ2IgPSB7IHI6IDAsIGc6IDAsIGI6IDAgfTtcclxuICAgIHJnYi5jID0gYyAvIDEwMDtcclxuICAgIHJnYi5tID0gbSAvIDEwMDtcclxuICAgIHJnYi55ID0geSAvIDEwMDtcclxuICAgIHJnYi5rID0gayAvIDEwMDtcclxuICAgIHJnYi5yID0gMSAtIE1hdGgubWluKDEsIHJnYi5jICogKDEgLSByZ2IuaykgKyByZ2Iuayk7XHJcbiAgICByZ2IuZyA9IDEgLSBNYXRoLm1pbigxLCByZ2IubSAqICgxIC0gcmdiLmspICsgcmdiLmspO1xyXG4gICAgcmdiLmIgPSAxIC0gTWF0aC5taW4oMSwgcmdiLnkgKiAoMSAtIHJnYi5rKSArIHJnYi5rKTtcclxuICAgIHJnYi5yID0gTWF0aC5yb3VuZChyZ2IuciAqIDI1NSk7XHJcbiAgICByZ2IuZyA9IE1hdGgucm91bmQocmdiLmcgKiAyNTUpXHJcbiAgICByZ2IuYiA9IE1hdGgucm91bmQocmdiLmIgKiAyNTUpO1xyXG4gICAgcmV0dXJuIGByZ2IoJHtyZ2Iucn0sICR7cmdiLmd9LCAke3JnYi5ifSlgO1xyXG4gIH1cclxuXHJcbiAgY29udmVydFB4VG9SZW0oc2RrLCBzZWxlY3Rvcikge1xyXG4gICAgY29uc3QgaHRtbEZvbnRTaXplID0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZm9udFNpemUpO1xyXG4gICAgbGV0IGxpc3QgPSBbXVxyXG4gICAgbGV0IGVsZW1lbnRMaXN0ID0gW11cclxuICAgIGlmIChzZWxlY3Rvcikge1xyXG4gICAgICBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2RrLmRpdl9pZCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZWxlbWVudExpc3QucHVzaChsaXN0W2ldLCAuLi5saXN0W2ldLnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGVsZW1lbnRMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2RrLmRpdl9pZCkucXVlcnlTZWxlY3RvckFsbCgnKicpO1xyXG4gICAgfVxyXG4gICAgZWxlbWVudExpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgY29uc3Qgc3R5bGUgPSBlbGVtZW50LnN0eWxlO1xyXG4gICAgICBjb25zdCBydWxlcyA9IEFycmF5LmZyb20oc3R5bGUpLmZpbHRlcihwcm9wID0+IHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHByb3AgPT09ICdzdHJpbmcnICYmIHByb3AuZW5kc1dpdGgoJ3B4Jyk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcnVsZXMuZm9yRWFjaChwcm9wID0+IHtcclxuICAgICAgICBjb25zdCBweFZhbHVlID0gcGFyc2VGbG9hdChzdHlsZVtwcm9wXSk7XHJcbiAgICAgICAgY29uc3QgcmVtVmFsdWUgPSBweFZhbHVlIC8gaHRtbEZvbnRTaXplO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGVbcHJvcF0gPSBgJHtyZW1WYWx1ZX1yZW1gO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaXNDb252ZXgoYXJyID0gW10pIHtcclxuICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBhcnJcclxuICAgIGxldCBwcmUgPSAwLFxyXG4gICAgICBjdXJyID0gMFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xyXG4gICAgICBsZXQgZHgxID0gYXJyWyhpICsgMSkgJSBsZW5ndGhdLmxuZyAtIGFycltpXS5sbmdcclxuICAgICAgbGV0IGR4MiA9IGFyclsoaSArIDIpICUgbGVuZ3RoXS5sbmcgLSBhcnJbKGkgKyAxKSAlIGxlbmd0aF0ubG5nXHJcbiAgICAgIGxldCBkeTEgPSBhcnJbKGkgKyAxKSAlIGxlbmd0aF0ubGF0IC0gYXJyW2ldLmxhdFxyXG4gICAgICBsZXQgZHkyID0gYXJyWyhpICsgMikgJSBsZW5ndGhdLmxhdCAtIGFyclsoaSArIDEpICUgbGVuZ3RoXS5sYXRcclxuICAgICAgY3VyciA9IGR4MSAqIGR5MiAtIGR4MiAqIGR5MVxyXG4gICAgICBpZiAoY3VyciAhPSAwKSB7XHJcbiAgICAgICAgaWYgKChjdXJyID4gMCAmJiBwcmUgPCAwKSB8fCAoY3VyciA8IDAgJiYgcHJlID4gMCkpIHJldHVybiBmYWxzZVxyXG4gICAgICAgIGVsc2UgcHJlID0gY3VyclxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgZ2V0RGF0ZVRpbWVTdHJpbmcoKSB7XHJcbiAgICAvLyDliJvlu7rkuIDkuKrooajnpLrlvZPliY3ml7bpl7TnmoQgRGF0ZSDlr7nosaFcclxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICAvLyDojrflj5blubTku71cclxuICAgIGNvbnN0IHllYXIgPSBub3cuZ2V0RnVsbFllYXIoKTtcclxuICAgIC8vIOiOt+WPluaciOS7ve+8iOS7jiAwIOW8gOWni++8jOaJgOS7peimgeWKoCAx77yJ77yM5bm25bCG5YW26L2s5o2i5Li65Lik5L2N5a2X56ym5Liy77yM5LiN6Laz5Lik5L2N5Zyo5YmN6Z2i6KGl6Zu2XHJcbiAgICBjb25zdCBtb250aCA9IFN0cmluZyhub3cuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAvLyDojrflj5bml6XmnJ/vvIzlubblsIblhbbovazmjaLkuLrkuKTkvY3lrZfnrKbkuLLvvIzkuI3otrPkuKTkvY3lnKjliY3pnaLooaXpm7ZcclxuICAgIGNvbnN0IGRheSA9IFN0cmluZyhub3cuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgLy8g6I635Y+W5bCP5pe277yM5bm25bCG5YW26L2s5o2i5Li65Lik5L2N5a2X56ym5Liy77yM5LiN6Laz5Lik5L2N5Zyo5YmN6Z2i6KGl6Zu2XHJcbiAgICBjb25zdCBob3VycyA9IFN0cmluZyhub3cuZ2V0SG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIC8vIOiOt+WPluWIhumSn++8jOW5tuWwhuWFtui9rOaNouS4uuS4pOS9jeWtl+espuS4su+8jOS4jei2s+S4pOS9jeWcqOWJjemdouihpembtlxyXG4gICAgY29uc3QgbWludXRlcyA9IFN0cmluZyhub3cuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgLy8g6I635Y+W56eS77yM5bm25bCG5YW26L2s5o2i5Li65Lik5L2N5a2X56ym5Liy77yM5LiN6Laz5Lik5L2N5Zyo5YmN6Z2i6KGl6Zu2XHJcbiAgICBjb25zdCBzZWNvbmRzID0gU3RyaW5nKG5vdy5nZXRTZWNvbmRzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAvLyDojrflj5bmr6vnp5LvvIzlubblsIblhbbovazmjaLkuLrkuInkvY3lrZfnrKbkuLLvvIzkuI3otrPkuInkvY3lnKjliY3pnaLooaXpm7ZcclxuICAgIGNvbnN0IG1pbGxpc2Vjb25kcyA9IFN0cmluZyhub3cuZ2V0TWlsbGlzZWNvbmRzKCkpLnBhZFN0YXJ0KDMsICcwJyk7XHJcbiAgICAvLyDlsIblubTjgIHmnIjjgIHml6XjgIHml7bjgIHliIbjgIHnp5LjgIHmr6vnp5Lmi7zmjqXmiJDmiYDpnIDnmoTlrZfnrKbkuLJcclxuICAgIHJldHVybiBgJHt5ZWFyfSR7bW9udGh9JHtkYXl9JHtob3Vyc30ke21pbnV0ZXN9JHtzZWNvbmRzfSR7bWlsbGlzZWNvbmRzfWA7XHJcbiAgfVxyXG5cclxuICByZXBsYWNlSG9zdCh1cmwsIGhvc3QpIHtcclxuICAgIGxldCBuZXdVcmwgPSB1cmxcclxuICAgIGlmICghdXJsIHx8ICFob3N0KSB7XHJcbiAgICAgIHJldHVybiB1cmxcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICghdXJsLnN0YXJ0c1dpdGgoXCJodHRwXCIpKSB7XHJcbiAgICAgICAgLy/or7TmmI7mmK/mnKzlnLDnmoRqc29u77yM5Zyo56OB55uY5Lit5a2Y5Zyo55qEXHJcbiAgICAgICAgaWYgKCF1cmwuaW5jbHVkZXMoXCI6XCIpKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhvc3QpIHtcclxuICAgICAgICAgICAgbGV0IG8gPSBuZXcgVVJMKHVybCwgdGhpcy5vcHRpb25zLmhvc3QpXHJcbiAgICAgICAgICAgIG5ld1VybCA9IG8uaHJlZlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3VXJsXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8g56e76Zmk5Y+v6IO955qE55So5oi35ZCNOuWvhueggeWJjee8gFxyXG4gICAgICAgIGNvbnN0IGF1dGhSZWdleCA9IC9eW15AXStALztcclxuICAgICAgICBpZiAoYXV0aFJlZ2V4LnRlc3QodXJsKSkge1xyXG4gICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoYXV0aFJlZ2V4LCAnJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDmt7vliqDljY/orq7liY3nvIDvvIjlpoLmnpzmsqHmnInvvIlcclxuICAgICAgICBpZiAoIS9eW2Etel0rOlxcL1xcLy9pLnRlc3QodXJsKSkge1xyXG4gICAgICAgICAgdXJsID0gJ2h0dHA6Ly8nICsgdXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xyXG4gICAgICAgIGNvbnN0IHBhcnNlZFVybDIgPSBuZXcgVVJMKGhvc3QpO1xyXG4gICAgICAgIGxldCBob3N0bmFtZSA9IHBhcnNlZFVybC5ob3N0bmFtZTtcclxuICAgICAgICBsZXQgcG9ydCA9IHBhcnNlZFVybC5wb3J0O1xyXG5cclxuICAgICAgICAvLyDlpITnkIZJUHY25Zyw5Z2A77yI5aaC5p6c5pyJ5ous5Y+377yJXHJcbiAgICAgICAgaWYgKGhvc3RuYW1lLnN0YXJ0c1dpdGgoJ1snKSAmJiBob3N0bmFtZS5lbmRzV2l0aCgnXScpKSB7XHJcbiAgICAgICAgICBob3N0bmFtZSA9IGhvc3RuYW1lLnNsaWNlKDEsIC0xKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKChob3N0bmFtZSA9PT0gJ2xvY2FsaG9zdCcgfHwgaG9zdG5hbWUgPT09ICcxMjcuMC4wLjEnKSAmJiBwYXJzZUludChwb3J0LCAxMCkgIT09IDU1MTEwKSB7XHJcbiAgICAgICAgICBwYXJzZWRVcmwucG9ydCA9IHBhcnNlZFVybDIucG9ydFxyXG4gICAgICAgICAgcGFyc2VkVXJsLnByb3RvY29sID0gcGFyc2VkVXJsMi5wcm90b2NvbFxyXG4gICAgICAgICAgbmV3VXJsID0gcGFyc2VkVXJsLnRvU3RyaW5nKClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ld1VybFxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbmV3VXJsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtZXNzYWdlKG9wdGlvbiA9IHt9KSB7XHJcbiAgICBsZXQgdHlwZSA9IG9wdGlvbi50eXBlIHx8ICdzdWNjZXNzJ1xyXG4gICAgbGV0IHRleHQgPSBvcHRpb24udGV4dCB8fCAnJ1xyXG4gICAgbGV0IGR1cmF0aW9uID0gb3B0aW9uLmR1cmF0aW9uIHx8IDE1MDBcclxuXHJcbiAgICBsZXQgbWVzc2FnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdZSi1jdXN0b20tbWVzc2FnZScpO1xyXG4gICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChtZXNzYWdlKVxyXG4gICAgfVxyXG4gICAgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXHJcbiAgICBtZXNzYWdlLmlkID0gJ1lKLWN1c3RvbS1tZXNzYWdlJ1xyXG4gICAgaWYgKHR5cGUgPT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAgIG1lc3NhZ2UuaW5uZXJIVE1MID0gYFxyXG4gICAgICA8aT48P3htbCB2ZXJzaW9uPVwiMS4wXCIgc3RhbmRhbG9uZT1cIm5vXCI/PjwhRE9DVFlQRSBzdmcgUFVCTElDIFwiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZFwiPjxzdmcgdD1cIjE3NTU5Mjk5NjEyODJcIiBjbGFzcz1cImljb25cIiB2aWV3Qm94PVwiMCAwIDEwMjQgMTAyNFwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgcC1pZD1cIjUwNjRcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj48cGF0aCBkPVwiTTg3NC4xMTk2MTggMTQ5Ljg1OTkyMkE1MTAuODE2NDYxIDUxMC44MTY0NjEgMCAwIDAgNTExLjk5NyAwLjAwMjA4YTUwOS45MTA0NjIgNTA5LjkxMDQ2MiAwIDAgMC0zNjIuMTE5NjE4IDE0OS44NTc4NDJjLTE5OS44MTc3ODkgMTk5LjY3OTc4OS0xOTkuODE3Nzg5IDUyNC41ODE0NDcgMCA3MjQuMjYwMjM2YTUwOS45Njk0NjIgNTA5Ljk2OTQ2MiAwIDAgMCAzNjIuMTE5NjE4IDE0OS44NTc4NDJBNTA4Ljg3MjQ2MyA1MDguODcyNDYzIDAgMCAwIDg3NC4xMTk2MTggODc0LjEyMDE1OGMxOTkuODM2Nzg5LTE5OS42Nzk3ODkgMTk5LjgzNjc4OS01MjQuNTgxNDQ3IDAtNzI0LjI2MDIzNnpNODE0Ljk0MjY4IDM3OC4yMTA2ODFMNDcwLjk5OTA0MyA3NDQuMTMyMjk1YTE1LjM1OTk4NCAxNS4zNTk5ODQgMCAwIDEtNS44ODc5OTQgNC4wOTU5OTZjLTEuNzUxOTk4IDEuMTgwOTk5LTIuOTEzOTk3IDIuMzYyOTk4LTUuMjc2OTk0IDIuOTEzOTk3YTM0LjQ5OTk2NCAzNC40OTk5NjQgMCAwIDEtMTMuNDY5OTg2IDIuOTE0OTk3IDQ1LjU0Nzk1MiA0NS41NDc5NTIgMCAwIDEtMTIuODk3OTg2LTIuMzAzOTk4bC00LjA5NTk5Ni0yLjM2Mzk5N2E0NS4yOTE5NTIgNDUuMjkxOTUyIDAgMCAxLTcuMDA5OTkyLTQuMDk1OTk2bC0xOTYuOTAyNzkzLTE5My43ODk3OTZhMzQuMTI2OTY0IDM0LjEyNjk2NCAwIDAgMS0xMC41NTU5ODktMjUuMTg2OTczYzAtOS4zNzM5OSAzLjU4Mzk5Ni0xOC43NDY5OCA5Ljk4Mzk5LTI1LjE4Njk3NGEzNi40Mjk5NjIgMzYuNDI5OTYyIDAgMCAxIDUwLjM3Mjk0NyAwbDE2OS45ODM4MiAxNjcuNDIzODI0TDc2My4zODk3MzUgMzMwLjIyMDczMmEzNy4wNTk5NjEgMzcuMDU5OTYxIDAgMCAxIDUwLjM3MTk0Ny0xLjczMjk5OCAzMy42NDc5NjUgMzMuNjQ3OTY1IDAgMCAxIDExLjE2NTk4OCAyNS4xODY5NzMgMzUuNTQ0OTYzIDM1LjU0NDk2MyAwIDAgMS05Ljk4Mzk5IDI0LjU3NTk3NHYtMC4wNHogbTAgMFwiIGZpbGw9XCIjNTJDNDFBXCIgcC1pZD1cIjUwNjVcIj48L3BhdGg+PC9zdmc+PC9pPiR7dGV4dH1cclxuICAgIGBcclxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnd2FybmluZycpIHtcclxuICAgICAgbWVzc2FnZS5pbm5lckhUTUwgPSBgXHJcbiAgICAgIDxpPjw/eG1sIHZlcnNpb249XCIxLjBcIiBzdGFuZGFsb25lPVwibm9cIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgXCItLy9XM0MvL0RURCBTVkcgMS4xLy9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkXCI+PHN2ZyB0PVwiMTc1NjA5MzU5OTI1OFwiIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwLWlkPVwiMTY0OFwiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPjxwYXRoIGQ9XCJNNTEyLjAwMjU1OCA2NC4yNDUyMWMtMjQ3LjI5MjE3NiAwLTQ0Ny43NTc4NiAyMDAuNDY0NjYxLTQ0Ny43NTc4NiA0NDcuNzU2ODM3IDAgMjQ3LjI4NzA1OSAyMDAuNDY0NjYxIDQ0Ny43NTI3NDQgNDQ3Ljc1Nzg2IDQ0Ny43NTI3NDQgMjQ3LjI4NjAzNiAwIDQ0Ny43NTE3Mi0yMDAuNDY0NjYxIDQ0Ny43NTE3Mi00NDcuNzUyNzQ0Qzk1OS43NTQyNzkgMjY0LjcxMDg5NCA3NTkuMjg4NTk0IDY0LjI0NTIxIDUxMi4wMDI1NTggNjQuMjQ1MjF6TTUxMi4wMTA3NDUgNzM1Ljg3NTg2Yy0yMC42MDIyMjQgMC0zNy4zMTk5NzctMTYuNzE4Nzc3LTM3LjMxOTk3Ny0zNy4zMjMwNDcgMC0yMC41OTcxMDcgMTYuNzE3NzUzLTM3LjMxOTk3NyAzNy4zMTk5NzctMzcuMzE5OTc3IDIwLjYwNDI3IDAgMzcuMjk3NDY0IDE2LjcyMjg3IDM3LjI5NzQ2NCAzNy4zMTk5NzdDNTQ5LjMwODIwOSA3MTkuMTU4MTA3IDUzMi42MTM5OTIgNzM1Ljg3NTg2IDUxMi4wMTA3NDUgNzM1Ljg3NTg2ek01NDkuMzA4MjA5IDU2Ny45Njk3MzNjMCAyMC42MDAxNzctMTYuNjkzMTk0IDM3LjI5MzM3MS0zNy4yOTc0NjQgMzcuMjkzMzcxLTIwLjYwMjIyNCAwLTM3LjMxOTk3Ny0xNi42OTMxOTQtMzcuMzE5OTc3LTM3LjI5MzM3MUw0NzQuNjkwNzY4IDMyNS40MjA1ODFjMC0yMC42MDUyOTQgMTYuNzE3NzUzLTM3LjI5NzQ2NCAzNy4zMTk5NzctMzcuMjk3NDY0IDIwLjYwNDI3IDAgMzcuMjk3NDY0IDE2LjY5MzE5NCAzNy4yOTc0NjQgMzcuMjk3NDY0TDU0OS4zMDgyMDkgNTY3Ljk2OTczM3pcIiBmaWxsPVwiI2U5OGYzNlwiIHAtaWQ9XCIxNjQ5XCI+PC9wYXRoPjwvc3ZnPjwvaT4ke3RleHR9XHJcbiAgICBgXHJcbiAgICB9XHJcblxyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtZXNzYWdlKVxyXG4gICAgbWVzc2FnZS5jbGFzc0xpc3QuYWRkKHR5cGUpXHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVG9vbHNcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBQUE7QUFBQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBQUE7QUFBQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBO0FBQUE7QUFBQTtBQVdBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFBQTtBQUFBO0FBQUE7QUFRQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFpQkE7QUFBQTtBQWZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQTdEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQStEQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUpBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUFBO0FBQUE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBQUE7QUFBQTtBQVlBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQUFBO0FBQUE7QUFjQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQUFBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBQUE7QUFBQTtBQVdBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQUFBO0FBQUE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQUFBO0FBQUE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFBQTtBQUFBO0FBT0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBVUE7QUFOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUhBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQTlCQTtBQUFBO0FBQUE7QUFBQTtBQWdDQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQUE7QUFBQTtBQU1BO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUEvOENBO0FBQ0E7QUFBQTtBQUFBO0FBazlDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Tools/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ \"./node_modules/@babel/runtime/helpers/typeof.js\");\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var js_md5__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! js-md5 */ \"./node_modules/js-md5/src/md5.js\");\n/* harmony import */ var js_md5__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(js_md5__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _proj__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./proj */ \"./src/Tools/proj.js\");\n/* harmony import */ var _projConvert__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./projConvert */ \"./src/Tools/projConvert.js\");\n/* harmony import */ var _projectionConvert__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./projectionConvert */ \"./src/Tools/projectionConvert.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Global/global */ \"./src/Global/global.js\");\n/* harmony import */ var _Obj_Materail_FlowPictureMaterialProperty__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Obj/Materail/FlowPictureMaterialProperty */ \"./src/Obj/Materail/FlowPictureMaterialProperty.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n/**\r\n * @name: index\r\n * @author: Administrator\r\n * @date: 2022-06-09 16:46\r\n * @description:index\r\n * @update: 2022-06-09 16:46\r\n */\n\n\n\n\n\n\n\nvar Tools = /*#__PURE__*/function () {\n /**\r\n * @constructor\r\n * @desc 工具类\r\n * */\n function Tools(sdk, options) {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default()(this, Tools);\n this.sdk = sdk;\n if (this.sdk) {\n this.name_map = this.sdk.proj.name_map;\n this.epsg_map = this.sdk.proj.epsg_map;\n this.convert = this.sdk.proj.convert;\n this.getAllProjection = this.sdk.proj.getAllProjection;\n this.projectionIsExists = this.sdk.proj.projectionIsExists;\n this.degreesToDMS = this.sdk.proj.degreesToDMS;\n this.dmsToDecimal = this.sdk.proj.dmsToDecimal;\n }\n this.options = _objectSpread({}, options);\n }\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default()(Tools, [{\n key: \"POST\",\n get: function get() {\n return 'POST';\n }\n }, {\n key: \"GET\",\n get: function get() {\n return 'GET';\n }\n }, {\n key: \"degreesToRadians\",\n value:\n /**\r\n * @description 将角度转换为弧度\r\n * @method degreesToRadians\r\n * @param degrees {number} 弧度制\r\n * @return radians {number}\r\n * @memberOf Tools\r\n * @example let radians = tool.degreesToRadians(20)\r\n * */\n function degreesToRadians(degrees) {\n return turf.degreesToRadians(Number(degrees)); // 1.0471975511965976\n }\n\n /**\r\n * @description 将弧度转换为角度\r\n * @method radiansToDegrees\r\n * @param radians {number} 弧度制\r\n * @return degrees {number}\r\n * @memberOf Tools\r\n * @example let degrees = tool.radiansToDegrees(2)\r\n * */\n }, {\n key: \"radiansToDegrees\",\n value: function radiansToDegrees(radians) {\n return turf.radiansToDegrees(Number(radians)); // 1.0471975511965976\n }\n\n /**\r\n * @desc 随机字符串\r\n * @function randomString\r\n * @memberOf extra\r\n * @param {number} [e=32] 字符串长度\r\n * @returns {string} str 字符串\r\n * @memberOf Tools\r\n * @example let strings=tool.randomString()\r\n * */\n }, {\n key: \"randomString\",\n value: function randomString(e) {\n /* e = e || 32\r\n var t = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678',\r\n a = t.length,\r\n n = ''\r\n for (let i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a))*/\n return Cesium.createGuid();\n }\n }, {\n key: \"getSourceRootPath\",\n value: function getSourceRootPath() {\n var sdkName = 'YJEarth.min.js';\n var scripts = document.querySelectorAll('script');\n var prefix = '';\n scripts.forEach(function (item) {\n if (item.src && item.src.indexOf(sdkName) > -1) {\n var arr = item.src.split('/');\n arr.pop();\n prefix = arr.join('/');\n }\n });\n return prefix;\n }\n\n /**@description 笛卡尔坐标转经纬度\r\n * @method cartesian3Towgs84\r\n * @param cartesian {Cesium.Cartesian3} 笛卡尔坐标\r\n * @param viewer\r\n * @param cartesian.x {number}\r\n * @param cartesian.y {number}\r\n * @param cartesian.z {number}\r\n * @memberOf Tools\r\n * @return {object} wgs84 返回wgs84坐标\r\n * */\n }, {\n key: \"cartesian3Towgs84\",\n value: function cartesian3Towgs84(cartesian, viewer) {\n var ellipsoid = viewer.scene.globe.ellipsoid;\n var cartesian3 = new Cesium.Cartesian3(cartesian.x, cartesian.y, cartesian.z);\n var cartographic = ellipsoid.cartesianToCartographic(cartesian3);\n var lat = Cesium.Math.toDegrees(cartographic.latitude);\n var lng = Cesium.Math.toDegrees(cartographic.longitude);\n var alt = cartographic.height < 0 ? 0 : cartographic.height;\n // var alt = cartographic.height\n return {\n lng: lng,\n lat: lat,\n alt: alt\n };\n }\n\n /**\r\n * @desc 计算多线段长度\r\n * @method computeDistance\r\n * @memberOf Tools\r\n *@param positions {Array.<{lng:number, lat:number,alt:number}>}坐标数组\r\n * @param [fractionDigits=2] 保留小数点位数\r\n * @param [ground=true] 是否贴地\r\n * */\n }, {\n key: \"computeDistance\",\n value: (function () {\n var _computeDistance = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee() {\n var positions,\n fractionDigits,\n type,\n length,\n i,\n position1,\n position2,\n distance,\n _i,\n _position,\n _position2,\n _distance,\n meters,\n lineString2,\n line2,\n d,\n res,\n coordinates,\n arr,\n _iterator,\n _step,\n item,\n index,\n r,\n l,\n _i2,\n _position3,\n _position4,\n _distance2,\n _args = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n positions = _args.length > 0 && _args[0] !== undefined ? _args[0] : [];\n fractionDigits = _args.length > 1 && _args[1] !== undefined ? _args[1] : 2;\n type = _args.length > 2 && _args[2] !== undefined ? _args[2] : 0;\n if (!(positions.length < 2)) {\n _context.next = 7;\n break;\n }\n return _context.abrupt(\"return\", 0);\n case 7:\n length = 0;\n _context.t0 = type;\n _context.next = _context.t0 === '0' ? 11 : _context.t0 === 0 ? 11 : _context.t0 === '1' ? 13 : _context.t0 === 1 ? 13 : _context.t0 === '2' ? 15 : _context.t0 === 2 ? 15 : 48;\n break;\n case 11:\n for (i = 0; i < positions.length - 1; i++) {\n position1 = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n position2 = Cesium.Cartesian3.fromDegrees(positions[i + 1].lng, positions[i + 1].lat, positions[i + 1].alt);\n distance = Cesium.Cartesian3.distance(position1, position2);\n length = length + distance;\n }\n return _context.abrupt(\"break\", 49);\n case 13:\n for (_i = 0; _i < positions.length - 1; _i++) {\n _position = Cesium.Cartesian3.fromDegrees(positions[_i].lng, positions[_i].lat, 0);\n _position2 = Cesium.Cartesian3.fromDegrees(positions[_i + 1].lng, positions[_i + 1].lat, 0);\n _distance = Cesium.Cartesian3.distance(_position, _position2);\n length = length + _distance;\n }\n return _context.abrupt(\"break\", 49);\n case 15:\n lineString2 = [];\n positions.forEach(function (item) {\n lineString2.push([item.lng, item.lat, item.alt]);\n });\n line2 = turf.lineString(lineString2);\n d = turf.length(line2) * 1000;\n meters = d > 20 ? d / 20 : d;\n res = this.chunkLine(positions, meters);\n coordinates = [];\n res.forEach(function (Feature, index) {\n if (index === 0) {\n coordinates = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(Feature.geometry.coordinates);\n } else {\n coordinates.push(Feature.geometry.coordinates[1]);\n }\n });\n arr = [];\n _iterator = _createForOfIteratorHelper(coordinates);\n _context.prev = 25;\n _iterator.s();\n case 27:\n if ((_step = _iterator.n()).done) {\n _context.next = 37;\n break;\n }\n item = _step.value;\n index = coordinates.indexOf(item);\n _context.next = 32;\n return this.sampleHeight({\n lng: item[0],\n lat: item[1],\n alt: 0\n }, index);\n case 32:\n r = _context.sent;\n r.position.alt = r.position.alt < 0 ? 0 : r.position.alt;\n arr.push(r);\n case 35:\n _context.next = 27;\n break;\n case 37:\n _context.next = 42;\n break;\n case 39:\n _context.prev = 39;\n _context.t1 = _context[\"catch\"](25);\n _iterator.e(_context.t1);\n case 42:\n _context.prev = 42;\n _iterator.f();\n return _context.finish(42);\n case 45:\n l = arr.length - 1;\n for (_i2 = 0; _i2 < arr.length - 1; _i2++) {\n _position3 = Cesium.Cartesian3.fromDegrees(arr[_i2].position.lng, arr[_i2].position.lat, 0);\n _position4 = Cesium.Cartesian3.fromDegrees(arr[_i2 + 1].position.lng, arr[_i2 + 1].position.lat, 0);\n _distance2 = Cesium.Cartesian3.distance(_position3, _position4);\n length = length + _distance2;\n }\n return _context.abrupt(\"break\", 49);\n case 48:\n return _context.abrupt(\"break\", 49);\n case 49:\n return _context.abrupt(\"return\", length.toFixed(fractionDigits));\n case 50:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this, [[25, 39, 42, 45]]);\n }));\n function computeDistance() {\n return _computeDistance.apply(this, arguments);\n }\n return computeDistance;\n }())\n }, {\n key: \"computeDistance2\",\n value: function computeDistance2() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var fractionDigits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n var ground = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n if (positions.length < 2) {\n return 0;\n } else {\n var length = 0;\n if (ground) {\n var lineString = [];\n positions.forEach(function (item) {\n lineString.push([item.lng, item.lat, item.alt]);\n });\n var line = turf.lineString(lineString);\n length = turf.length(line) * 1000;\n } else {\n for (var i = 0; i < positions.length - 1; i++) {\n var position1 = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n var position2 = Cesium.Cartesian3.fromDegrees(positions[i + 1].lng, positions[i + 1].lat, positions[i + 1].alt);\n var distance = Cesium.Cartesian3.distance(position1, position2);\n length = length + distance;\n }\n }\n return length.toFixed(fractionDigits);\n }\n }\n }, {\n key: \"sampleHeight\",\n value: function () {\n var _sampleHeight = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee2(p1, index) {\n var p2;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return this.sampleHeightMostDetailed([p1]);\n case 2:\n p2 = _context2.sent;\n p1.alt = p2[0].height;\n return _context2.abrupt(\"return\", {\n position: p1,\n index: index\n });\n case 5:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function sampleHeight(_x, _x2) {\n return _sampleHeight.apply(this, arguments);\n }\n return sampleHeight;\n }()\n /**@description 计算多边形面积\r\n * @method computeArea\r\n * @memberOf Tools\r\n * @param positions {Array.<{lng:number, lat:number,alt:number}>}\r\n * @param [fractionDigits=2] {number} 精确到小数点多少位\r\n * @return {number} 面积\r\n * */\n }, {\n key: \"computeArea\",\n value: function computeArea(positions) {\n var fractionDigits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n if (positions.length < 3) {\n return 0;\n } else {\n var p = [];\n positions.forEach(function (item) {\n p.push([item.lng, item.lat]);\n });\n p.push(p[0]);\n var polygon = turf.polygon([p]);\n var triangles = turf.tesselate(polygon);\n return Number(turf.area(triangles).toFixed(fractionDigits));\n }\n }\n }, {\n key: \"computeSignedArea\",\n value: function computeSignedArea(viewer, path) {\n var _this = this;\n var fromDegreesArray = [];\n var fromDegreesArray2 = [];\n for (var i = 0; i < path.length; i++) {\n fromDegreesArray.push(path[i].lng, path[i].lat);\n fromDegreesArray2.push([path[i].lng, path[i].lat]);\n }\n var line = turf.lineString(fromDegreesArray2);\n var bbox = turf.bbox(line);\n var longRadians = Cesium.Math.toRadians(bbox[2] - bbox[0]);\n var latRadians = Cesium.Math.toRadians(bbox[3] - bbox[1]);\n var granularity;\n if (longRadians > latRadians) {\n granularity = longRadians / 10;\n } else {\n granularity = latRadians / 10;\n }\n\n // let granularity = Math.PI / Math.pow(2, 11);\n // granularity = granularity / 1250;\n var polygonGeometry = new Cesium.PolygonGeometry.fromPositions({\n positions: Cesium.Cartesian3.fromDegreesArray(fromDegreesArray),\n vertexFormat: Cesium.PerInstanceColorAppearance.FLAT_VERTEX_FORMAT,\n granularity: granularity\n });\n //创建自定义平面几何体\n var geom = new Cesium.PolygonGeometry.createGeometry(polygonGeometry);\n if (!geom || !geom.attributes || !geom.attributes.position) {\n return 0;\n }\n var indices = geom.indices; //获取顶点索引数据\n var positions = geom.attributes.position.values;\n function returnPosition(position, index) {\n var pos3 = new Cesium.Cartesian3(positions[index * 3], positions[index * 3 + 1], positions[index * 3 + 2]);\n var position1 = viewer.scene.clampToHeight(pos3) || pos3;\n // let pos84 = await _this.cartesian3Towgs84(position1, viewer)\n // let height = 0\n // try {\n // let position2 = await Cesium.sampleTerrainMostDetailed(\n // viewer.scene.terrainProvider,\n // [Cesium.Cartographic.fromCartesian(pos3)]\n // )\n // height = position2[0].height\n // } catch (error) {\n // height = 0\n // }\n // if (height > pos84.alt) {\n // pos84.alt = height\n // }\n return position1;\n }\n var area = 0;\n for (var index = 0; index < indices.length; index += 3) {\n var pos0 = returnPosition(positions, indices[index]);\n var pos1 = returnPosition(positions, indices[index + 1]);\n var pos2 = returnPosition(positions, indices[index + 2]);\n // let entity = viewer.entities.add({\n // name: \"三角面\",\n // polygon: {\n // hierarchy: [pos0, pos1, pos2],\n // perPositionHeight: true,\n // material: Cesium.Color.fromRandom(),\n // outline: true,\n // outlineColor: Cesium.Color.BLACK,\n // },\n // });\n\n var v0 = Cesium.Cartesian3.subtract(pos0, pos1, new Cesium.Cartesian3());\n var v1 = Cesium.Cartesian3.subtract(pos2, pos1, new Cesium.Cartesian3());\n var cross = Cesium.Cartesian3.cross(v0, v1, v0);\n area = area + Cesium.Cartesian3.magnitude(cross) * 0.5;\n }\n return Number(area.toFixed(2));\n }\n\n /**\r\n * @desc 创建圆\r\n *@method createCircle\r\n * @param point {object} 圆心坐标\r\n * @param point.lng {number} 经度\r\n * @param point.lat {number} 纬度\r\n * @param radius {number} 半径 单位:米\r\n * @param [options]\r\n * @param [options.steps=360] {number} 段数\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"createCircle\",\n value: function createCircle(point) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n steps: 360\n };\n if (Number(radius) <= 0) {\n radius = 0.01;\n }\n var center = [Number(point.lng), Number(point.lat)];\n var coordinates = turf.circle(center, radius / 1000, options).geometry.coordinates[0];\n var positions = [];\n coordinates.forEach(function (item) {\n positions = positions.concat(item);\n });\n return positions;\n }\n\n /**\r\n * @desc 创建椭圆\r\n *@method createEllipse\r\n * @param point {object} 圆心坐标\r\n * @param point.lng {number} 经度\r\n * @param point.lat {number} 纬度\r\n * @param [options]\r\n * @param [options.granularity=0.1] {number} 椭圆上点之间的角度\r\n * @param [options.semiMinorAxis=10] {number} 短半轴长度 单位:米\r\n * @param [options.semiMajorAxis=20] {number} 长半轴长度 单位:米\r\n * @param [options.bearing=0] {number} 椭圆旋转角度 单位:米\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"createEllipse\",\n value: function createEllipse(point) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n granularity: 0.1,\n semiMinorAxis: 10,\n semiMajorAxis: 20,\n bearing: 0,\n height: 0\n };\n if (!options.granularity) {\n options.granularity = 0.1;\n }\n if (!options.height) {\n options.height = 0;\n }\n if (!options.semiMinorAxis) {\n options.semiMinorAxis = 0.00001;\n }\n if (!options.semiMajorAxis) {\n options.semiMajorAxis = 0.00001;\n }\n var ellipseGeometry = new Cesium.EllipseOutlineGeometry({\n center: Cesium.Cartesian3.fromDegrees(Number(point.lng), Number(point.lat)),\n semiMajorAxis: Number(options.semiMajorAxis),\n semiMinorAxis: Number(options.semiMinorAxis),\n height: Number(options.height),\n granularity: Cesium.Math.toRadians(options.granularity),\n rotation: Cesium.Math.toRadians(options.bearing)\n });\n var ellipse = Cesium.EllipseOutlineGeometry.createGeometry(ellipseGeometry);\n if (!ellipse || !ellipse.attributes || !ellipse.attributes.position) {\n return [];\n }\n var ellipsePositions = ellipse.attributes.position.values;\n var positions = [];\n for (var i = 0; i < ellipsePositions.length; i += 3) {\n var pos = new Cesium.Cartesian3(ellipsePositions[i], ellipsePositions[i + 1], ellipsePositions[i + 2]);\n positions.push(pos);\n }\n return positions;\n }\n\n /*计算2点的恒相线夹角*/\n }, {\n key: \"rhumbBearing\",\n value: function rhumbBearing(p1, p2) {\n var point1 = turf.point([p1.lng, p1.lat]);\n var point2 = turf.point([p2.lng, p2.lat]);\n return turf.rhumbBearing(point1, point2);\n }\n }, {\n key: \"computeCenter\",\n value: function computeCenter() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var arr = [];\n positions.forEach(function (item) {\n arr.push(turf.point([item.lng, item.lat]));\n });\n var features = turf.featureCollection(arr);\n var coordinates = turf.center(features).geometry.coordinates;\n return {\n lng: coordinates[0],\n lat: coordinates[1]\n };\n }\n\n //计算2点的中心点\n }, {\n key: \"computeMidpoint\",\n value: function computeMidpoint(point1, point2) {\n var p1 = turf.point([point1.lng, point1.lat]);\n var p2 = turf.point([point2.lng, point2.lat]);\n var center = turf.midpoint(p1, p2).geometry.coordinates;\n return {\n lng: center[0],\n lat: center[1]\n };\n }\n\n //计算\n }, {\n key: \"computeAttackArrow\",\n value: function computeAttackArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return this.computeArrow(positions, 0);\n }\n\n //计算钳击箭头\n }, {\n key: \"computePincerArrow\",\n value: function computePincerArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return this.computeArrow(positions);\n }\n\n //计算攻击箭头\n }, {\n key: \"computeArrow\",\n value: function computeArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n if (positions.length < 3) {\n return [];\n } else {\n var lnglatArr = [];\n // if(positions.every(pos => Number(pos.lng) >= 0) || positions.every(pos => Number(pos.lng) <= 0)) {\n // for (var i = 0; i < positions.length; i++) {\n // lnglatArr.push([positions[i].lng, positions[i].lat])\n // }\n // }\n // else {\n // for (var i = 0; i < positions.length; i++) {\n // if(positions[i].lng<0) {\n // lnglatArr.push([positions[i].lng+360, positions[i].lat])\n // }\n // else {\n // lnglatArr.push([positions[i].lng, positions[i].lat])\n // }\n // }\n // }\n for (var i = 0; i < positions.length; i++) {\n lnglatArr.push([positions[i].lng, positions[i].lat]);\n }\n var res;\n if (type) {\n res = xp.algorithm.doubleArrow(lnglatArr);\n } else {\n res = xp.algorithm.tailedAttackArrow(lnglatArr);\n }\n var index = JSON.stringify(res.polygonalPoint).indexOf('null');\n var returnData = [];\n if (index === -1) returnData = res.polygonalPoint;\n return returnData;\n }\n }\n\n // 计算集结地\n }, {\n key: \"computeAssemble\",\n value: function computeAssemble() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var is84 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (positions.length < 2) {\n return [];\n } else {\n var points = positions.length;\n var pnts = new Array();\n positions.forEach(function (item) {\n pnts.push([item.lng, item.lat]);\n });\n //console.log(\"pnts6666\",pnts);\n // pnts.push(tailPoint);\n // pnts.push(headerPoint);\n\n if (pnts.length === 2) {\n var _mid = P.PlotUtils.mid(pnts[0], pnts[1]);\n //let d = utils.MathDistance(pnts[0], mid) / 0.9\n var d = P.PlotUtils.distance(pnts[0], _mid) / 0.9;\n //console.log(\"d\",d);\n var pnt = P.PlotUtils.getThirdPoint(pnts[0], _mid, P.Constants.HALF_PI, d, true);\n pnts = [pnts[0], pnt, pnts[1]];\n //console.log(\"pnt\",pnt);\n //createPoint(Cesium.Cartesian3.fromDegrees(pnt[0], pnt[1]));\n }\n var mid = P.PlotUtils.mid(pnts[0], pnts[2]);\n pnts.push(mid, pnts[0], pnts[1]);\n var normals = [],\n pnt1 = undefined,\n pnt2 = undefined,\n pnt3 = undefined,\n result = [],\n result2 = [];\n for (var i = 0; i < pnts.length - 2; i++) {\n pnt1 = pnts[i];\n pnt2 = pnts[i + 1];\n pnt3 = pnts[i + 2];\n var normalPoints = P.PlotUtils.getBisectorNormals(0.4, pnt1, pnt2, pnt3);\n normals = normals.concat(normalPoints);\n }\n var count = normals.length;\n normals = [normals[count - 1]].concat(normals.slice(0, count - 1));\n for (var _i3 = 0; _i3 < pnts.length - 2; _i3++) {\n pnt1 = pnts[_i3];\n pnt2 = pnts[_i3 + 1];\n result = result.concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(pnt1));\n for (var t = 0; t <= P.Constants.FITTING_COUNT; t++) {\n var _pnt = P.PlotUtils.getCubicValue(t / P.Constants.FITTING_COUNT, pnt1, normals[_i3 * 2], normals[_i3 * 2 + 1], pnt2);\n result = result.concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(_pnt));\n }\n result = result.concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(pnt2));\n }\n if (is84) {\n return result;\n } else {\n return Cesium.Cartesian3.fromDegreesArray(result);\n }\n }\n }\n\n // 计算直线箭头\n }, {\n key: \"computeStraightArrow\",\n value: function computeStraightArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var is84 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (positions.length < 2) {\n return [];\n }\n var point1 = [positions[0].lng, positions[0].lat];\n var point2 = [positions[1].lng, positions[1].lat];\n if (positions[0].lng === positions[1].lng && positions[0].lat === positions[1].lat) {\n if (is84) {\n return [positions[0], positions[0], positions[0]];\n } else {\n var cartesian3 = Cesium.Cartesian3.fromDegrees(positions[0].lng, positions[0].lat);\n return [cartesian3, cartesian3, cartesian3];\n }\n }\n var lnglatArr = [];\n for (var i = 0; i < positions.length; i++) {\n lnglatArr.push([positions[i].lng, positions[i].lat]);\n }\n var res;\n res = xp.algorithm.fineArrow(point1, point2);\n if (is84) {\n var pos84 = [];\n for (var _i4 = 0; _i4 < res.length; _i4++) {\n var pos = this.cartesian3Towgs84(res[_i4], this.sdk.viewer);\n pos84.push(pos.lng, pos.lat);\n }\n return pos84;\n }\n return res;\n }\n }, {\n key: \"getMaterial\",\n value: function getMaterial() {\n var color = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '#2ab0c2';\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var entity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var newParam = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var material = '';\n var arr = {\n '7': 10,\n '8': 3,\n '9': 4,\n '10': 4,\n '11': 4,\n '12': 2\n };\n if (entity) {\n arr[type + ''] ? entity.polyline.width = entity.polyline.oriWidth + arr[type + ''] : entity.polyline.width = entity.polyline.oriWidth;\n }\n switch (Number(type)) {\n case 1:\n //虚线\n material = new Cesium.PolylineDashMaterialProperty({\n color: Cesium.Color.fromCssColorString(color),\n dashLength: 10 //短划线长度\n });\n break;\n case 2:\n //泛光\n material = new Cesium.PolylineGlowMaterialProperty({\n glowPower: 0.2,\n color: Cesium.Color.fromCssColorString(color)\n });\n break;\n case 3:\n //尾迹光线\n material = new Cesium.PolylineFlowMaterialProperty({\n color: color,\n speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n rotate: newParam.rotate\n });\n break;\n case 4:\n //多尾迹光线\n material = new Cesium.PolylineFlowMultMaterialProperty({\n color: color,\n speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n rotate: newParam.rotate\n });\n break;\n case 5: //普通流动虚线\n // material = new Cesium.FlowDashedLineFlowMaterialProperty({\n // color: color,\n // uType: 0,\n // speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n // // dashSize: newParam.dashSize,\n // space: newParam.space,\n // scale: 1.0\n // })\n // break\n case 6:\n //流动虚线2\n var that = this;\n var repeatX;\n material = new Cesium.FlowDashedLineFlowMaterialProperty({\n color: color,\n uType: type == 5 ? 0 : 1,\n speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n // dashSize: newParam.dashSize,\n space: newParam.space,\n scale: new Cesium.CallbackProperty(function () {\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var oriPositions = entity.polyline.positions.getValue();\n if (!Cesium.defined(oriPositions)) {\n return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < oriPositions.length - 1; ++i) {\n distance += Cesium.Cartesian3.distance(oriPositions[i], oriPositions[i + 1]);\n }\n //屏幕坐标\n var point1 = new Cesium.Cartesian2(0, that.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(that.sdk.viewer.canvas.clientWidth / 2, that.sdk.viewer.canvas.clientHeight);\n var cartesian1 = that.sdk.viewer.scene.pickPosition(point1);\n var cartesian2 = that.sdk.viewer.scene.pickPosition(point2);\n if (cartesian1 && cartesian2) {\n var distance2 = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n repeatX = distance2 * 2 / distance;\n }\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n var _oriPositions = sdk3dEntity.polyline.positions.getValue();\n if (!Cesium.defined(_oriPositions)) {\n return 1.0;\n }\n var _distance3 = 0;\n for (var _i5 = 0; _i5 < _oriPositions.length - 1; ++_i5) {\n _distance3 += Cesium.Cartesian3.distance(_oriPositions[_i5], _oriPositions[_i5 + 1]);\n }\n //屏幕坐标\n var _point = new Cesium.Cartesian2(0, sdk3d.viewer.canvas.clientHeight);\n var _point2 = new Cesium.Cartesian2(sdk3d.viewer.canvas.clientWidth / 2, sdk3d.viewer.canvas.clientHeight);\n var _cartesian = sdk3d.viewer.scene.pickPosition(_point);\n var _cartesian2 = sdk3d.viewer.scene.pickPosition(_point2);\n if (_cartesian && _cartesian2) {\n var _distance4 = Cesium.Cartesian3.distance(_cartesian, _cartesian2);\n repeatX = _distance4 * 2 / _distance3;\n }\n return repeatX;\n }\n })\n });\n break;\n case 7: //流动箭头1\n case 8: //流动箭头2\n case 9: //流动箭头3\n case 10: //流动箭头4\n case 11: //流动箭头5\n case 12:\n //流动箭头6\n var param = {\n color: color,\n image: this.getSourceRootPath() + \"/img/arrow/\".concat(type - 6, \".png\"),\n space: newParam.space,\n speed: newParam.speed\n };\n param.speed = newParam.rotate ? param.speed : 0 - param.speed;\n this.getFlowTexture(this, param, entity);\n break;\n default:\n material = Cesium.Color.fromCssColorString(color);\n break;\n }\n return material;\n }\n }, {\n key: \"getFlowTexture\",\n value: function getFlowTexture(that, options, entity) {\n var canvasEle = document.createElement('canvas');\n var ctx = canvasEle.getContext('2d');\n var myImg = new Image();\n // myImg.src = that.getSourceRootPath() + '/img/arrow/1.png'\n myImg.src = options.image;\n myImg.onload = function () {\n options.space = Math.max(0.1, options.space);\n if (options.speed > 0 || options.speed == 0) {\n canvasEle.width = myImg.width * (options.space + 1);\n canvasEle.height = myImg.height;\n ctx.drawImage(myImg, myImg.width * (options.space / 2), 0);\n } else {\n ctx.clearRect(0, 0, canvasEle.width, canvasEle.height);\n canvasEle.width = myImg.width * (options.space + 1);\n canvasEle.height = myImg.height;\n ctx.save(); // 保存当前状态\n ctx.translate(canvasEle.width / 2, canvasEle.height / 2); // 移动原点至中心\n ctx.rotate(Math.PI); // (弧度制)\n ctx.translate(-canvasEle.width / 2, -canvasEle.height / 2); // 移回原点\n ctx.drawImage(myImg, myImg.width * (options.space / 2), 0);\n ctx.restore(); // 恢复状态\n }\n\n // let repeat = getRepeat()\n // }, false)\n // entity.polyline.material.oriRepeat = that.getSceenLine(entity, options, canvasEle)\n // entity.polyline.material.oriSpeed = undefined\n var beforeSpeed = 0,\n repeat = 0;\n entity.polyline.material = new Cesium.LineTextureMaterialProperty({\n color: options.color,\n image: canvasEle,\n speed: options.speed,\n repeat: new Cesium.CallbackProperty(function () {\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var positionProperty = entity.polyline.positions;\n var positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime);\n if (!Cesium.defined(positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < positions.length - 1; ++i) {\n // if (that.sdk.viewer.scene.mode===Cesium.SceneMode.SCENE2D){}\n distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]);\n }\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = that.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = that.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = that.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n var result;\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n var speed = repeatX / entity.polyline.oriRepeat;\n entity.polyline.oriSpeed = speed;\n entity.polyline.oriRepeatX = repeatX;\n // } else {\n // entity.polyline.material.oriRepeat = repeatX\n // }\n beforeSpeed = speed;\n repeat = repeatX;\n result = new Cesium.Cartesian2(repeatX, speed || 1.0);\n } else {\n result = new Cesium.Cartesian2(repeat || entity.polyline.oriRepeatX, beforeSpeed || entity.polyline.oriSpeed);\n }\n return result;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n var _positionProperty = sdk3dEntity.polyline.positions;\n var _positions = _positionProperty.getValue(sdk3d.viewer.clock.currentTime);\n if (!Cesium.defined(_positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var _distance5 = 0;\n for (var _i6 = 0; _i6 < _positions.length - 1; ++_i6) {\n // if (that.sdk.viewer.scene.mode===Cesium.SceneMode.SCENE2D){}\n _distance5 += Cesium.Cartesian3.distance(_positions[_i6], _positions[_i6 + 1]);\n }\n var _repeatX = _distance5 / sdk3dEntity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var _cameraHeight = sdk3d.viewer.camera.positionCartographic.height;\n var _boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var _drawingBufferWidth = sdk3d.viewer.canvas.clientWidth;\n var _drawingBufferHeight = sdk3d.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var _groundResolution = sdk3d.viewer.scene.camera.getPixelSize(_boundingSphere, _drawingBufferWidth, _drawingBufferHeight);\n var _result;\n if (_groundResolution > 700) {\n _repeatX *= _groundResolution / _cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n var _speed = _repeatX / sdk3dEntity.polyline.oriRepeat;\n sdk3dEntity.polyline.oriSpeed = _speed;\n sdk3dEntity.polyline.oriRepeatX = _repeatX;\n // } else {\n // entity.polyline.material.oriRepeat = repeatX\n // }\n beforeSpeed = _speed;\n repeat = _repeatX;\n _result = new Cesium.Cartesian2(_repeatX, _speed || 1.0);\n } else {\n _result = new Cesium.Cartesian2(repeat || sdk3dEntity.polyline.oriRepeatX, beforeSpeed || sdk3dEntity.polyline.oriSpeed);\n }\n return _result;\n }\n\n // return repeatX;\n })\n });\n var oriRepeat = that.getSceenLine(entity, options, canvasEle);\n oriRepeat && (entity.polyline.oriRepeat = oriRepeat);\n };\n }\n /**获取当前满屏横线速度 */\n }, {\n key: \"getSceenLine\",\n value: function getSceenLine(entity, options, canvasEle) {\n var point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight);\n // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1)\n // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2)\n var ray = this.sdk.viewer.camera.getPickRay(point1);\n var cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n var ray2 = this.sdk.viewer.camera.getPickRay(point2);\n var cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n if (cartesian1 && cartesian2) {\n var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = this.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = this.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = this.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = this.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n // repeatX *= groundResolution / cameraHeight / ((myImg.width / myImg.height * 5) + 1);\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n } else {\n repeatX = undefined;\n }\n if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id);\n return sdk3dEntity.polyline.oriRepeatX;\n }\n }\n }\n\n /*创建直箭头图片*/\n }, {\n key: \"create_arrow1_picture\",\n value: function create_arrow1_picture(color) {\n var canvas = new fabric.Canvas('canvas');\n canvas.width = 150;\n canvas.height = 75;\n var w_offset = 35;\n var h_offset = 20;\n var fill = color;\n var polygon = new fabric.Polygon([{\n x: canvas.width,\n y: canvas.height / 2\n },\n //箭头右边顶点\n {\n x: canvas.width - w_offset,\n y: canvas.height\n },\n //顺时针\n {\n x: canvas.width - w_offset,\n y: canvas.height - h_offset\n },\n //\n {\n x: canvas.width / 2,\n y: canvas.height - h_offset\n },\n //\n {\n x: canvas.width / 2,\n y: h_offset\n },\n //\n {\n x: canvas.width - w_offset,\n y: h_offset\n },\n //\n {\n x: canvas.width - w_offset,\n y: 0\n } //\n ], {\n fill: fill\n });\n canvas.add(polygon);\n return canvas.toDataURL();\n }\n\n /*创建箭头图片*/\n }, {\n key: \"create_arrow2_picture\",\n value: function create_arrow2_picture(color) {\n var canvas = new fabric.Canvas('canvas');\n canvas.width = 75;\n canvas.height = 75;\n var w_offset1 = 35;\n var w_offset2 = 40;\n var fill = color;\n var polygon = new fabric.Polygon([{\n x: canvas.width,\n y: canvas.height / 2\n }, {\n x: canvas.width - w_offset1,\n y: canvas.height\n }, {\n x: canvas.width - w_offset1 - w_offset2,\n y: canvas.height\n }, {\n x: canvas.width - w_offset2,\n y: canvas.height / 2\n }, {\n x: canvas.width - w_offset1 - w_offset2,\n y: 0\n }, {\n x: canvas.width - w_offset1,\n y: 0\n }], {\n fill: fill\n });\n canvas.add(polygon);\n return canvas.toDataURL();\n }\n }, {\n key: \"sampleHeightMostDetailed\",\n value: function sampleHeightMostDetailed(positions) {\n var cartesians = [];\n positions.forEach(function (item) {\n cartesians.push(new Cesium.Cartographic.fromDegrees(item.lng, item.lat));\n });\n return this.sdk.viewer.scene.sampleHeightMostDetailed(cartesians);\n }\n }, {\n key: \"flyHome\",\n value: function flyHome() {\n var duration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 3;\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_11__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_11__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_11__[\"closeViewFollow\"])(this.sdk);\n if (this.sdk.viewer.CAMERA_DEFAULT_VIEW_RECTANGLE) {\n var destination = this.sdk.viewer.CAMERA_DEFAULT_VIEW_RECTANGLE.destination;\n var orientation = this.sdk.viewer.CAMERA_DEFAULT_VIEW_RECTANGLE.orientation;\n this.sdk.viewer.camera.flyTo({\n destination: Cesium.Cartesian3.fromDegrees(destination.lng, destination.lat, destination.alt),\n orientation: {\n heading: Cesium.Math.toRadians(orientation.heading || 0),\n pitch: Cesium.Math.toRadians(orientation.pitch || 0),\n roll: Cesium.Math.toRadians(orientation.roll || 0)\n },\n duration: duration\n });\n } else {\n this.sdk.viewer.camera.flyHome(duration);\n }\n }\n\n /**\r\n * @description 设置拾取操作启停\r\n * @method setPickStatus\r\n * @param [status=true] {boolean}\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"setPickStatus\",\n value: function setPickStatus() {\n var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n } // YJ.getEarth().interaction.picking.enabled = status\n\n /**\r\n * @description 创建点缓冲区 返回缓冲区坐标\r\n * @method create_point_buffer\r\n * @param point {object} 坐标参数\r\n * @param [radius=5] {number} 缓冲距离 (单位:米)\r\n * @param option\r\n * @param point.lng {number} 经度\r\n * @param point.lat {number} 纬度\r\n * @memberOf Tools\r\n * @returns {Array} 返回缓冲区坐标数组\r\n */\n }, {\n key: \"create_point_buffer\",\n value: function create_point_buffer(point) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n var option = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n steps: 10\n };\n var p = turf.point([Number(point.lng), Number(point.lat)]);\n var buffered = turf.buffer(p, Number(radius) / 1000, option);\n return buffered.geometry.coordinates;\n }\n\n /**\r\n * @description 创建线缓冲区 返回缓冲区坐标\r\n * @method create_line_buffer\r\n * @param points {Array.} 坐标参数\r\n * @param [radius=5] {number} 缓冲距离 (单位:米)\r\n * @memberOf Tools\r\n * @returns {Array} 返回缓冲区坐标数组\r\n * @example let points = [{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"}]\r\n * let radius = 10\r\n * let area_buffer = sdk.create_line_buffer(points,radius)\r\n * */\n }, {\n key: \"create_line_buffer\",\n value: function create_line_buffer(points) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n if (points.length === 1) {\n return this.create_point_buffer(points[0], radius);\n } else if (points.length === 0) {\n return false;\n } else {\n var arr = [];\n points.forEach(function (point) {\n arr.push([Number(point.lng), Number(point.lat)]);\n });\n var line = turf.lineString(arr);\n var buffered = turf.buffer(line, Number(radius) / 1000);\n return buffered.geometry.coordinates;\n }\n }\n\n /**\r\n * @description 创建面缓冲区 返回缓冲区坐标\r\n * @method create_area_buffer\r\n * @param points {Array.} 坐标参数\r\n * @param [radius=5] {number} 缓冲距离 (单位:米)\r\n * @memberOf Tools\r\n * @returns {Array} 返回缓冲区坐标数组\r\n * @example let points = [{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"}]\r\n * let radius = 10\r\n * let area_buffer = sdk.create_area_buffer(points,radius)\r\n * */\n }, {\n key: \"create_area_buffer\",\n value: function create_area_buffer(points) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n if (points.length === 1) {\n return this.create_point_buffer(points[0], radius);\n } else if (points.length === 0) {\n return false;\n } else if (points.length === 2) {\n return this.create_line_buffer(points, radius);\n } else {\n var arr = [];\n points.forEach(function (point) {\n arr.push([Number(point.lng), Number(point.lat)]);\n });\n arr.push(arr[0]);\n var poly = turf.polygon([arr]);\n var buffered = turf.buffer(poly, Number(radius) / 1000);\n return buffered.geometry.coordinates;\n }\n }\n\n /**\r\n * @desc 计算多点范围\r\n * @method cal_envelope\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"cal_envelope\",\n value: function cal_envelope() {\n var points = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n if (points.length < 2) {\n console.error('坐标数量不能少于2个');\n } else {\n var arr = [];\n points.forEach(function (p) {\n arr.push(turf.point([p.lng, p.lat]));\n });\n var features = turf.featureCollection(arr);\n return turf.envelope(features).geometry.coordinates[0];\n }\n }\n\n /**\r\n * @desc 按指定距离分段\r\n * @method chunkLine\r\n * @param positions {Array}\r\n * @param meters\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"chunkLine\",\n value: function chunkLine() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var meters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n if (positions.length < 2) {\n return [];\n } else {\n var arr = [];\n positions.forEach(function (it) {\n arr.push([it.lng, it.lat]);\n });\n var line = turf.lineString(arr);\n var chunk = turf.lineChunk(line, meters / 1000);\n var __map = new Map();\n chunk.features.forEach(function (value) {\n value.geometry.coordinates.forEach(function (value1) {\n var key = value1.join(',');\n var val = {\n lng: value1[0],\n lat: value1[1]\n };\n __map.set(key, val);\n });\n });\n return chunk.features;\n }\n }\n\n /**\r\n * @desc 标注以sinx的半个周期的形式弹跳\r\n * */\n }, {\n key: \"billboardAnimation\",\n value: function billboardAnimation(viewer, _ref) {\n var id = _ref.id,\n _ref$offset = _ref.offset,\n offset = _ref$offset === void 0 ? 10 : _ref$offset,\n _ref$times = _ref.times,\n times = _ref$times === void 0 ? 3 : _ref$times;\n var entity = viewer.entities.getById(id);\n if (entity) {\n var pi = Math.PI;\n var tt = 60;\n var of = pi / tt;\n var h = 0;\n var src_p = this.cartesian3Towgs84(entity.position.getValue(), viewer);\n // let height = src_p.alt\n // entity.position = new Cesium.CallbackProperty(() => {\n // let height = offset * Math.sin(h) + src_p.alt\n // h += of\n // return Cesium.Cartesian3.fromDegrees(src_p.lng, src_p.lat, height)\n // }, false)\n var ti = setInterval(function () {\n h += of;\n var height = offset * Math.sin(h) + src_p.alt;\n if (h > pi) h = 0;\n entity.position = Cesium.Cartesian3.fromDegrees(src_p.lng, src_p.lat, height);\n }, 30);\n setTimeout(function () {\n clearInterval(ti);\n entity.position = Cesium.Cartesian3.fromDegrees(src_p.lng, src_p.lat, src_p.alt);\n }, 3000);\n }\n }\n\n /**@desc 绘制扇形\r\n * @method sector\r\n * @memberOf Tools*/\n }, {\n key: \"calSector\",\n value: function calSector() {\n var center = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100;\n var bearing1 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 25;\n var bearing2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 45;\n var steps = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 360;\n var is84 = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n var c = turf.point([center.lng, center.lat]);\n var coordinates = turf.sector(c, radius / 1000, bearing1, bearing2, {\n steps: steps\n }).geometry.coordinates;\n var positions = [];\n coordinates.forEach(function (array) {\n array.forEach(function (item) {\n var pos;\n if (is84) {\n pos = {\n lng: item[0],\n lat: item[1]\n };\n } else {\n pos = Cesium.Cartesian3.fromDegrees(item[0], item[1]);\n }\n positions.push(pos);\n });\n });\n return positions;\n }\n\n /**\r\n * @desc获取紧贴高度\r\n * @param position 坐标\r\n */\n }, {\n key: \"getClampToHeight\",\n value: (function () {\n var _getClampToHeight = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee3(position) {\n var objectsToExclude,\n pos3,\n position1,\n height1,\n height2,\n position2,\n _args3 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n objectsToExclude = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : [];\n if (!(!this.sdk || !this.sdk.viewer)) {\n _context3.next = 3;\n break;\n }\n return _context3.abrupt(\"return\", 0);\n case 3:\n pos3 = new Cesium.Cartesian3.fromDegrees(position.lng, position.lat);\n _context3.prev = 4;\n _context3.next = 7;\n return this.sdk.viewer.scene.clampToHeight(pos3, objectsToExclude);\n case 7:\n _context3.t0 = _context3.sent;\n if (_context3.t0) {\n _context3.next = 10;\n break;\n }\n _context3.t0 = pos3;\n case 10:\n position1 = _context3.t0;\n _context3.next = 16;\n break;\n case 13:\n _context3.prev = 13;\n _context3.t1 = _context3[\"catch\"](4);\n position1 = pos3;\n case 16:\n _context3.next = 18;\n return this.cartesian3Towgs84(position1, this.sdk.viewer).alt;\n case 18:\n height1 = _context3.sent;\n height2 = 0;\n _context3.prev = 20;\n if (!this.sdk.viewer.scene.terrainProvider.availability) {\n _context3.next = 26;\n break;\n }\n _context3.next = 24;\n return Cesium.sampleTerrainMostDetailed(this.sdk.viewer.scene.terrainProvider, [Cesium.Cartographic.fromDegrees(position.lng, position.lat)]);\n case 24:\n position2 = _context3.sent;\n position2[0].height && (height2 = position2[0].height);\n case 26:\n _context3.next = 31;\n break;\n case 28:\n _context3.prev = 28;\n _context3.t2 = _context3[\"catch\"](20);\n height2 = 0;\n case 31:\n if (!(height1 > height2)) {\n _context3.next = 35;\n break;\n }\n return _context3.abrupt(\"return\", Number(height1.toFixed(2)));\n case 35:\n return _context3.abrupt(\"return\", Number(height2.toFixed(2)));\n case 36:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, this, [[4, 13], [20, 28]]);\n }));\n function getClampToHeight(_x3) {\n return _getClampToHeight.apply(this, arguments);\n }\n return getClampToHeight;\n }()\n /**\r\n * @desc 深拷贝对象\r\n * */\n )\n }, {\n key: \"deepCopyObj\",\n value: function deepCopyObj(obj) {\n var newobj = null;\n // 处理数组 - 使用原生Array构造函数创建新数组\n if (Array.isArray(obj)) {\n newobj = [];\n // 只拷贝数组元素,不拷贝可能存在的扩展方法\n for (var i = 0; i < obj.length; i++) {\n newobj[i] = this.deepCopyObj(obj[i]);\n }\n return newobj;\n }\n\n // 处理对象\n else if (obj && _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(obj) === 'object') {\n newobj = {};\n for (var _i7 in obj) {\n // 排除指定属性和方法属性\n if (_i7 !== 'earth' && _i7 !== 'Dialog' && typeof obj[_i7] !== 'function') {\n newobj[_i7] = this.deepCopyObj(obj[_i7]);\n }\n }\n return newobj;\n } else newobj = obj;\n return newobj;\n }\n\n /**\r\n * @desc 度分秒转换\r\n * */\n }, {\n key: \"projConvert\",\n value: function projConvert() {\n var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var closeCallBack = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n if (status) {\n Object(_projConvert__WEBPACK_IMPORTED_MODULE_9__[\"open\"])(this.sdk, closeCallBack);\n } else {\n Object(_projConvert__WEBPACK_IMPORTED_MODULE_9__[\"close\"])();\n }\n }\n /**\r\n * @desc 投影转换\r\n * */\n }, {\n key: \"projectionConvert\",\n value: function projectionConvert() {\n var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var closeCallBack = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n if (status) {\n Object(_projectionConvert__WEBPACK_IMPORTED_MODULE_10__[\"open\"])(this.sdk, closeCallBack);\n } else {\n Object(_projectionConvert__WEBPACK_IMPORTED_MODULE_10__[\"close\"])();\n }\n }\n\n /**\r\n * @desc 导出excel\r\n */\n // 导出属性\n }, {\n key: \"exportExcel\",\n value: function exportExcel(data) {\n var label = '';\n for (var key in data[0]) {\n label += \"\".concat(key, \"\");\n }\n label += '';\n var url = 'data:application/vnd.ms-excel;base64,',\n tmplWorkbookXML = '' + 'Axel Richter{created}' + '' + '' + '' + '' + '{worksheets}',\n tmplWorksheetXML = '{rows}
',\n tmplCellXML = '{data}',\n base64 = function base64(s) {\n return window.btoa(unescape(encodeURIComponent(s)));\n },\n format = function format(s, c) {\n return s.replace(/{(\\w+)}/g, function (m, p) {\n return c[p];\n });\n };\n var ctx = \"\";\n var workbookXML = \"\";\n var worksheetsXML = \"\";\n var rowsXML = \"\";\n var pil = 0;\n for (var i = 0; i < data.length; i++) {\n if (i == 0) {\n rowsXML += label;\n }\n rowsXML += '';\n for (var _key in data[i]) {\n ctx = {\n nameType: 'String',\n data: data[i][_key]\n };\n rowsXML += format(tmplCellXML, ctx);\n }\n rowsXML += '';\n if (i > 0 && i / 60000 % 1 === 0) {\n pil++;\n ctx = {\n rows: rowsXML,\n nameWS: 'Sheet' + i\n };\n worksheetsXML += format(tmplWorksheetXML, ctx);\n rowsXML = \"\";\n rowsXML += label;\n }\n }\n ctx = {\n rows: rowsXML,\n nameWS: 'Sheet'\n };\n worksheetsXML += format(tmplWorksheetXML, ctx);\n rowsXML = \"\";\n ctx = {\n created: new Date().getTime(),\n worksheets: worksheetsXML\n };\n workbookXML = format(tmplWorkbookXML, ctx);\n var link = document.createElement(\"A\");\n link.href = url + base64(workbookXML);\n link.download = \"矢量数据导出.xls\";\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n /**\r\n * @desc Gzip解压\r\n */\n }, {\n key: \"decompressGzip\",\n value: function decompressGzip(compressedData) {\n var decompressedData = pako.inflate(compressedData);\n // 将解压缩后的数据转换为字符串\n var decompressedString = new TextDecoder().decode(decompressedData);\n return decompressedString;\n }\n\n /**\r\n * @desc cmyk转rbg\r\n * @param {*} color\r\n * @returns\r\n */\n }, {\n key: \"cmykToRgb\",\n value: function cmykToRgb(color) {\n var c = color.c,\n m = color.m,\n y = color.y,\n k = color.k;\n var rgb = {\n r: 0,\n g: 0,\n b: 0\n };\n rgb.c = c / 100;\n rgb.m = m / 100;\n rgb.y = y / 100;\n rgb.k = k / 100;\n rgb.r = 1 - Math.min(1, rgb.c * (1 - rgb.k) + rgb.k);\n rgb.g = 1 - Math.min(1, rgb.m * (1 - rgb.k) + rgb.k);\n rgb.b = 1 - Math.min(1, rgb.y * (1 - rgb.k) + rgb.k);\n rgb.r = Math.round(rgb.r * 255);\n rgb.g = Math.round(rgb.g * 255);\n rgb.b = Math.round(rgb.b * 255);\n return \"rgb(\".concat(rgb.r, \", \").concat(rgb.g, \", \").concat(rgb.b, \")\");\n }\n }, {\n key: \"convertPxToRem\",\n value: function convertPxToRem(sdk, selector) {\n var htmlFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize);\n var list = [];\n var elementList = [];\n if (selector) {\n list = document.getElementById(sdk.div_id).querySelectorAll(selector);\n for (var i = 0; i < list.length; i++) {\n var _elementList;\n (_elementList = elementList).push.apply(_elementList, [list[i]].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(list[i].querySelectorAll('*'))));\n }\n } else {\n elementList = document.getElementById(sdk.div_id).querySelectorAll('*');\n }\n elementList.forEach(function (element) {\n var style = element.style;\n var rules = Array.from(style).filter(function (prop) {\n return typeof prop === 'string' && prop.endsWith('px');\n });\n rules.forEach(function (prop) {\n var pxValue = parseFloat(style[prop]);\n var remValue = pxValue / htmlFontSize;\n element.style[prop] = \"\".concat(remValue, \"rem\");\n });\n });\n }\n }, {\n key: \"isConvex\",\n value: function isConvex() {\n var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var length = arr.length;\n var pre = 0,\n curr = 0;\n for (var i = 0; i < length; ++i) {\n var dx1 = arr[(i + 1) % length].lng - arr[i].lng;\n var dx2 = arr[(i + 2) % length].lng - arr[(i + 1) % length].lng;\n var dy1 = arr[(i + 1) % length].lat - arr[i].lat;\n var dy2 = arr[(i + 2) % length].lat - arr[(i + 1) % length].lat;\n curr = dx1 * dy2 - dx2 * dy1;\n if (curr != 0) {\n if (curr > 0 && pre < 0 || curr < 0 && pre > 0) return false;else pre = curr;\n }\n }\n return true;\n }\n }, {\n key: \"getDateTimeString\",\n value: function getDateTimeString() {\n // 创建一个表示当前时间的 Date 对象\n var now = new Date();\n // 获取年份\n var year = now.getFullYear();\n // 获取月份(从 0 开始,所以要加 1),并将其转换为两位字符串,不足两位在前面补零\n var month = String(now.getMonth() + 1).padStart(2, '0');\n // 获取日期,并将其转换为两位字符串,不足两位在前面补零\n var day = String(now.getDate()).padStart(2, '0');\n // 获取小时,并将其转换为两位字符串,不足两位在前面补零\n var hours = String(now.getHours()).padStart(2, '0');\n // 获取分钟,并将其转换为两位字符串,不足两位在前面补零\n var minutes = String(now.getMinutes()).padStart(2, '0');\n // 获取秒,并将其转换为两位字符串,不足两位在前面补零\n var seconds = String(now.getSeconds()).padStart(2, '0');\n // 获取毫秒,并将其转换为三位字符串,不足三位在前面补零\n var milliseconds = String(now.getMilliseconds()).padStart(3, '0');\n // 将年、月、日、时、分、秒、毫秒拼接成所需的字符串\n return \"\".concat(year).concat(month).concat(day).concat(hours).concat(minutes).concat(seconds).concat(milliseconds);\n }\n }, {\n key: \"replaceHost\",\n value: function replaceHost(url, host) {\n var newUrl = url;\n if (!url || !host) {\n return url;\n }\n try {\n if (!url.startsWith(\"http\")) {\n //说明是本地的json,在磁盘中存在的\n if (!url.includes(\":\")) {\n if (this.options.host) {\n var o = new URL(url, this.options.host);\n newUrl = o.href;\n }\n }\n return newUrl;\n } else {\n // 移除可能的用户名:密码前缀\n var authRegex = /^[^@]+@/;\n if (authRegex.test(url)) {\n url = url.replace(authRegex, '');\n }\n\n // 添加协议前缀(如果没有)\n if (!/^[a-z]+:\\/\\//i.test(url)) {\n url = 'http://' + url;\n }\n var parsedUrl = new URL(url);\n var parsedUrl2 = new URL(host);\n var hostname = parsedUrl.hostname;\n var port = parsedUrl.port;\n\n // 处理IPv6地址(如果有括号)\n if (hostname.startsWith('[') && hostname.endsWith(']')) {\n hostname = hostname.slice(1, -1);\n }\n if ((hostname === 'localhost' || hostname === '127.0.0.1') && parseInt(port, 10) !== 55110) {\n parsedUrl.port = parsedUrl2.port;\n parsedUrl.protocol = parsedUrl2.protocol;\n newUrl = parsedUrl.toString();\n }\n return newUrl;\n }\n } catch (error) {\n return newUrl;\n }\n }\n }, {\n key: \"message\",\n value: function message() {\n var option = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var type = option.type || 'success';\n var text = option.text || '';\n var duration = option.duration || 1500;\n var message = document.getElementById('YJ-custom-message');\n if (message) {\n document.body.removeChild(message);\n }\n message = document.createElement('div');\n message.id = 'YJ-custom-message';\n if (type == 'success') {\n message.innerHTML = \"\\n \".concat(text, \"\\n \");\n } else if (type == 'warning') {\n message.innerHTML = \"\\n \".concat(text, \"\\n \");\n }\n document.body.appendChild(message);\n message.classList.add(type);\n }\n }], [{\n key: \"_md5\",\n value: function _md5(text) {\n return js_md5__WEBPACK_IMPORTED_MODULE_7___default()(text).toUpperCase();\n }\n }]);\n}();\n/* harmony default export */ __webpack_exports__[\"default\"] = (Tools);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvVG9vbHMvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVG9vbHMvaW5kZXguanM/MTNjZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQG5hbWU6IGluZGV4XHJcbiAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3JcclxuICogQGRhdGU6IDIwMjItMDYtMDkgMTY6NDZcclxuICogQGRlc2NyaXB0aW9u77yaaW5kZXhcclxuICogQHVwZGF0ZTogMjAyMi0wNi0wOSAxNjo0NlxyXG4gKi9cclxuaW1wb3J0IG1kNSBmcm9tICdqcy1tZDUnXHJcbmltcG9ydCB7IFByb2ogfSBmcm9tICcuL3Byb2onXHJcbmltcG9ydCB7IG9wZW4gYXMgcHJvakNvbnZlcnRPcGVuLCBjbG9zZSBhcyBwcm9qQ29udmVydENsb3NlIH0gZnJvbSAnLi9wcm9qQ29udmVydCdcclxuaW1wb3J0IHsgb3BlbiBhcyBwcm9qZWN0aW9uQ29udmVydE9wZW4sIGNsb3NlIGFzIHByb2plY3Rpb25Db252ZXJ0Q2xvc2UgfSBmcm9tICcuL3Byb2plY3Rpb25Db252ZXJ0J1xyXG5pbXBvcnQgeyBzZXRBY3RpdmVWaWV3ZXIsIGNsb3NlUm90YXRlQXJvdW5kLCBjbG9zZVZpZXdGb2xsb3cgfSBmcm9tICcuLi9HbG9iYWwvZ2xvYmFsJ1xyXG5pbXBvcnQgRmxvd1BpY3R1cmVNYXRlcmlhbFByb3BlcnR5IGZyb20gJy4uL09iai9NYXRlcmFpbC9GbG93UGljdHVyZU1hdGVyaWFsUHJvcGVydHknXHJcbmltcG9ydCB7IHN5bmNEYXRhLCBnZXQzRFZpZXcgfSBmcm9tICcuLi9HbG9iYWwvTXVsdGlWaWV3cG9ydE1vZGUnXHJcblxyXG5jbGFzcyBUb29scyB7XHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQGRlc2Mg5bel5YW357G7XHJcbiAgICogKi9cclxuICBjb25zdHJ1Y3RvcihzZGssIG9wdGlvbnMpIHtcclxuICAgIHRoaXMuc2RrID0gc2RrXHJcbiAgICBpZiAodGhpcy5zZGspIHtcclxuICAgICAgdGhpcy5uYW1lX21hcCA9IHRoaXMuc2RrLnByb2oubmFtZV9tYXBcclxuICAgICAgdGhpcy5lcHNnX21hcCA9IHRoaXMuc2RrLnByb2ouZXBzZ19tYXBcclxuICAgICAgdGhpcy5jb252ZXJ0ID0gdGhpcy5zZGsucHJvai5jb252ZXJ0XHJcbiAgICAgIHRoaXMuZ2V0QWxsUHJvamVjdGlvbiA9IHRoaXMuc2RrLnByb2ouZ2V0QWxsUHJvamVjdGlvblxyXG4gICAgICB0aGlzLnByb2plY3Rpb25Jc0V4aXN0cyA9IHRoaXMuc2RrLnByb2oucHJvamVjdGlvbklzRXhpc3RzXHJcbiAgICAgIHRoaXMuZGVncmVlc1RvRE1TID0gdGhpcy5zZGsucHJvai5kZWdyZWVzVG9ETVNcclxuICAgICAgdGhpcy5kbXNUb0RlY2ltYWwgPSB0aGlzLnNkay5wcm9qLmRtc1RvRGVjaW1hbFxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucyA9IHsgLi4ub3B0aW9ucyB9XHJcbiAgfVxyXG5cclxuICBnZXQgUE9TVCgpIHtcclxuICAgIHJldHVybiAnUE9TVCdcclxuICB9XHJcblxyXG4gIGdldCBHRVQoKSB7XHJcbiAgICByZXR1cm4gJ0dFVCdcclxuICB9XHJcblxyXG5cclxuICBzdGF0aWMgX21kNSh0ZXh0KSB7XHJcbiAgICByZXR1cm4gbWQ1KHRleHQpLnRvVXBwZXJDYXNlKClcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24g5bCG6KeS5bqm6L2s5o2i5Li65byn5bqmXHJcbiAgICogQG1ldGhvZCBkZWdyZWVzVG9SYWRpYW5zXHJcbiAgICogQHBhcmFtIGRlZ3JlZXMge251bWJlcn0g5byn5bqm5Yi2XHJcbiAgICogQHJldHVybiByYWRpYW5zIHtudW1iZXJ9XHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcbiAgICogQGV4YW1wbGUgbGV0IHJhZGlhbnMgPSB0b29sLmRlZ3JlZXNUb1JhZGlhbnMoMjApXHJcbiAgICogKi9cclxuICBkZWdyZWVzVG9SYWRpYW5zKGRlZ3JlZXMpIHtcclxuICAgIHJldHVybiB0dXJmLmRlZ3JlZXNUb1JhZGlhbnMoTnVtYmVyKGRlZ3JlZXMpKSAvLyAxLjA0NzE5NzU1MTE5NjU5NzZcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDlsIblvKfluqbovazmjaLkuLrop5LluqZcclxuICAgKiBAbWV0aG9kIHJhZGlhbnNUb0RlZ3JlZXNcclxuICAgKiBAcGFyYW0gcmFkaWFucyB7bnVtYmVyfSDlvKfluqbliLZcclxuICAgKiBAcmV0dXJuIGRlZ3JlZXMge251bWJlcn1cclxuICAgKiBAbWVtYmVyT2YgVG9vbHNcclxuXHJcbiAgICogQGV4YW1wbGUgbGV0IGRlZ3JlZXMgPSB0b29sLnJhZGlhbnNUb0RlZ3JlZXMoMilcclxuICAgKiAqL1xyXG4gIHJhZGlhbnNUb0RlZ3JlZXMocmFkaWFucykge1xyXG4gICAgcmV0dXJuIHR1cmYucmFkaWFuc1RvRGVncmVlcyhOdW1iZXIocmFkaWFucykpIC8vIDEuMDQ3MTk3NTUxMTk2NTk3NlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg6ZqP5py65a2X56ym5LiyXHJcbiAgICogQGZ1bmN0aW9uIHJhbmRvbVN0cmluZ1xyXG4gICAqIEBtZW1iZXJPZiBleHRyYVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZT0zMl0g5a2X56ym5Liy6ZW/5bqmXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gc3RyIOWtl+espuS4slxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqIEBleGFtcGxlIGxldCBzdHJpbmdzPXRvb2wucmFuZG9tU3RyaW5nKClcclxuICAgKiAqL1xyXG4gIHJhbmRvbVN0cmluZyhlKSB7XHJcbiAgICAvKiAgICBlID0gZSB8fCAzMlxyXG4gICAgICAgIHZhciB0ID0gJ0FCQ0RFRkdISktNTlBRUlNUV1hZWmFiY2RlZmhpamttbnByc3R3eHl6MjM0NTY3OCcsXHJcbiAgICAgICAgICBhID0gdC5sZW5ndGgsXHJcbiAgICAgICAgICBuID0gJydcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGU7IGkrKykgbiArPSB0LmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhKSkqL1xyXG4gICAgcmV0dXJuIENlc2l1bS5jcmVhdGVHdWlkKClcclxuICB9XHJcblxyXG4gIGdldFNvdXJjZVJvb3RQYXRoKCkge1xyXG4gICAgbGV0IHNka05hbWUgPSAnWUpFYXJ0aC5taW4uanMnXHJcbiAgICBsZXQgc2NyaXB0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpXHJcbiAgICBsZXQgcHJlZml4ID0gJydcclxuICAgIHNjcmlwdHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5zcmMgJiYgaXRlbS5zcmMuaW5kZXhPZihzZGtOYW1lKSA+IC0xKSB7XHJcbiAgICAgICAgbGV0IGFyciA9IGl0ZW0uc3JjLnNwbGl0KCcvJylcclxuICAgICAgICBhcnIucG9wKClcclxuICAgICAgICBwcmVmaXggPSBhcnIuam9pbignLycpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICByZXR1cm4gcHJlZml4XHJcbiAgfVxyXG5cclxuICAvKipAZGVzY3JpcHRpb24g56yb5Y2h5bCU5Z2Q5qCH6L2s57uP57qs5bqmXHJcbiAgICogQG1ldGhvZCBjYXJ0ZXNpYW4zVG93Z3M4NFxyXG4gICAqIEBwYXJhbSBjYXJ0ZXNpYW4ge0Nlc2l1bS5DYXJ0ZXNpYW4zfSDnrJvljaHlsJTlnZDmoIdcclxuICAgKiBAcGFyYW0gdmlld2VyXHJcbiAgICogQHBhcmFtIGNhcnRlc2lhbi54IHtudW1iZXJ9XHJcbiAgICogQHBhcmFtIGNhcnRlc2lhbi55IHtudW1iZXJ9XHJcbiAgICogQHBhcmFtIGNhcnRlc2lhbi56IHtudW1iZXJ9XHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcbiAgICogQHJldHVybiB7b2JqZWN0fSB3Z3M4NCDov5Tlm553Z3M4NOWdkOagh1xyXG4gICAqICovXHJcbiAgY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB2aWV3ZXIpIHtcclxuICAgIHZhciBlbGxpcHNvaWQgPSB2aWV3ZXIuc2NlbmUuZ2xvYmUuZWxsaXBzb2lkXHJcbiAgICB2YXIgY2FydGVzaWFuMyA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMyhcclxuICAgICAgY2FydGVzaWFuLngsXHJcbiAgICAgIGNhcnRlc2lhbi55LFxyXG4gICAgICBjYXJ0ZXNpYW4uelxyXG4gICAgKVxyXG4gICAgdmFyIGNhcnRvZ3JhcGhpYyA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhjYXJ0ZXNpYW4zKVxyXG4gICAgdmFyIGxhdCA9IENlc2l1bS5NYXRoLnRvRGVncmVlcyhjYXJ0b2dyYXBoaWMubGF0aXR1ZGUpXHJcbiAgICB2YXIgbG5nID0gQ2VzaXVtLk1hdGgudG9EZWdyZWVzKGNhcnRvZ3JhcGhpYy5sb25naXR1ZGUpXHJcbiAgICB2YXIgYWx0ID0gY2FydG9ncmFwaGljLmhlaWdodCA8IDAgPyAwIDogY2FydG9ncmFwaGljLmhlaWdodFxyXG4gICAgLy8gdmFyIGFsdCA9IGNhcnRvZ3JhcGhpYy5oZWlnaHRcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxuZzogbG5nLFxyXG4gICAgICBsYXQ6IGxhdCxcclxuICAgICAgYWx0OiBhbHQsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyDorqHnrpflpJrnur/mrrXplb/luqZcclxuICAgKiBAbWV0aG9kIGNvbXB1dGVEaXN0YW5jZVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqQHBhcmFtIHBvc2l0aW9ucyB7QXJyYXkuPHtsbmc6bnVtYmVyLCBsYXQ6bnVtYmVyLGFsdDpudW1iZXJ9Pn3lnZDmoIfmlbDnu4RcclxuICAgKiBAcGFyYW0gW2ZyYWN0aW9uRGlnaXRzPTJdIOS/neeVmeWwj+aVsOeCueS9jeaVsFxyXG4gICAqIEBwYXJhbSBbZ3JvdW5kPXRydWVdIOaYr+WQpui0tOWcsFxyXG4gICAqICovXHJcbiAgYXN5bmMgY29tcHV0ZURpc3RhbmNlKHBvc2l0aW9ucyA9IFtdLCBmcmFjdGlvbkRpZ2l0cyA9IDIsIHR5cGUgPSAwKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBsZW5ndGggPSAwXHJcbiAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbjEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0LCBwb3NpdGlvbnNbaV0uYWx0KTtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24yID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2kgKyAxXS5sbmcsIHBvc2l0aW9uc1tpICsgMV0ubGF0LCBwb3NpdGlvbnNbaSArIDFdLmFsdCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb24xLCBwb3NpdGlvbjIpO1xyXG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggKyBkaXN0YW5jZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24xID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uMiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHBvc2l0aW9uc1tpICsgMV0ubG5nLCBwb3NpdGlvbnNbaSArIDFdLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb24xLCBwb3NpdGlvbjIpO1xyXG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggKyBkaXN0YW5jZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBsZXQgbWV0ZXJzXHJcbiAgICAgICAgICBsZXQgbGluZVN0cmluZzIgPSBbXVxyXG4gICAgICAgICAgcG9zaXRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgbGluZVN0cmluZzIucHVzaChbaXRlbS5sbmcsIGl0ZW0ubGF0LCBpdGVtLmFsdF0pXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGV0IGxpbmUyID0gdHVyZi5saW5lU3RyaW5nKGxpbmVTdHJpbmcyKVxyXG4gICAgICAgICAgbGV0IGQgPSB0dXJmLmxlbmd0aChsaW5lMikgKiAxMDAwXHJcbiAgICAgICAgICBtZXRlcnMgPSBkID4gMjAgPyBkIC8gMjAgOiBkXHJcblxyXG4gICAgICAgICAgbGV0IHJlcyA9IHRoaXMuY2h1bmtMaW5lKHBvc2l0aW9ucywgbWV0ZXJzKVxyXG4gICAgICAgICAgbGV0IGNvb3JkaW5hdGVzID0gW11cclxuICAgICAgICAgIHJlcy5mb3JFYWNoKChGZWF0dXJlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcclxuICAgICAgICAgICAgICBjb29yZGluYXRlcyA9IFsuLi5GZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzXVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVzLnB1c2goRmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxldCBhcnIgPSBbXVxyXG4gICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY29vcmRpbmF0ZXMuaW5kZXhPZihpdGVtKTtcclxuICAgICAgICAgICAgbGV0IHIgPSBhd2FpdCB0aGlzLnNhbXBsZUhlaWdodCh7IGxuZzogaXRlbVswXSwgbGF0OiBpdGVtWzFdLCBhbHQ6IDAgfSwgaW5kZXgpXHJcbiAgICAgICAgICAgIHIucG9zaXRpb24uYWx0ID0gci5wb3NpdGlvbi5hbHQgPCAwID8gMCA6IHIucG9zaXRpb24uYWx0XHJcbiAgICAgICAgICAgIGFyci5wdXNoKHIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgbCA9IGFyci5sZW5ndGggLSAxXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24xID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoYXJyW2ldLnBvc2l0aW9uLmxuZywgYXJyW2ldLnBvc2l0aW9uLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uMiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGFycltpICsgMV0ucG9zaXRpb24ubG5nLCBhcnJbaSArIDFdLnBvc2l0aW9uLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb24xLCBwb3NpdGlvbjIpO1xyXG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggKyBkaXN0YW5jZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGxlbmd0aC50b0ZpeGVkKGZyYWN0aW9uRGlnaXRzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29tcHV0ZURpc3RhbmNlMihwb3NpdGlvbnMgPSBbXSwgZnJhY3Rpb25EaWdpdHMgPSAyLCBncm91bmQgPSB0cnVlKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBsZW5ndGggPSAwXHJcbiAgICAgIGlmIChncm91bmQpIHtcclxuICAgICAgICBsZXQgbGluZVN0cmluZyA9IFtdXHJcbiAgICAgICAgcG9zaXRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGxpbmVTdHJpbmcucHVzaChbaXRlbS5sbmcsIGl0ZW0ubGF0LCBpdGVtLmFsdF0pXHJcbiAgICAgICAgfSlcclxuICAgICAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhsaW5lU3RyaW5nKVxyXG4gICAgICAgIGxlbmd0aCA9IHR1cmYubGVuZ3RoKGxpbmUpICogMTAwMFxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgcG9zaXRpb24xID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdCwgcG9zaXRpb25zW2ldLmFsdCk7XHJcbiAgICAgICAgICBjb25zdCBwb3NpdGlvbjIgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaSArIDFdLmxuZywgcG9zaXRpb25zW2kgKyAxXS5sYXQsIHBvc2l0aW9uc1tpICsgMV0uYWx0KTtcclxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb24xLCBwb3NpdGlvbjIpO1xyXG4gICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoICsgZGlzdGFuY2VcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGxlbmd0aC50b0ZpeGVkKGZyYWN0aW9uRGlnaXRzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2FtcGxlSGVpZ2h0KHAxLCBpbmRleCkge1xyXG4gICAgbGV0IHAyID0gYXdhaXQgdGhpcy5zYW1wbGVIZWlnaHRNb3N0RGV0YWlsZWQoW3AxXSlcclxuICAgIHAxLmFsdCA9IHAyWzBdLmhlaWdodFxyXG4gICAgcmV0dXJuIHsgcG9zaXRpb246IHAxLCBpbmRleCB9XHJcbiAgfVxyXG5cclxuICAvKipAZGVzY3JpcHRpb24g6K6h566X5aSa6L655b2i6Z2i56evXHJcbiAgICogQG1ldGhvZCBjb21wdXRlQXJlYVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqIEBwYXJhbSBwb3NpdGlvbnMge0FycmF5Ljx7bG5nOm51bWJlciwgbGF0Om51bWJlcixhbHQ6bnVtYmVyfT59XHJcbiAgICogQHBhcmFtIFtmcmFjdGlvbkRpZ2l0cz0yXSB7bnVtYmVyfSDnsr7noa7liLDlsI/mlbDngrnlpJrlsJHkvY1cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9ICDpnaLnp69cclxuICAgKiAqL1xyXG4gIGNvbXB1dGVBcmVhKHBvc2l0aW9ucywgZnJhY3Rpb25EaWdpdHMgPSAyKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDMpIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBwID0gW11cclxuICAgICAgcG9zaXRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBwLnB1c2goW2l0ZW0ubG5nLCBpdGVtLmxhdF0pXHJcbiAgICAgIH0pXHJcbiAgICAgIHAucHVzaChwWzBdKVxyXG4gICAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihbcF0pXHJcbiAgICAgIGxldCB0cmlhbmdsZXMgPSB0dXJmLnRlc3NlbGF0ZShwb2x5Z29uKTtcclxuXHJcbiAgICAgIHJldHVybiBOdW1iZXIodHVyZi5hcmVhKHRyaWFuZ2xlcykudG9GaXhlZChmcmFjdGlvbkRpZ2l0cykpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb21wdXRlU2lnbmVkQXJlYSh2aWV3ZXIsIHBhdGgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5MiA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKHBhdGhbaV0ubG5nLCBwYXRoW2ldLmxhdClcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheTIucHVzaChbcGF0aFtpXS5sbmcsIHBhdGhbaV0ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBsaW5lID0gdHVyZi5saW5lU3RyaW5nKGZyb21EZWdyZWVzQXJyYXkyKTtcclxuICAgIGxldCBiYm94ID0gdHVyZi5iYm94KGxpbmUpO1xyXG4gICAgbGV0IGxvbmdSYWRpYW5zID0gQ2VzaXVtLk1hdGgudG9SYWRpYW5zKGJib3hbMl0gLSBiYm94WzBdKTtcclxuICAgIGxldCBsYXRSYWRpYW5zID0gQ2VzaXVtLk1hdGgudG9SYWRpYW5zKGJib3hbM10gLSBiYm94WzFdKTtcclxuICAgIGxldCBncmFudWxhcml0eVxyXG4gICAgaWYgKGxvbmdSYWRpYW5zID4gbGF0UmFkaWFucykge1xyXG4gICAgICBncmFudWxhcml0eSA9IGxvbmdSYWRpYW5zIC8gMTBcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBncmFudWxhcml0eSA9IGxhdFJhZGlhbnMgLyAxMFxyXG4gICAgfVxyXG5cclxuICAgIC8vIGxldCBncmFudWxhcml0eSA9IE1hdGguUEkgLyBNYXRoLnBvdygyLCAxMSk7XHJcbiAgICAvLyBncmFudWxhcml0eSA9IGdyYW51bGFyaXR5IC8gMTI1MDtcclxuICAgIGxldCBwb2x5Z29uR2VvbWV0cnkgPSBuZXcgQ2VzaXVtLlBvbHlnb25HZW9tZXRyeS5mcm9tUG9zaXRpb25zKHtcclxuICAgICAgcG9zaXRpb25zOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpLFxyXG4gICAgICB2ZXJ0ZXhGb3JtYXQ6IENlc2l1bS5QZXJJbnN0YW5jZUNvbG9yQXBwZWFyYW5jZS5GTEFUX1ZFUlRFWF9GT1JNQVQsXHJcbiAgICAgIGdyYW51bGFyaXR5OiBncmFudWxhcml0eSxcclxuICAgIH0pO1xyXG4gICAgLy/liJvlu7roh6rlrprkuYnlubPpnaLlh6DkvZXkvZNcclxuICAgIGxldCBnZW9tID0gbmV3IENlc2l1bS5Qb2x5Z29uR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkocG9seWdvbkdlb21ldHJ5KTtcclxuICAgIGlmICghZ2VvbSB8fCAhZ2VvbS5hdHRyaWJ1dGVzIHx8ICFnZW9tLmF0dHJpYnV0ZXMucG9zaXRpb24pIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH1cclxuICAgIGNvbnN0IGluZGljZXMgPSBnZW9tLmluZGljZXM7IC8v6I635Y+W6aG254K557Si5byV5pWw5o2uXHJcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBnZW9tLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzO1xyXG4gICAgZnVuY3Rpb24gcmV0dXJuUG9zaXRpb24ocG9zaXRpb24sIGluZGV4KSB7XHJcbiAgICAgIGxldCBwb3MzID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKFxyXG4gICAgICAgIHBvc2l0aW9uc1tpbmRleCAqIDNdLFxyXG4gICAgICAgIHBvc2l0aW9uc1tpbmRleCAqIDMgKyAxXSxcclxuICAgICAgICBwb3NpdGlvbnNbaW5kZXggKiAzICsgMl1cclxuICAgICAgKTtcclxuICAgICAgbGV0IHBvc2l0aW9uMSA9IHZpZXdlci5zY2VuZS5jbGFtcFRvSGVpZ2h0KHBvczMpIHx8IHBvczNcclxuICAgICAgLy8gbGV0IHBvczg0ID0gYXdhaXQgX3RoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb24xLCB2aWV3ZXIpXHJcbiAgICAgIC8vIGxldCBoZWlnaHQgPSAwXHJcbiAgICAgIC8vIHRyeSB7XHJcbiAgICAgIC8vICAgbGV0IHBvc2l0aW9uMiA9IGF3YWl0IENlc2l1bS5zYW1wbGVUZXJyYWluTW9zdERldGFpbGVkKFxyXG4gICAgICAvLyAgICAgdmlld2VyLnNjZW5lLnRlcnJhaW5Qcm92aWRlcixcclxuICAgICAgLy8gICAgIFtDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21DYXJ0ZXNpYW4ocG9zMyldXHJcbiAgICAgIC8vICAgKVxyXG4gICAgICAvLyAgIGhlaWdodCA9IHBvc2l0aW9uMlswXS5oZWlnaHRcclxuICAgICAgLy8gfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gICBoZWlnaHQgPSAwXHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gaWYgKGhlaWdodCA+IHBvczg0LmFsdCkge1xyXG4gICAgICAvLyAgIHBvczg0LmFsdCA9IGhlaWdodFxyXG4gICAgICAvLyB9XHJcbiAgICAgIHJldHVybiBwb3NpdGlvbjFcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYXJlYSA9IDBcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpbmRpY2VzLmxlbmd0aDsgaW5kZXggKz0gMykge1xyXG4gICAgICBjb25zdCBwb3MwID0gcmV0dXJuUG9zaXRpb24ocG9zaXRpb25zLCBpbmRpY2VzW2luZGV4XSk7XHJcbiAgICAgIGNvbnN0IHBvczEgPSByZXR1cm5Qb3NpdGlvbihwb3NpdGlvbnMsIGluZGljZXNbaW5kZXggKyAxXSk7XHJcbiAgICAgIGNvbnN0IHBvczIgPSByZXR1cm5Qb3NpdGlvbihwb3NpdGlvbnMsIGluZGljZXNbaW5kZXggKyAyXSk7XHJcbiAgICAgIC8vIGxldCBlbnRpdHkgPSB2aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgLy8gICBuYW1lOiBcIuS4ieinkumdolwiLFxyXG4gICAgICAvLyAgIHBvbHlnb246IHtcclxuICAgICAgLy8gICAgIGhpZXJhcmNoeTogW3BvczAsIHBvczEsIHBvczJdLFxyXG4gICAgICAvLyAgICAgcGVyUG9zaXRpb25IZWlnaHQ6IHRydWUsXHJcbiAgICAgIC8vICAgICBtYXRlcmlhbDogQ2VzaXVtLkNvbG9yLmZyb21SYW5kb20oKSxcclxuICAgICAgLy8gICAgIG91dGxpbmU6IHRydWUsXHJcbiAgICAgIC8vICAgICBvdXRsaW5lQ29sb3I6IENlc2l1bS5Db2xvci5CTEFDSyxcclxuICAgICAgLy8gICB9LFxyXG4gICAgICAvLyB9KTtcclxuXHJcbiAgICAgIGxldCB2MCA9IENlc2l1bS5DYXJ0ZXNpYW4zLnN1YnRyYWN0KHBvczAsIHBvczEsIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygpKVxyXG4gICAgICBsZXQgdjEgPSBDZXNpdW0uQ2FydGVzaWFuMy5zdWJ0cmFjdChwb3MyLCBwb3MxLCBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoKSlcclxuICAgICAgbGV0IGNyb3NzID0gQ2VzaXVtLkNhcnRlc2lhbjMuY3Jvc3ModjAsIHYxLCB2MCk7XHJcbiAgICAgIGFyZWEgPSAoYXJlYSArIENlc2l1bS5DYXJ0ZXNpYW4zLm1hZ25pdHVkZShjcm9zcykgKiAwLjUpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gTnVtYmVyKGFyZWEudG9GaXhlZCgyKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIOWIm+W7uuWchlxyXG4gICAqQG1ldGhvZCBjcmVhdGVDaXJjbGVcclxuICAgKiBAcGFyYW0gcG9pbnQge29iamVjdH0g5ZyG5b+D5Z2Q5qCHXHJcbiAgICogQHBhcmFtIHBvaW50LmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gcG9pbnQubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSByYWRpdXMge251bWJlcn0g5Y2K5b6EICDljZXkvY3vvJrnsbNcclxuICAgKiBAcGFyYW0gW29wdGlvbnNdXHJcbiAgICogQHBhcmFtIFtvcHRpb25zLnN0ZXBzPTM2MF0ge251bWJlcn0g5q615pWwXHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcblxyXG4gICAqICovXHJcbiAgY3JlYXRlQ2lyY2xlKHBvaW50LCByYWRpdXMgPSAxLCBvcHRpb25zID0geyBzdGVwczogMzYwIH0pIHtcclxuICAgIGlmIChOdW1iZXIocmFkaXVzKSA8PSAwKSB7XHJcbiAgICAgIHJhZGl1cyA9IDAuMDFcclxuICAgIH1cclxuICAgIHZhciBjZW50ZXIgPSBbTnVtYmVyKHBvaW50LmxuZyksIE51bWJlcihwb2ludC5sYXQpXVxyXG4gICAgbGV0IGNvb3JkaW5hdGVzID0gdHVyZi5jaXJjbGUoY2VudGVyLCByYWRpdXMgLyAxMDAwLCBvcHRpb25zKS5nZW9tZXRyeVxyXG4gICAgICAuY29vcmRpbmF0ZXNbMF1cclxuICAgIGxldCBwb3NpdGlvbnMgPSBbXVxyXG4gICAgY29vcmRpbmF0ZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBwb3NpdGlvbnMgPSBwb3NpdGlvbnMuY29uY2F0KGl0ZW0pXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHBvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg5Yib5bu65qSt5ZyGXHJcbiAgICpAbWV0aG9kIGNyZWF0ZUVsbGlwc2VcclxuICAgKiBAcGFyYW0gcG9pbnQge29iamVjdH0g5ZyG5b+D5Z2Q5qCHXHJcbiAgICogQHBhcmFtIHBvaW50LmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gcG9pbnQubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBbb3B0aW9uc11cclxuICAgKiBAcGFyYW0gW29wdGlvbnMuZ3JhbnVsYXJpdHk9MC4xXSB7bnVtYmVyfSDmpK3lnIbkuIrngrnkuYvpl7TnmoTop5LluqZcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuc2VtaU1pbm9yQXhpcz0xMF0ge251bWJlcn0g55+t5Y2K6L206ZW/5bqmICDljZXkvY3vvJrnsbNcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuc2VtaU1ham9yQXhpcz0yMF0ge251bWJlcn0g6ZW/5Y2K6L206ZW/5bqmICDljZXkvY3vvJrnsbNcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuYmVhcmluZz0wXSB7bnVtYmVyfSDmpK3lnIbml4vovazop5LluqYgIOWNleS9je+8muexs1xyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG5cclxuICAgKiAqL1xyXG4gIGNyZWF0ZUVsbGlwc2UocG9pbnQsIG9wdGlvbnMgPSB7IGdyYW51bGFyaXR5OiAwLjEsIHNlbWlNaW5vckF4aXM6IDEwLCBzZW1pTWFqb3JBeGlzOiAyMCwgYmVhcmluZzogMCwgaGVpZ2h0OiAwIH0pIHtcclxuICAgIGlmICghb3B0aW9ucy5ncmFudWxhcml0eSkge1xyXG4gICAgICBvcHRpb25zLmdyYW51bGFyaXR5ID0gMC4xXHJcbiAgICB9XHJcbiAgICBpZiAoIW9wdGlvbnMuaGVpZ2h0KSB7XHJcbiAgICAgIG9wdGlvbnMuaGVpZ2h0ID0gMFxyXG4gICAgfVxyXG4gICAgaWYgKCFvcHRpb25zLnNlbWlNaW5vckF4aXMpIHtcclxuICAgICAgb3B0aW9ucy5zZW1pTWlub3JBeGlzID0gMC4wMDAwMVxyXG4gICAgfVxyXG4gICAgaWYgKCFvcHRpb25zLnNlbWlNYWpvckF4aXMpIHtcclxuICAgICAgb3B0aW9ucy5zZW1pTWFqb3JBeGlzID0gMC4wMDAwMVxyXG4gICAgfVxyXG4gICAgbGV0IGVsbGlwc2VHZW9tZXRyeSA9IG5ldyBDZXNpdW0uRWxsaXBzZU91dGxpbmVHZW9tZXRyeSh7XHJcbiAgICAgIGNlbnRlcjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoTnVtYmVyKHBvaW50LmxuZyksIE51bWJlcihwb2ludC5sYXQpKSxcclxuICAgICAgc2VtaU1ham9yQXhpczogTnVtYmVyKG9wdGlvbnMuc2VtaU1ham9yQXhpcyksXHJcbiAgICAgIHNlbWlNaW5vckF4aXM6IE51bWJlcihvcHRpb25zLnNlbWlNaW5vckF4aXMpLFxyXG4gICAgICBoZWlnaHQ6IE51bWJlcihvcHRpb25zLmhlaWdodCksXHJcbiAgICAgIGdyYW51bGFyaXR5OiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3B0aW9ucy5ncmFudWxhcml0eSksXHJcbiAgICAgIHJvdGF0aW9uOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3B0aW9ucy5iZWFyaW5nKSxcclxuICAgIH0pXHJcbiAgICBsZXQgZWxsaXBzZSA9IENlc2l1bS5FbGxpcHNlT3V0bGluZUdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5KGVsbGlwc2VHZW9tZXRyeSlcclxuICAgIGlmICghZWxsaXBzZSB8fCAhZWxsaXBzZS5hdHRyaWJ1dGVzIHx8ICFlbGxpcHNlLmF0dHJpYnV0ZXMucG9zaXRpb24pIHtcclxuICAgICAgcmV0dXJuIFtdXHJcbiAgICB9XHJcbiAgICBjb25zdCBlbGxpcHNlUG9zaXRpb25zID0gZWxsaXBzZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcztcclxuICAgIGxldCBwb3NpdGlvbnMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGxpcHNlUG9zaXRpb25zLmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgIGxldCBwb3MgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoXHJcbiAgICAgICAgZWxsaXBzZVBvc2l0aW9uc1tpXSxcclxuICAgICAgICBlbGxpcHNlUG9zaXRpb25zW2kgKyAxXSxcclxuICAgICAgICBlbGxpcHNlUG9zaXRpb25zW2kgKyAyXVxyXG4gICAgICApXHJcbiAgICAgIHBvc2l0aW9ucy5wdXNoKHBvcylcclxuICAgIH1cclxuICAgIHJldHVybiBwb3NpdGlvbnNcclxuICB9XHJcblxyXG4gIC8q6K6h566XMueCueeahOaBkuebuOe6v+WkueinkiovXHJcbiAgcmh1bWJCZWFyaW5nKHAxLCBwMikge1xyXG4gICAgdmFyIHBvaW50MSA9IHR1cmYucG9pbnQoW3AxLmxuZywgcDEubGF0XSwpO1xyXG4gICAgdmFyIHBvaW50MiA9IHR1cmYucG9pbnQoW3AyLmxuZywgcDIubGF0XSwpO1xyXG4gICAgcmV0dXJuIHR1cmYucmh1bWJCZWFyaW5nKHBvaW50MSwgcG9pbnQyKTtcclxuICB9XHJcblxyXG5cclxuICBjb21wdXRlQ2VudGVyKHBvc2l0aW9ucyA9IFtdKSB7XHJcbiAgICBsZXQgYXJyID0gW11cclxuICAgIHBvc2l0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGFyci5wdXNoKHR1cmYucG9pbnQoW2l0ZW0ubG5nLCBpdGVtLmxhdF0pKVxyXG4gICAgfSlcclxuICAgIHZhciBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oYXJyKVxyXG5cclxuICAgIHZhciBjb29yZGluYXRlcyA9IHR1cmYuY2VudGVyKGZlYXR1cmVzKS5nZW9tZXRyeS5jb29yZGluYXRlc1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbG5nOiBjb29yZGluYXRlc1swXSxcclxuICAgICAgbGF0OiBjb29yZGluYXRlc1sxXSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8v6K6h566XMueCueeahOS4reW/g+eCuVxyXG4gIGNvbXB1dGVNaWRwb2ludChwb2ludDEsIHBvaW50Mikge1xyXG4gICAgbGV0IHAxID0gdHVyZi5wb2ludChbcG9pbnQxLmxuZywgcG9pbnQxLmxhdF0pXHJcbiAgICBsZXQgcDIgPSB0dXJmLnBvaW50KFtwb2ludDIubG5nLCBwb2ludDIubGF0XSlcclxuICAgIHZhciBjZW50ZXIgPSB0dXJmLm1pZHBvaW50KHAxLCBwMikuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcclxuICAgIHJldHVybiB7IGxuZzogY2VudGVyWzBdLCBsYXQ6IGNlbnRlclsxXSB9XHJcbiAgfVxyXG5cclxuICAvL+iuoeeul1xyXG4gIGNvbXB1dGVBdHRhY2tBcnJvdyhwb3NpdGlvbnMgPSBbXSkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUFycm93KHBvc2l0aW9ucywgMClcclxuICB9XHJcblxyXG4gIC8v6K6h566X6ZKz5Ye7566t5aS0XHJcbiAgY29tcHV0ZVBpbmNlckFycm93KHBvc2l0aW9ucyA9IFtdKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlQXJyb3cocG9zaXRpb25zKVxyXG4gIH1cclxuXHJcbiAgLy/orqHnrpfmlLvlh7vnrq3lpLRcclxuICBjb21wdXRlQXJyb3cocG9zaXRpb25zID0gW10sIHR5cGUgPSAxKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDMpIHtcclxuICAgICAgcmV0dXJuIFtdXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgbG5nbGF0QXJyID0gW11cclxuICAgICAgLy8gaWYocG9zaXRpb25zLmV2ZXJ5KHBvcyA9PiBOdW1iZXIocG9zLmxuZykgPj0gMCkgfHwgcG9zaXRpb25zLmV2ZXJ5KHBvcyA9PiBOdW1iZXIocG9zLmxuZykgPD0gMCkpIHtcclxuICAgICAgLy8gICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAvLyAgICAgbG5nbGF0QXJyLnB1c2goW3Bvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXRdKVxyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBlbHNlIHtcclxuICAgICAgLy8gICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAvLyAgICAgaWYocG9zaXRpb25zW2ldLmxuZzwwKSB7XHJcbiAgICAgIC8vICAgICAgIGxuZ2xhdEFyci5wdXNoKFtwb3NpdGlvbnNbaV0ubG5nKzM2MCwgcG9zaXRpb25zW2ldLmxhdF0pXHJcbiAgICAgIC8vICAgICB9XHJcbiAgICAgIC8vICAgICBlbHNlIHtcclxuICAgICAgLy8gICAgICAgbG5nbGF0QXJyLnB1c2goW3Bvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXRdKVxyXG4gICAgICAvLyAgICAgfVxyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxuZ2xhdEFyci5wdXNoKFtwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0XSlcclxuICAgICAgfVxyXG4gICAgICB2YXIgcmVzXHJcbiAgICAgIGlmICh0eXBlKSB7XHJcbiAgICAgICAgcmVzID0geHAuYWxnb3JpdGhtLmRvdWJsZUFycm93KGxuZ2xhdEFycilcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXMgPSB4cC5hbGdvcml0aG0udGFpbGVkQXR0YWNrQXJyb3cobG5nbGF0QXJyKVxyXG4gICAgICB9XHJcbiAgICAgIHZhciBpbmRleCA9IEpTT04uc3RyaW5naWZ5KHJlcy5wb2x5Z29uYWxQb2ludCkuaW5kZXhPZignbnVsbCcpXHJcbiAgICAgIHZhciByZXR1cm5EYXRhID0gW11cclxuICAgICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuRGF0YSA9IHJlcy5wb2x5Z29uYWxQb2ludFxyXG4gICAgICByZXR1cm4gcmV0dXJuRGF0YVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X6ZuG57uT5ZywXHJcbiAgY29tcHV0ZUFzc2VtYmxlKHBvc2l0aW9ucyA9IFtdLCBpczg0ID0gZmFsc2UpIHtcclxuICAgIGlmIChwb3NpdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gW11cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBwb2ludHMgPSBwb3NpdGlvbnMubGVuZ3RoO1xyXG4gICAgICBsZXQgcG50cyA9IG5ldyBBcnJheSgpO1xyXG4gICAgICBwb3NpdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIHBudHMucHVzaChbaXRlbS5sbmcsIGl0ZW0ubGF0XSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICAvL2NvbnNvbGUubG9nKFwicG50czY2NjZcIixwbnRzKTtcclxuICAgICAgLy8gcG50cy5wdXNoKHRhaWxQb2ludCk7XHJcbiAgICAgIC8vIHBudHMucHVzaChoZWFkZXJQb2ludCk7XHJcblxyXG4gICAgICBpZiAocG50cy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICBsZXQgbWlkID0gUC5QbG90VXRpbHMubWlkKHBudHNbMF0sIHBudHNbMV0pXHJcbiAgICAgICAgLy9sZXQgZCA9IHV0aWxzLk1hdGhEaXN0YW5jZShwbnRzWzBdLCBtaWQpIC8gMC45XHJcbiAgICAgICAgbGV0IGQgPSBQLlBsb3RVdGlscy5kaXN0YW5jZShwbnRzWzBdLCBtaWQpIC8gMC45XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImRcIixkKTtcclxuICAgICAgICBsZXQgcG50ID0gUC5QbG90VXRpbHMuZ2V0VGhpcmRQb2ludChwbnRzWzBdLCBtaWQsIFAuQ29uc3RhbnRzLkhBTEZfUEksIGQsIHRydWUpXHJcbiAgICAgICAgcG50cyA9IFtwbnRzWzBdLCBwbnQsIHBudHNbMV1dO1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJwbnRcIixwbnQpO1xyXG4gICAgICAgIC8vY3JlYXRlUG9pbnQoQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG50WzBdLCBwbnRbMV0pKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgbWlkID0gUC5QbG90VXRpbHMubWlkKHBudHNbMF0sIHBudHNbMl0pXHJcbiAgICAgIHBudHMucHVzaChtaWQsIHBudHNbMF0sIHBudHNbMV0pXHJcblxyXG4gICAgICBsZXQgW25vcm1hbHMsIHBudDEsIHBudDIsIHBudDMsIHJlc3VsdCwgcmVzdWx0Ml0gPSBbW10sIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFtdLCBbXV1cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbnRzLmxlbmd0aCAtIDI7IGkrKykge1xyXG4gICAgICAgIHBudDEgPSBwbnRzW2ldXHJcbiAgICAgICAgcG50MiA9IHBudHNbaSArIDFdXHJcbiAgICAgICAgcG50MyA9IHBudHNbaSArIDJdXHJcbiAgICAgICAgbGV0IG5vcm1hbFBvaW50cyA9IFAuUGxvdFV0aWxzLmdldEJpc2VjdG9yTm9ybWFscygwLjQsIHBudDEsIHBudDIsIHBudDMpXHJcbiAgICAgICAgbm9ybWFscyA9IG5vcm1hbHMuY29uY2F0KG5vcm1hbFBvaW50cylcclxuICAgICAgfVxyXG4gICAgICBsZXQgY291bnQgPSBub3JtYWxzLmxlbmd0aFxyXG4gICAgICBub3JtYWxzID0gW25vcm1hbHNbY291bnQgLSAxXV0uY29uY2F0KG5vcm1hbHMuc2xpY2UoMCwgY291bnQgLSAxKSlcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbnRzLmxlbmd0aCAtIDI7IGkrKykge1xyXG4gICAgICAgIHBudDEgPSBwbnRzW2ldXHJcbiAgICAgICAgcG50MiA9IHBudHNbaSArIDFdXHJcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChbLi4ucG50MV0pXHJcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPD0gUC5Db25zdGFudHMuRklUVElOR19DT1VOVDsgdCsrKSB7XHJcbiAgICAgICAgICBsZXQgcG50ID0gUC5QbG90VXRpbHMuZ2V0Q3ViaWNWYWx1ZSh0IC8gUC5Db25zdGFudHMuRklUVElOR19DT1VOVCwgcG50MSwgbm9ybWFsc1tpICogMl0sIG5vcm1hbHNbaSAqIDIgKyAxXSwgcG50MilcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoWy4uLnBudF0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoWy4uLnBudDJdKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChpczg0KSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KHJlc3VsdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X55u057q/566t5aS0XHJcbiAgY29tcHV0ZVN0cmFpZ2h0QXJyb3cocG9zaXRpb25zID0gW10sIGlzODQgPSBmYWxzZSkge1xyXG4gICAgaWYgKHBvc2l0aW9ucy5sZW5ndGggPCAyKSB7XHJcbiAgICAgIHJldHVybiBbXVxyXG4gICAgfVxyXG4gICAgbGV0IHBvaW50MSA9IFtwb3NpdGlvbnNbMF0ubG5nLCBwb3NpdGlvbnNbMF0ubGF0XVxyXG4gICAgbGV0IHBvaW50MiA9IFtwb3NpdGlvbnNbMV0ubG5nLCBwb3NpdGlvbnNbMV0ubGF0XVxyXG4gICAgaWYgKHBvc2l0aW9uc1swXS5sbmcgPT09IHBvc2l0aW9uc1sxXS5sbmcgJiYgcG9zaXRpb25zWzBdLmxhdCA9PT0gcG9zaXRpb25zWzFdLmxhdCkge1xyXG4gICAgICBpZiAoaXM4NCkge1xyXG4gICAgICAgIHJldHVybiBbcG9zaXRpb25zWzBdLCBwb3NpdGlvbnNbMF0sIHBvc2l0aW9uc1swXV1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgY2FydGVzaWFuMyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHBvc2l0aW9uc1swXS5sbmcsIHBvc2l0aW9uc1swXS5sYXQpXHJcbiAgICAgICAgcmV0dXJuIFtjYXJ0ZXNpYW4zLCBjYXJ0ZXNpYW4zLCBjYXJ0ZXNpYW4zXVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgbG5nbGF0QXJyID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxuZ2xhdEFyci5wdXNoKFtwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0XSlcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzXHJcbiAgICByZXMgPSB4cC5hbGdvcml0aG0uZmluZUFycm93KHBvaW50MSwgcG9pbnQyKVxyXG4gICAgaWYgKGlzODQpIHtcclxuICAgICAgbGV0IHBvczg0ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcG9zID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChyZXNbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICBwb3M4NC5wdXNoKHBvcy5sbmcsIHBvcy5sYXQpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBvczg0XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzXHJcbiAgfVxyXG5cclxuICBnZXRNYXRlcmlhbChjb2xvciA9ICcjMmFiMGMyJywgdHlwZSA9IDAsIGVudGl0eSA9IG51bGwsIG5ld1BhcmFtID0ge30pIHtcclxuICAgIGxldCBtYXRlcmlhbCA9ICcnXHJcbiAgICBsZXQgYXJyID0ge1xyXG4gICAgICAnNyc6IDEwLFxyXG4gICAgICAnOCc6IDMsXHJcbiAgICAgICc5JzogNCxcclxuICAgICAgJzEwJzogNCxcclxuICAgICAgJzExJzogNCxcclxuICAgICAgJzEyJzogMlxyXG4gICAgfVxyXG4gICAgaWYgKGVudGl0eSkge1xyXG4gICAgICBhcnJbdHlwZSArICcnXSA/IChlbnRpdHkucG9seWxpbmUud2lkdGggPSBlbnRpdHkucG9seWxpbmUub3JpV2lkdGggKyBhcnJbdHlwZSArICcnXSkgOiAoZW50aXR5LnBvbHlsaW5lLndpZHRoID0gZW50aXR5LnBvbHlsaW5lLm9yaVdpZHRoKVxyXG4gICAgfVxyXG4gICAgc3dpdGNoIChOdW1iZXIodHlwZSkpIHtcclxuXHJcbiAgICAgIGNhc2UgMTogLy/omZrnur9cclxuICAgICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uUG9seWxpbmVEYXNoTWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgICAgICBjb2xvcjogQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhjb2xvciksXHJcbiAgICAgICAgICBkYXNoTGVuZ3RoOiAxMCwgLy/nn63liJLnur/plb/luqZcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMjogLy/ms5vlhYlcclxuICAgICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uUG9seWxpbmVHbG93TWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgICAgICBnbG93UG93ZXI6IDAuMixcclxuICAgICAgICAgIGNvbG9yOiBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKGNvbG9yKSxcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMzogLy/lsL7ov7nlhYnnur9cclxuICAgICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uUG9seWxpbmVGbG93TWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgICAgICBjb2xvcjogY29sb3IsXHJcbiAgICAgICAgICBzcGVlZDogbmV3UGFyYW0ucm90YXRlID8gbmV3UGFyYW0uc3BlZWQgOiAwIC0gbmV3UGFyYW0uc3BlZWQsXHJcbiAgICAgICAgICByb3RhdGU6IG5ld1BhcmFtLnJvdGF0ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSA0OiAvL+WkmuWwvui/ueWFiee6v1xyXG4gICAgICAgIG1hdGVyaWFsID0gbmV3IENlc2l1bS5Qb2x5bGluZUZsb3dNdWx0TWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgICAgICBjb2xvcjogY29sb3IsXHJcbiAgICAgICAgICBzcGVlZDogbmV3UGFyYW0ucm90YXRlID8gbmV3UGFyYW0uc3BlZWQgOiAwIC0gbmV3UGFyYW0uc3BlZWQsXHJcbiAgICAgICAgICByb3RhdGU6IG5ld1BhcmFtLnJvdGF0ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSA1OiAvL+aZrumAmua1geWKqOiZmue6v1xyXG4gICAgICAvLyBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uRmxvd0Rhc2hlZExpbmVGbG93TWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgIC8vICAgY29sb3I6IGNvbG9yLFxyXG4gICAgICAvLyAgIHVUeXBlOiAwLFxyXG4gICAgICAvLyAgIHNwZWVkOiBuZXdQYXJhbS5yb3RhdGUgPyBuZXdQYXJhbS5zcGVlZCA6IDAgLSBuZXdQYXJhbS5zcGVlZCxcclxuICAgICAgLy8gICAvLyBkYXNoU2l6ZTogbmV3UGFyYW0uZGFzaFNpemUsXHJcbiAgICAgIC8vICAgc3BhY2U6IG5ld1BhcmFtLnNwYWNlLFxyXG4gICAgICAvLyAgIHNjYWxlOiAxLjBcclxuICAgICAgLy8gfSlcclxuICAgICAgLy8gYnJlYWtcclxuICAgICAgY2FzZSA2OiAvL+a1geWKqOiZmue6vzJcclxuICAgICAgICBsZXQgdGhhdCA9IHRoaXNcclxuICAgICAgICBsZXQgcmVwZWF0WFxyXG4gICAgICAgIG1hdGVyaWFsID0gbmV3IENlc2l1bS5GbG93RGFzaGVkTGluZUZsb3dNYXRlcmlhbFByb3BlcnR5KHtcclxuICAgICAgICAgIGNvbG9yOiBjb2xvcixcclxuICAgICAgICAgIHVUeXBlOiB0eXBlID09IDUgPyAwIDogMSxcclxuICAgICAgICAgIHNwZWVkOiBuZXdQYXJhbS5yb3RhdGUgPyBuZXdQYXJhbS5zcGVlZCA6IDAgLSBuZXdQYXJhbS5zcGVlZCxcclxuICAgICAgICAgIC8vIGRhc2hTaXplOiBuZXdQYXJhbS5kYXNoU2l6ZSxcclxuICAgICAgICAgIHNwYWNlOiBuZXdQYXJhbS5zcGFjZSxcclxuICAgICAgICAgIHNjYWxlOiBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoYXQuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FM0QpIHtcclxuICAgICAgICAgICAgICBsZXQgb3JpUG9zaXRpb25zID0gZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucy5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIUNlc2l1bS5kZWZpbmVkKG9yaVBvc2l0aW9ucykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAxLjA7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGxldCBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlQb3NpdGlvbnMubGVuZ3RoIC0gMTsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSArPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShvcmlQb3NpdGlvbnNbaV0sIG9yaVBvc2l0aW9uc1tpICsgMV0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL+Wxj+W5leWdkOagh1xyXG4gICAgICAgICAgICAgIGxldCBwb2ludDEgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMCwgdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgbGV0IHBvaW50MiA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMih0aGF0LnNkay52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoIC8gMiwgdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgbGV0IGNhcnRlc2lhbjEgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MSlcclxuICAgICAgICAgICAgICBsZXQgY2FydGVzaWFuMiA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5waWNrUG9zaXRpb24ocG9pbnQyKVxyXG4gICAgICAgICAgICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBkaXN0YW5jZTIgPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShjYXJ0ZXNpYW4xLCBjYXJ0ZXNpYW4yKTtcclxuICAgICAgICAgICAgICAgIHJlcGVhdFggPSBkaXN0YW5jZTIgKiAyIC8gZGlzdGFuY2VcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcGVhdFg7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbGV0IHNkazNkID0gZ2V0M0RWaWV3KClcclxuICAgICAgICAgICAgICBsZXQgc2RrM2RFbnRpdHkgPSBzZGszZC52aWV3ZXIuZW50aXRpZXMuZ2V0QnlJZCh0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICAgICAgICAgICAgbGV0IG9yaVBvc2l0aW9ucyA9IHNkazNkRW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucy5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIUNlc2l1bS5kZWZpbmVkKG9yaVBvc2l0aW9ucykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAxLjA7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGxldCBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlQb3NpdGlvbnMubGVuZ3RoIC0gMTsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSArPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShvcmlQb3NpdGlvbnNbaV0sIG9yaVBvc2l0aW9uc1tpICsgMV0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL+Wxj+W5leWdkOagh1xyXG4gICAgICAgICAgICAgIGxldCBwb2ludDEgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMCwgc2RrM2Qudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgbGV0IHBvaW50MiA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMihzZGszZC52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoIC8gMiwgc2RrM2Qudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgbGV0IGNhcnRlc2lhbjEgPSBzZGszZC52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MSlcclxuICAgICAgICAgICAgICBsZXQgY2FydGVzaWFuMiA9IHNkazNkLnZpZXdlci5zY2VuZS5waWNrUG9zaXRpb24ocG9pbnQyKVxyXG4gICAgICAgICAgICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBkaXN0YW5jZTIgPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShjYXJ0ZXNpYW4xLCBjYXJ0ZXNpYW4yKTtcclxuICAgICAgICAgICAgICAgIHJlcGVhdFggPSBkaXN0YW5jZTIgKiAyIC8gZGlzdGFuY2VcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcGVhdFg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDc6IC8v5rWB5Yqo566t5aS0MVxyXG4gICAgICBjYXNlIDg6IC8v5rWB5Yqo566t5aS0MlxyXG4gICAgICBjYXNlIDk6IC8v5rWB5Yqo566t5aS0M1xyXG4gICAgICBjYXNlIDEwOiAvL+a1geWKqOeureWktDRcclxuICAgICAgY2FzZSAxMTogLy/mtYHliqjnrq3lpLQ1XHJcbiAgICAgIGNhc2UgMTI6IC8v5rWB5Yqo566t5aS0NlxyXG4gICAgICAgIGxldCBwYXJhbSA9IHtcclxuICAgICAgICAgIGNvbG9yOiBjb2xvcixcclxuICAgICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyBgL2ltZy9hcnJvdy8ke3R5cGUgLSA2fS5wbmdgLFxyXG4gICAgICAgICAgc3BhY2U6IG5ld1BhcmFtLnNwYWNlLFxyXG4gICAgICAgICAgc3BlZWQ6IG5ld1BhcmFtLnNwZWVkXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwYXJhbS5zcGVlZCA9IG5ld1BhcmFtLnJvdGF0ZSA/IHBhcmFtLnNwZWVkIDogMCAtIHBhcmFtLnNwZWVkXHJcblxyXG4gICAgICAgIHRoaXMuZ2V0Rmxvd1RleHR1cmUodGhpcywgcGFyYW0sIGVudGl0eSlcclxuXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBtYXRlcmlhbCA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoY29sb3IpXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIHJldHVybiBtYXRlcmlhbFxyXG4gIH1cclxuXHJcbiAgZ2V0Rmxvd1RleHR1cmUodGhhdCwgb3B0aW9ucywgZW50aXR5KSB7XHJcblxyXG4gICAgY29uc3QgY2FudmFzRWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICBjb25zdCBjdHggPSBjYW52YXNFbGUuZ2V0Q29udGV4dCgnMmQnKVxyXG4gICAgY29uc3QgbXlJbWcgPSBuZXcgSW1hZ2UoKVxyXG4gICAgLy8gbXlJbWcuc3JjID0gdGhhdC5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvYXJyb3cvMS5wbmcnXHJcbiAgICBteUltZy5zcmMgPSBvcHRpb25zLmltYWdlXHJcbiAgICBteUltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIG9wdGlvbnMuc3BhY2UgPSBNYXRoLm1heCgwLjEsIG9wdGlvbnMuc3BhY2UpO1xyXG4gICAgICBpZiAob3B0aW9ucy5zcGVlZCA+IDAgfHwgb3B0aW9ucy5zcGVlZCA9PSAwKSB7XHJcbiAgICAgICAgY2FudmFzRWxlLndpZHRoID0gbXlJbWcud2lkdGggKiAob3B0aW9ucy5zcGFjZSArIDEpXHJcbiAgICAgICAgY2FudmFzRWxlLmhlaWdodCA9IG15SW1nLmhlaWdodFxyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UobXlJbWcsIG15SW1nLndpZHRoICogKG9wdGlvbnMuc3BhY2UgLyAyKSwgMClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhc0VsZS53aWR0aCwgY2FudmFzRWxlLmhlaWdodCk7XHJcbiAgICAgICAgY2FudmFzRWxlLndpZHRoID0gbXlJbWcud2lkdGggKiAob3B0aW9ucy5zcGFjZSArIDEpXHJcbiAgICAgICAgY2FudmFzRWxlLmhlaWdodCA9IG15SW1nLmhlaWdodFxyXG4gICAgICAgIGN0eC5zYXZlKCk7IC8vIOS/neWtmOW9k+WJjeeKtuaAgVxyXG4gICAgICAgIGN0eC50cmFuc2xhdGUoY2FudmFzRWxlLndpZHRoIC8gMiwgY2FudmFzRWxlLmhlaWdodCAvIDIpOyAvLyDnp7vliqjljp/ngrnoh7PkuK3lv4NcclxuICAgICAgICBjdHgucm90YXRlKE1hdGguUEkpOyAvLyDvvIjlvKfluqbliLbvvIlcclxuICAgICAgICBjdHgudHJhbnNsYXRlKC1jYW52YXNFbGUud2lkdGggLyAyLCAtY2FudmFzRWxlLmhlaWdodCAvIDIpOyAvLyDnp7vlm57ljp/ngrlcclxuICAgICAgICBjdHguZHJhd0ltYWdlKG15SW1nLCBteUltZy53aWR0aCAqIChvcHRpb25zLnNwYWNlIC8gMiksIDApXHJcbiAgICAgICAgY3R4LnJlc3RvcmUoKTsgLy8g5oGi5aSN54q25oCBXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGxldCByZXBlYXQgPSBnZXRSZXBlYXQoKVxyXG4gICAgICAvLyB9LCBmYWxzZSlcclxuICAgICAgLy8gZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsLm9yaVJlcGVhdCA9IHRoYXQuZ2V0U2NlZW5MaW5lKGVudGl0eSwgb3B0aW9ucywgY2FudmFzRWxlKVxyXG4gICAgICAvLyBlbnRpdHkucG9seWxpbmUubWF0ZXJpYWwub3JpU3BlZWQgPSB1bmRlZmluZWRcclxuICAgICAgbGV0IGJlZm9yZVNwZWVkID0gMCwgcmVwZWF0ID0gMFxyXG4gICAgICBlbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLkxpbmVUZXh0dXJlTWF0ZXJpYWxQcm9wZXJ0eShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvcixcclxuICAgICAgICAgIGltYWdlOiBjYW52YXNFbGUsXHJcbiAgICAgICAgICBzcGVlZDogb3B0aW9ucy5zcGVlZCxcclxuICAgICAgICAgIHJlcGVhdDogbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gQ2VzaXVtLlNjZW5lTW9kZS5TQ0VORTNEKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uUHJvcGVydHkgPSBlbnRpdHkucG9seWxpbmUucG9zaXRpb25zO1xyXG4gICAgICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSBwb3NpdGlvblByb3BlcnR5LmdldFZhbHVlKHRoYXQuc2RrLnZpZXdlci5jbG9jay5jdXJyZW50VGltZSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghQ2VzaXVtLmRlZmluZWQocG9zaXRpb25zKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMigxLjAsIDEuMCk7XHJcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gMS4wO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgbGV0IGRpc3RhbmNlID0gMDtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLSAxOyArK2kpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZT09PUNlc2l1bS5TY2VuZU1vZGUuU0NFTkUyRCl7fVxyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgKz0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGxldCByZXBlYXRYID0gZGlzdGFuY2UgLyBlbnRpdHkucG9seWxpbmUud2lkdGguZ2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAvLyDmoLnmja7lnLDlm77nvKnmlL7nqIvluqbosIPmlbRyZXBlYXRYXHJcbiAgICAgICAgICAgICAgbGV0IGNhbWVyYUhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5jYW1lcmEucG9zaXRpb25DYXJ0b2dyYXBoaWMuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgIGxldCBib3VuZGluZ1NwaGVyZSA9IG5ldyBDZXNpdW0uQm91bmRpbmdTcGhlcmUoXHJcbiAgICAgICAgICAgICAgICBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoLTEwMDAwMDAsIDAsIDApLCAvLyDkuK3lv4PngrnlnZDmoIdcclxuICAgICAgICAgICAgICAgIDUwMDAwMCAvLyDljYrlvoTvvIjot53nprvvvIlcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAvLyDojrflj5bnu5jlm77nvJPlhrLljLrnmoTlrr3luqblkozpq5jluqbvvIjpgJrluLjmmK/lsY/luZXnmoTliIbovqjnjofvvIlcclxuICAgICAgICAgICAgICBsZXQgZHJhd2luZ0J1ZmZlcldpZHRoID0gdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aDtcclxuICAgICAgICAgICAgICBsZXQgZHJhd2luZ0J1ZmZlckhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAvLyDkvb/nlKggZ2V0UGl4ZWxTaXplIOaWueazleiOt+WPluWMheWbtOeQg+WcqOWxj+W5leS4iueahOWDj+e0oOWkp+Wwj1xyXG4gICAgICAgICAgICAgIGxldCBncm91bmRSZXNvbHV0aW9uID0gdGhhdC5zZGsudmlld2VyLnNjZW5lLmNhbWVyYS5nZXRQaXhlbFNpemUoYm91bmRpbmdTcGhlcmUsIGRyYXdpbmdCdWZmZXJXaWR0aCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgICAgICAgICAgICBsZXQgcmVzdWx0XHJcbiAgICAgICAgICAgICAgaWYgKGdyb3VuZFJlc29sdXRpb24gPiA3MDApIHtcclxuICAgICAgICAgICAgICAgIHJlcGVhdFggKj0gZ3JvdW5kUmVzb2x1dGlvbiAvIGNhbWVyYUhlaWdodCAvIChvcHRpb25zLnNwYWNlICogKGNhbnZhc0VsZS53aWR0aCAvIGNhbnZhc0VsZS5oZWlnaHQgKiA1KSArIDEpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgKGVudGl0eS5wb2x5bGluZS5tYXRlcmlhbC5vcmlSZXBlYXQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzcGVlZCA9IHJlcGVhdFggLyBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0XHJcbiAgICAgICAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpU3BlZWQgPSBzcGVlZFxyXG4gICAgICAgICAgICAgICAgZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFggPSByZXBlYXRYXHJcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gICBlbnRpdHkucG9seWxpbmUubWF0ZXJpYWwub3JpUmVwZWF0ID0gcmVwZWF0WFxyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgYmVmb3JlU3BlZWQgPSBzcGVlZFxyXG4gICAgICAgICAgICAgICAgcmVwZWF0ID0gcmVwZWF0WFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKHJlcGVhdFgsIHNwZWVkIHx8IDEuMClcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKHJlcGVhdCB8fCBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCwgYmVmb3JlU3BlZWQgfHwgZW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkKVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxldCBzZGszZCA9IGdldDNEVmlldygpXHJcbiAgICAgICAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhhdC5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgICAgIGxldCBwb3NpdGlvblByb3BlcnR5ID0gc2RrM2RFbnRpdHkucG9seWxpbmUucG9zaXRpb25zO1xyXG4gICAgICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSBwb3NpdGlvblByb3BlcnR5LmdldFZhbHVlKHNkazNkLnZpZXdlci5jbG9jay5jdXJyZW50VGltZSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghQ2VzaXVtLmRlZmluZWQocG9zaXRpb25zKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMigxLjAsIDEuMCk7XHJcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gMS4wO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgbGV0IGRpc3RhbmNlID0gMDtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLSAxOyArK2kpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZT09PUNlc2l1bS5TY2VuZU1vZGUuU0NFTkUyRCl7fVxyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgKz0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGxldCByZXBlYXRYID0gZGlzdGFuY2UgLyBzZGszZEVudGl0eS5wb2x5bGluZS53aWR0aC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgIC8vIOagueaNruWcsOWbvue8qeaUvueoi+W6puiwg+aVtHJlcGVhdFhcclxuICAgICAgICAgICAgICBsZXQgY2FtZXJhSGVpZ2h0ID0gc2RrM2Qudmlld2VyLmNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYy5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgbGV0IGJvdW5kaW5nU3BoZXJlID0gbmV3IENlc2l1bS5Cb3VuZGluZ1NwaGVyZShcclxuICAgICAgICAgICAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygtMTAwMDAwMCwgMCwgMCksIC8vIOS4reW/g+eCueWdkOagh1xyXG4gICAgICAgICAgICAgICAgNTAwMDAwIC8vIOWNiuW+hO+8iOi3neemu++8iVxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICAgICAgICAgIGxldCBkcmF3aW5nQnVmZmVyV2lkdGggPSBzZGszZC52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoO1xyXG4gICAgICAgICAgICAgIGxldCBkcmF3aW5nQnVmZmVySGVpZ2h0ID0gc2RrM2Qudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgICAgICAgICAgbGV0IGdyb3VuZFJlc29sdXRpb24gPSBzZGszZC52aWV3ZXIuc2NlbmUuY2FtZXJhLmdldFBpeGVsU2l6ZShib3VuZGluZ1NwaGVyZSwgZHJhd2luZ0J1ZmZlcldpZHRoLCBkcmF3aW5nQnVmZmVySGVpZ2h0KVxyXG4gICAgICAgICAgICAgIGxldCByZXN1bHRcclxuICAgICAgICAgICAgICBpZiAoZ3JvdW5kUmVzb2x1dGlvbiA+IDcwMCkge1xyXG4gICAgICAgICAgICAgICAgcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKG9wdGlvbnMuc3BhY2UgKiAoY2FudmFzRWxlLndpZHRoIC8gY2FudmFzRWxlLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiAoZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsLm9yaVJlcGVhdCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNwZWVkID0gcmVwZWF0WCAvIHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFxyXG4gICAgICAgICAgICAgICAgc2RrM2RFbnRpdHkucG9seWxpbmUub3JpU3BlZWQgPSBzcGVlZFxyXG4gICAgICAgICAgICAgICAgc2RrM2RFbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCA9IHJlcGVhdFhcclxuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgIGVudGl0eS5wb2x5bGluZS5tYXRlcmlhbC5vcmlSZXBlYXQgPSByZXBlYXRYXHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICBiZWZvcmVTcGVlZCA9IHNwZWVkXHJcbiAgICAgICAgICAgICAgICByZXBlYXQgPSByZXBlYXRYXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIocmVwZWF0WCwgc3BlZWQgfHwgMS4wKVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIocmVwZWF0IHx8IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFgsIGJlZm9yZVNwZWVkIHx8IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkKVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAvLyByZXR1cm4gcmVwZWF0WDtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICAgIGxldCBvcmlSZXBlYXQgPSB0aGF0LmdldFNjZWVuTGluZShlbnRpdHksIG9wdGlvbnMsIGNhbnZhc0VsZSlcclxuICAgICAgb3JpUmVwZWF0ICYmIChlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0ID0gb3JpUmVwZWF0KVxyXG4gICAgfVxyXG4gIH1cclxuICAvKirojrflj5blvZPliY3mu6HlsY/mqKrnur/pgJ/luqYgKi9cclxuICBnZXRTY2VlbkxpbmUoZW50aXR5LCBvcHRpb25zLCBjYW52YXNFbGUpIHtcclxuICAgIGxldCBwb2ludDEgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMCwgdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICBsZXQgcG9pbnQyID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50V2lkdGggLyAyLCB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodClcclxuICAgIC8vIHZhciBjYXJ0ZXNpYW4xID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLnBpY2tQb3NpdGlvbihwb2ludDEpXHJcbiAgICAvLyB2YXIgY2FydGVzaWFuMiA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5waWNrUG9zaXRpb24ocG9pbnQyKVxyXG4gICAgbGV0IHJheSA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDEpO1xyXG4gICAgbGV0IGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXksIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcblxyXG4gICAgbGV0IHJheTIgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmdldFBpY2tSYXkocG9pbnQyKTtcclxuICAgIGxldCBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5MiwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuICAgICAgdmFyIGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UoY2FydGVzaWFuMSwgY2FydGVzaWFuMik7XHJcblxyXG4gICAgICB2YXIgcmVwZWF0WCA9IGRpc3RhbmNlIC8gZW50aXR5LnBvbHlsaW5lLndpZHRoLmdldFZhbHVlKCk7XHJcbiAgICAgIC8vIOagueaNruWcsOWbvue8qeaUvueoi+W6puiwg+aVtHJlcGVhdFhcclxuICAgICAgdmFyIGNhbWVyYUhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEucG9zaXRpb25DYXJ0b2dyYXBoaWMuaGVpZ2h0O1xyXG4gICAgICB2YXIgYm91bmRpbmdTcGhlcmUgPSBuZXcgQ2VzaXVtLkJvdW5kaW5nU3BoZXJlKFxyXG4gICAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygtMTAwMDAwMCwgMCwgMCksIC8vIOS4reW/g+eCueWdkOagh1xyXG4gICAgICAgIDUwMDAwMCAvLyDljYrlvoTvvIjot53nprvvvIlcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICB2YXIgZHJhd2luZ0J1ZmZlcldpZHRoID0gdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aDtcclxuICAgICAgdmFyIGRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgIHZhciBncm91bmRSZXNvbHV0aW9uID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmNhbWVyYS5nZXRQaXhlbFNpemUoYm91bmRpbmdTcGhlcmUsIGRyYXdpbmdCdWZmZXJXaWR0aCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgICAgLy8gcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKChteUltZy53aWR0aCAvIG15SW1nLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIGlmIChncm91bmRSZXNvbHV0aW9uID4gNzAwKSB7XHJcbiAgICAgICAgcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKG9wdGlvbnMuc3BhY2UgKiAoY2FudmFzRWxlLndpZHRoIC8gY2FudmFzRWxlLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVwZWF0WCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FM0QpIHtcclxuICAgICAgICByZXR1cm4gcmVwZWF0WFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBzZGszZCA9IGdldDNEVmlldygpXHJcbiAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIHJldHVybiBzZGszZEVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8q5Yib5bu655u0566t5aS05Zu+54mHKi9cclxuICBjcmVhdGVfYXJyb3cxX3BpY3R1cmUoY29sb3IpIHtcclxuICAgIGxldCBjYW52YXMgPSBuZXcgZmFicmljLkNhbnZhcygnY2FudmFzJylcclxuICAgIGNhbnZhcy53aWR0aCA9IDE1MFxyXG4gICAgY2FudmFzLmhlaWdodCA9IDc1XHJcbiAgICBsZXQgd19vZmZzZXQgPSAzNVxyXG4gICAgbGV0IGhfb2Zmc2V0ID0gMjBcclxuICAgIGxldCBmaWxsID0gY29sb3JcclxuICAgIGxldCBwb2x5Z29uID0gbmV3IGZhYnJpYy5Qb2x5Z29uKFxyXG4gICAgICBbXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGgsIHk6IGNhbnZhcy5oZWlnaHQgLyAyIH0sIC8v566t5aS05Y+z6L656aG254K5XHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldCwgeTogY2FudmFzLmhlaWdodCB9LCAvL+mhuuaXtumSiFxyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC0gd19vZmZzZXQsIHk6IGNhbnZhcy5oZWlnaHQgLSBoX29mZnNldCB9LCAvL1xyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC8gMiwgeTogY2FudmFzLmhlaWdodCAtIGhfb2Zmc2V0IH0sIC8vXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLyAyLCB5OiBoX29mZnNldCB9LCAvL1xyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC0gd19vZmZzZXQsIHk6IGhfb2Zmc2V0IH0sIC8vXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldCwgeTogMCB9LCAvL1xyXG4gICAgICBdLFxyXG4gICAgICB7XHJcbiAgICAgICAgZmlsbCxcclxuICAgICAgfVxyXG4gICAgKVxyXG4gICAgY2FudmFzLmFkZChwb2x5Z29uKVxyXG5cclxuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKClcclxuICB9XHJcblxyXG4gIC8q5Yib5bu6566t5aS05Zu+54mHKi9cclxuXHJcbiAgY3JlYXRlX2Fycm93Ml9waWN0dXJlKGNvbG9yKSB7XHJcbiAgICBsZXQgY2FudmFzID0gbmV3IGZhYnJpYy5DYW52YXMoJ2NhbnZhcycpXHJcbiAgICBjYW52YXMud2lkdGggPSA3NVxyXG4gICAgY2FudmFzLmhlaWdodCA9IDc1XHJcbiAgICBsZXQgd19vZmZzZXQxID0gMzVcclxuICAgIGxldCB3X29mZnNldDIgPSA0MFxyXG4gICAgbGV0IGZpbGwgPSBjb2xvclxyXG4gICAgbGV0IHBvbHlnb24gPSBuZXcgZmFicmljLlBvbHlnb24oXHJcbiAgICAgIFtcclxuICAgICAgICB7IHg6IGNhbnZhcy53aWR0aCwgeTogY2FudmFzLmhlaWdodCAvIDIgfSxcclxuICAgICAgICB7IHg6IGNhbnZhcy53aWR0aCAtIHdfb2Zmc2V0MSwgeTogY2FudmFzLmhlaWdodCB9LFxyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC0gd19vZmZzZXQxIC0gd19vZmZzZXQyLCB5OiBjYW52YXMuaGVpZ2h0IH0sXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldDIsIHk6IGNhbnZhcy5oZWlnaHQgLyAyIH0sXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldDEgLSB3X29mZnNldDIsIHk6IDAgfSxcclxuICAgICAgICB7IHg6IGNhbnZhcy53aWR0aCAtIHdfb2Zmc2V0MSwgeTogMCB9LFxyXG4gICAgICBdLFxyXG4gICAgICB7XHJcbiAgICAgICAgZmlsbCxcclxuICAgICAgfVxyXG4gICAgKVxyXG4gICAgY2FudmFzLmFkZChwb2x5Z29uKVxyXG5cclxuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKClcclxuICB9XHJcblxyXG4gIHNhbXBsZUhlaWdodE1vc3REZXRhaWxlZChwb3NpdGlvbnMpIHtcclxuICAgIGxldCBjYXJ0ZXNpYW5zID0gW11cclxuICAgIHBvc2l0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNhcnRlc2lhbnMucHVzaChuZXcgQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhpdGVtLmxuZywgaXRlbS5sYXQpKVxyXG4gICAgfSlcclxuICAgIHJldHVybiB0aGlzLnNkay52aWV3ZXIuc2NlbmUuc2FtcGxlSGVpZ2h0TW9zdERldGFpbGVkKGNhcnRlc2lhbnMpXHJcbiAgfVxyXG5cclxuICBmbHlIb21lKGR1cmF0aW9uID0gMykge1xyXG4gICAgc2V0QWN0aXZlVmlld2VyKDApXHJcbiAgICBjbG9zZVJvdGF0ZUFyb3VuZCh0aGlzLnNkaylcclxuICAgIGNsb3NlVmlld0ZvbGxvdyh0aGlzLnNkaylcclxuXHJcbiAgICBpZiAodGhpcy5zZGsudmlld2VyLkNBTUVSQV9ERUZBVUxUX1ZJRVdfUkVDVEFOR0xFKSB7XHJcbiAgICAgIGxldCBkZXN0aW5hdGlvbiA9IHRoaXMuc2RrLnZpZXdlci5DQU1FUkFfREVGQVVMVF9WSUVXX1JFQ1RBTkdMRS5kZXN0aW5hdGlvblxyXG4gICAgICBsZXQgb3JpZW50YXRpb24gPSB0aGlzLnNkay52aWV3ZXIuQ0FNRVJBX0RFRkFVTFRfVklFV19SRUNUQU5HTEUub3JpZW50YXRpb25cclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUbyh7XHJcbiAgICAgICAgZGVzdGluYXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGRlc3RpbmF0aW9uLmxuZywgZGVzdGluYXRpb24ubGF0LCBkZXN0aW5hdGlvbi5hbHQpLFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiB7XHJcbiAgICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3JpZW50YXRpb24uaGVhZGluZyB8fCAwKSxcclxuICAgICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3JpZW50YXRpb24ucGl0Y2ggfHwgMCksXHJcbiAgICAgICAgICByb2xsOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3JpZW50YXRpb24ucm9sbCB8fCAwKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlIb21lKGR1cmF0aW9uKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIOiuvue9ruaLvuWPluaTjeS9nOWQr+WBnFxyXG4gICAqIEBtZXRob2Qgc2V0UGlja1N0YXR1c1xyXG4gICAqIEBwYXJhbSBbc3RhdHVzPXRydWVdIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqICovXHJcbiAgc2V0UGlja1N0YXR1cyhzdGF0dXMgPSB0cnVlKSB7XHJcbiAgICAvLyBZSi5nZXRFYXJ0aCgpLmludGVyYWN0aW9uLnBpY2tpbmcuZW5hYmxlZCA9IHN0YXR1c1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIOWIm+W7uueCuee8k+WGsuWMuiDov5Tlm57nvJPlhrLljLrlnZDmoIdcclxuICAgKiBAbWV0aG9kIGNyZWF0ZV9wb2ludF9idWZmZXJcclxuICAgKiBAcGFyYW0gcG9pbnQge29iamVjdH0g5Z2Q5qCH5Y+C5pWwXHJcbiAgICogQHBhcmFtIFtyYWRpdXM9NV0ge251bWJlcn0g57yT5Yay6Led56a7ICDvvIjljZXkvY3vvJrnsbPvvIlcclxuICAgKiBAcGFyYW0gb3B0aW9uXHJcbiAgICogQHBhcmFtIHBvaW50LmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gcG9pbnQubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqIEByZXR1cm5zIHtBcnJheX0g6L+U5Zue57yT5Yay5Yy65Z2Q5qCH5pWw57uEXHJcbiAgICovXHJcbiAgY3JlYXRlX3BvaW50X2J1ZmZlcihwb2ludCwgcmFkaXVzID0gNSwgb3B0aW9uID0geyBzdGVwczogMTAgfSkge1xyXG4gICAgbGV0IHAgPSB0dXJmLnBvaW50KFtOdW1iZXIocG9pbnQubG5nKSwgTnVtYmVyKHBvaW50LmxhdCldKVxyXG4gICAgbGV0IGJ1ZmZlcmVkID0gdHVyZi5idWZmZXIocCwgTnVtYmVyKHJhZGl1cykgLyAxMDAwLCBvcHRpb24pXHJcbiAgICByZXR1cm4gYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDliJvlu7rnur/nvJPlhrLljLog6L+U5Zue57yT5Yay5Yy65Z2Q5qCHXHJcbiAgICogQG1ldGhvZCBjcmVhdGVfbGluZV9idWZmZXJcclxuICAgKiBAcGFyYW0gcG9pbnRzIHtBcnJheS48bG5nOlwiXCIsbGF0OlwiXCI+fSDlnZDmoIflj4LmlbBcclxuICAgKiBAcGFyYW0gW3JhZGl1cz01XSB7bnVtYmVyfSDnvJPlhrLot53nprsgIO+8iOWNleS9je+8muexs++8iVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqIEByZXR1cm5zIHtBcnJheX0g6L+U5Zue57yT5Yay5Yy65Z2Q5qCH5pWw57uEXHJcbiAgICogQGV4YW1wbGUgbGV0IHBvaW50cyA9IFt7bG5nOlwiXCIsbGF0OlwiXCJ9LHtsbmc6XCJcIixsYXQ6XCJcIn0se2xuZzpcIlwiLGxhdDpcIlwifV1cclxuICAgKiBsZXQgcmFkaXVzID0gMTBcclxuICAgKiBsZXQgYXJlYV9idWZmZXIgPSBzZGsuY3JlYXRlX2xpbmVfYnVmZmVyKHBvaW50cyxyYWRpdXMpXHJcbiAgICogKi9cclxuICBjcmVhdGVfbGluZV9idWZmZXIocG9pbnRzLCByYWRpdXMgPSA1KSB7XHJcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVfcG9pbnRfYnVmZmVyKHBvaW50c1swXSwgcmFkaXVzKVxyXG4gICAgfSBlbHNlIGlmIChwb2ludHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGFyciA9IFtdXHJcbiAgICAgIHBvaW50cy5mb3JFYWNoKChwb2ludCkgPT4ge1xyXG4gICAgICAgIGFyci5wdXNoKFtOdW1iZXIocG9pbnQubG5nKSwgTnVtYmVyKHBvaW50LmxhdCldKVxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhhcnIpXHJcbiAgICAgIGxldCBidWZmZXJlZCA9IHR1cmYuYnVmZmVyKGxpbmUsIE51bWJlcihyYWRpdXMpIC8gMTAwMClcclxuICAgICAgcmV0dXJuIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24g5Yib5bu66Z2i57yT5Yay5Yy6IOi/lOWbnue8k+WGsuWMuuWdkOagh1xyXG4gICAqIEBtZXRob2QgY3JlYXRlX2FyZWFfYnVmZmVyXHJcbiAgICogQHBhcmFtIHBvaW50cyB7QXJyYXkuPGxuZzpcIlwiLGxhdDpcIlwiPn0g5Z2Q5qCH5Y+C5pWwXHJcbiAgICogQHBhcmFtIFtyYWRpdXM9NV0ge251bWJlcn0g57yT5Yay6Led56a7ICDvvIjljZXkvY3vvJrnsbPvvIlcclxuICAgKiBAbWVtYmVyT2YgVG9vbHNcclxuICAgKiBAcmV0dXJucyB7QXJyYXl9IOi/lOWbnue8k+WGsuWMuuWdkOagh+aVsOe7hFxyXG4gICAqIEBleGFtcGxlIGxldCBwb2ludHMgPSBbe2xuZzpcIlwiLGxhdDpcIlwifSx7bG5nOlwiXCIsbGF0OlwiXCJ9LHtsbmc6XCJcIixsYXQ6XCJcIn1dXHJcbiAgICogbGV0IHJhZGl1cyA9IDEwXHJcbiAgICogbGV0IGFyZWFfYnVmZmVyID0gc2RrLmNyZWF0ZV9hcmVhX2J1ZmZlcihwb2ludHMscmFkaXVzKVxyXG4gICAqICovXHJcbiAgY3JlYXRlX2FyZWFfYnVmZmVyKHBvaW50cywgcmFkaXVzID0gNSkge1xyXG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlX3BvaW50X2J1ZmZlcihwb2ludHNbMF0sIHJhZGl1cylcclxuICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVfbGluZV9idWZmZXIocG9pbnRzLCByYWRpdXMpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgYXJyID0gW11cclxuICAgICAgcG9pbnRzLmZvckVhY2goKHBvaW50KSA9PiB7XHJcbiAgICAgICAgYXJyLnB1c2goW051bWJlcihwb2ludC5sbmcpLCBOdW1iZXIocG9pbnQubGF0KV0pXHJcbiAgICAgIH0pXHJcbiAgICAgIGFyci5wdXNoKGFyclswXSlcclxuICAgICAgbGV0IHBvbHkgPSB0dXJmLnBvbHlnb24oW2Fycl0pXHJcbiAgICAgIGxldCBidWZmZXJlZCA9IHR1cmYuYnVmZmVyKHBvbHksIE51bWJlcihyYWRpdXMpIC8gMTAwMClcclxuICAgICAgcmV0dXJuIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyDorqHnrpflpJrngrnojIPlm7RcclxuICAgKiBAbWV0aG9kIGNhbF9lbnZlbG9wZVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqICovXHJcbiAgY2FsX2VudmVsb3BlKHBvaW50cyA9IFtdKSB7XHJcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgY29uc29sZS5lcnJvcign5Z2Q5qCH5pWw6YeP5LiN6IO95bCR5LqOMuS4qicpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgYXJyID0gW11cclxuICAgICAgcG9pbnRzLmZvckVhY2goKHApID0+IHtcclxuICAgICAgICBhcnIucHVzaCh0dXJmLnBvaW50KFtwLmxuZywgcC5sYXRdKSlcclxuICAgICAgfSlcclxuICAgICAgbGV0IGZlYXR1cmVzID0gdHVyZi5mZWF0dXJlQ29sbGVjdGlvbihhcnIpXHJcbiAgICAgIHJldHVybiB0dXJmLmVudmVsb3BlKGZlYXR1cmVzKS5nZW9tZXRyeS5jb29yZGluYXRlc1swXVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg5oyJ5oyH5a6a6Led56a75YiG5q61XHJcbiAgICogQG1ldGhvZCBjaHVua0xpbmVcclxuICAgKiBAcGFyYW0gcG9zaXRpb25zIHtBcnJheX1cclxuICAgKiBAcGFyYW0gbWV0ZXJzXHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcbiAgICogKi9cclxuICBjaHVua0xpbmUocG9zaXRpb25zID0gW10sIG1ldGVycyA9IDEwMDApIHtcclxuICAgIGlmIChwb3NpdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gW11cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBhcnIgPSBbXVxyXG4gICAgICBwb3NpdGlvbnMuZm9yRWFjaCgoaXQpID0+IHtcclxuICAgICAgICBhcnIucHVzaChbaXQubG5nLCBpdC5sYXRdKVxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhhcnIpXHJcblxyXG4gICAgICBsZXQgY2h1bmsgPSB0dXJmLmxpbmVDaHVuayhsaW5lLCBtZXRlcnMgLyAxMDAwKVxyXG4gICAgICBsZXQgX19tYXAgPSBuZXcgTWFwKClcclxuICAgICAgY2h1bmsuZmVhdHVyZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcclxuICAgICAgICB2YWx1ZS5nZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKCh2YWx1ZTEpID0+IHtcclxuICAgICAgICAgIGxldCBrZXkgPSB2YWx1ZTEuam9pbignLCcpXHJcbiAgICAgICAgICBsZXQgdmFsID0geyBsbmc6IHZhbHVlMVswXSwgbGF0OiB2YWx1ZTFbMV0gfVxyXG4gICAgICAgICAgX19tYXAuc2V0KGtleSwgdmFsKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIHJldHVybiBjaHVuay5mZWF0dXJlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg5qCH5rOo5Lulc2lueOeahOWNiuS4quWRqOacn+eahOW9ouW8j+W8uei3s1xyXG4gICAqICovXHJcbiAgYmlsbGJvYXJkQW5pbWF0aW9uKHZpZXdlciwgeyBpZCwgb2Zmc2V0ID0gMTAsIHRpbWVzID0gMyB9KSB7XHJcbiAgICBsZXQgZW50aXR5ID0gdmlld2VyLmVudGl0aWVzLmdldEJ5SWQoaWQpXHJcbiAgICBpZiAoZW50aXR5KSB7XHJcbiAgICAgIGxldCBwaSA9IE1hdGguUElcclxuICAgICAgbGV0IHR0ID0gNjBcclxuICAgICAgbGV0IG9mID0gcGkgLyB0dFxyXG5cclxuICAgICAgbGV0IGggPSAwXHJcbiAgICAgIGxldCBzcmNfcCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoZW50aXR5LnBvc2l0aW9uLmdldFZhbHVlKCksIHZpZXdlcilcclxuICAgICAgLy8gbGV0IGhlaWdodCA9IHNyY19wLmFsdFxyXG4gICAgICAvLyBlbnRpdHkucG9zaXRpb24gPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoKCkgPT4ge1xyXG4gICAgICAvLyAgIGxldCBoZWlnaHQgPSBvZmZzZXQgKiBNYXRoLnNpbihoKSArIHNyY19wLmFsdFxyXG4gICAgICAvLyAgIGggKz0gb2ZcclxuICAgICAgLy8gICByZXR1cm4gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoc3JjX3AubG5nLCBzcmNfcC5sYXQsIGhlaWdodClcclxuICAgICAgLy8gfSwgZmFsc2UpXHJcbiAgICAgIGxldCB0aSA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICBoICs9IG9mXHJcbiAgICAgICAgbGV0IGhlaWdodCA9IG9mZnNldCAqIE1hdGguc2luKGgpICsgc3JjX3AuYWx0XHJcbiAgICAgICAgaWYgKGggPiBwaSkgaCA9IDBcclxuICAgICAgICBlbnRpdHkucG9zaXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgIHNyY19wLmxuZyxcclxuICAgICAgICAgIHNyY19wLmxhdCxcclxuICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgIClcclxuICAgICAgfSwgMzApXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGkpXHJcbiAgICAgICAgZW50aXR5LnBvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICBzcmNfcC5sbmcsXHJcbiAgICAgICAgICBzcmNfcC5sYXQsXHJcbiAgICAgICAgICBzcmNfcC5hbHRcclxuICAgICAgICApXHJcbiAgICAgIH0sIDMwMDApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipAZGVzYyDnu5jliLbmiYflvaJcclxuICAgKiBAbWV0aG9kIHNlY3RvclxyXG4gICAqIEBtZW1iZXJPZiBUb29scyovXHJcbiAgY2FsU2VjdG9yKFxyXG4gICAgY2VudGVyID0ge30sXHJcbiAgICByYWRpdXMgPSAxMDAsXHJcbiAgICBiZWFyaW5nMSA9IDI1LFxyXG4gICAgYmVhcmluZzIgPSA0NSxcclxuICAgIHN0ZXBzID0gMzYwLFxyXG4gICAgaXM4NCA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBsZXQgYyA9IHR1cmYucG9pbnQoW2NlbnRlci5sbmcsIGNlbnRlci5sYXRdKVxyXG4gICAgbGV0IGNvb3JkaW5hdGVzID0gdHVyZi5zZWN0b3IoYywgcmFkaXVzIC8gMTAwMCwgYmVhcmluZzEsIGJlYXJpbmcyLCB7IHN0ZXBzOiBzdGVwcyB9KVxyXG4gICAgICAuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcclxuICAgIGxldCBwb3NpdGlvbnMgPSBbXVxyXG4gICAgY29vcmRpbmF0ZXMuZm9yRWFjaCgoYXJyYXkpID0+IHtcclxuICAgICAgYXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGxldCBwb3NcclxuICAgICAgICBpZiAoaXM4NCkge1xyXG4gICAgICAgICAgcG9zID0ge1xyXG4gICAgICAgICAgICBsbmc6IGl0ZW1bMF0sXHJcbiAgICAgICAgICAgIGxhdDogaXRlbVsxXSxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBwb3MgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhpdGVtWzBdLCBpdGVtWzFdKVxyXG4gICAgICAgIH1cclxuICAgICAgICBwb3NpdGlvbnMucHVzaChwb3MpXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHBvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Pojrflj5bntKfotLTpq5jluqZcclxuICAgKiBAcGFyYW0gcG9zaXRpb24g5Z2Q5qCHXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0Q2xhbXBUb0hlaWdodChwb3NpdGlvbiwgb2JqZWN0c1RvRXhjbHVkZSA9IFtdKSB7XHJcbiAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIpIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH1cclxuICAgIGxldCBwb3MzID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHBvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0KTtcclxuICAgIGxldCBwb3NpdGlvbjFcclxuICAgIHRyeSB7XHJcbiAgICAgIHBvc2l0aW9uMSA9IGF3YWl0IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jbGFtcFRvSGVpZ2h0KHBvczMsIG9iamVjdHNUb0V4Y2x1ZGUpIHx8IHBvczNcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHBvc2l0aW9uMSA9IHBvczNcclxuICAgIH1cclxuICAgIGxldCBoZWlnaHQxID0gYXdhaXQgdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbjEsIHRoaXMuc2RrLnZpZXdlcikuYWx0XHJcbiAgICBsZXQgaGVpZ2h0MiA9IDBcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLnNkay52aWV3ZXIuc2NlbmUudGVycmFpblByb3ZpZGVyLmF2YWlsYWJpbGl0eSkge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbjIgPSBhd2FpdCBDZXNpdW0uc2FtcGxlVGVycmFpbk1vc3REZXRhaWxlZChcclxuICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS50ZXJyYWluUHJvdmlkZXIsXHJcbiAgICAgICAgICBbQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdCldXHJcbiAgICAgICAgKVxyXG4gICAgICAgIHBvc2l0aW9uMlswXS5oZWlnaHQgJiYgKGhlaWdodDIgPSBwb3NpdGlvbjJbMF0uaGVpZ2h0KVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBoZWlnaHQyID0gMFxyXG4gICAgfVxyXG4gICAgaWYgKGhlaWdodDEgPiBoZWlnaHQyKSB7XHJcbiAgICAgIHJldHVybiBOdW1iZXIoaGVpZ2h0MS50b0ZpeGVkKDIpKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBOdW1iZXIoaGVpZ2h0Mi50b0ZpeGVkKDIpKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg5rex5ou36LSd5a+56LGhXHJcbiAgICogKi9cclxuICBkZWVwQ29weU9iaihvYmopIHtcclxuICAgIGxldCBuZXdvYmogPSBudWxsO1xyXG4gICAgLy8g5aSE55CG5pWw57uEIC0g5L2/55So5Y6f55SfQXJyYXnmnoTpgKDlh73mlbDliJvlu7rmlrDmlbDnu4RcclxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcclxuICAgICAgbmV3b2JqID0gW107XHJcbiAgICAgIC8vIOWPquaLt+i0neaVsOe7hOWFg+e0oO+8jOS4jeaLt+i0neWPr+iDveWtmOWcqOeahOaJqeWxleaWueazlVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG5ld29ialtpXSA9IHRoaXMuZGVlcENvcHlPYmoob2JqW2ldKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3b2JqO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWkhOeQhuWvueixoVxyXG4gICAgZWxzZSBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIG5ld29iaiA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBpIGluIG9iaikge1xyXG4gICAgICAgIC8vIOaOkumZpOaMh+WumuWxnuaAp+WSjOaWueazleWxnuaAp1xyXG4gICAgICAgIGlmIChpICE9PSAnZWFydGgnICYmIGkgIT09ICdEaWFsb2cnICYmIHR5cGVvZiBvYmpbaV0gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgIG5ld29ialtpXSA9IHRoaXMuZGVlcENvcHlPYmoob2JqW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5ld29iajtcclxuICAgIH1cclxuICAgIGVsc2UgbmV3b2JqID0gb2JqO1xyXG4gICAgcmV0dXJuIG5ld29iajtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIOW6puWIhuenkui9rOaNolxyXG4gICAqICovXHJcbiAgcHJvakNvbnZlcnQoc3RhdHVzID0gZmFsc2UsIGNsb3NlQ2FsbEJhY2sgPSAoKSA9PiB7IH0pIHtcclxuICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgcHJvakNvbnZlcnRPcGVuKHRoaXMuc2RrLCBjbG9zZUNhbGxCYWNrKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHByb2pDb252ZXJ0Q2xvc2UoKVxyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBAZGVzYyDmipXlvbHovazmjaJcclxuICAgKiAqL1xyXG4gIHByb2plY3Rpb25Db252ZXJ0KHN0YXR1cyA9IGZhbHNlLCBjbG9zZUNhbGxCYWNrID0gKCkgPT4geyB9KSB7XHJcbiAgICBpZiAoc3RhdHVzKSB7XHJcbiAgICAgIHByb2plY3Rpb25Db252ZXJ0T3Blbih0aGlzLnNkaywgY2xvc2VDYWxsQmFjaylcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBwcm9qZWN0aW9uQ29udmVydENsb3NlKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIOWvvOWHumV4Y2VsXHJcbiAgICovXHJcbiAgLy8g5a+85Ye65bGe5oCnXHJcbiAgZXhwb3J0RXhjZWwoZGF0YSkge1xyXG4gICAgbGV0IGxhYmVsID0gJzxSb3c+J1xyXG4gICAgZm9yIChsZXQga2V5IGluIGRhdGFbMF0pIHtcclxuICAgICAgbGFiZWwgKz0gYDxDZWxsPjxEYXRhIHNzOlR5cGU9XCJTdHJpbmdcIj4ke2tleX08L0RhdGE+PC9DZWxsPmBcclxuICAgIH1cclxuICAgIGxhYmVsICs9ICc8L1Jvdz4nXHJcbiAgICBsZXQgdXJsID0gJ2RhdGE6YXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsO2Jhc2U2NCwnLFxyXG4gICAgICB0bXBsV29ya2Jvb2tYTUwgPSAnPD94bWwgdmVyc2lvbj1cIjEuMFwiPz48P21zby1hcHBsaWNhdGlvbiBwcm9naWQ9XCJFeGNlbC5TaGVldFwiPz48V29ya2Jvb2sgeG1sbnM9XCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpzcHJlYWRzaGVldFwiIHhtbG5zOnNzPVwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6c3ByZWFkc2hlZXRcIj4nXHJcbiAgICAgICAgKyAnPERvY3VtZW50UHJvcGVydGllcyB4bWxucz1cInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZVwiPjxBdXRob3I+QXhlbCBSaWNodGVyPC9BdXRob3I+PENyZWF0ZWQ+e2NyZWF0ZWR9PC9DcmVhdGVkPjwvRG9jdW1lbnRQcm9wZXJ0aWVzPidcclxuICAgICAgICArICc8U3R5bGVzPidcclxuICAgICAgICArICc8U3R5bGUgc3M6SUQ9XCJDdXJyZW5jeVwiPjxOdW1iZXJGb3JtYXQgc3M6Rm9ybWF0PVwiQ3VycmVuY3lcIj48L051bWJlckZvcm1hdD48L1N0eWxlPidcclxuICAgICAgICArICc8U3R5bGUgc3M6SUQ9XCJEYXRlXCI+PE51bWJlckZvcm1hdCBzczpGb3JtYXQ9XCJNZWRpdW0gRGF0ZVwiPjwvTnVtYmVyRm9ybWF0PjwvU3R5bGU+J1xyXG4gICAgICAgICsgJzwvU3R5bGVzPidcclxuICAgICAgICArICd7d29ya3NoZWV0c308L1dvcmtib29rPidcclxuICAgICAgLCB0bXBsV29ya3NoZWV0WE1MID0gJzxXb3Jrc2hlZXQgc3M6TmFtZT1cIntuYW1lV1N9XCI+PFRhYmxlPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjI0MFwiLz57cm93c308L1RhYmxlPjwvV29ya3NoZWV0PidcclxuICAgICAgLCB0bXBsQ2VsbFhNTCA9ICc8Q2VsbD48RGF0YSBzczpUeXBlPVwie25hbWVUeXBlfVwiPntkYXRhfTwvRGF0YT48L0NlbGw+J1xyXG4gICAgICAsIGJhc2U2NCA9IGZ1bmN0aW9uIChzKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzKSkpXHJcbiAgICAgIH1cclxuICAgICAgLCBmb3JtYXQgPSBmdW5jdGlvbiAocywgYykge1xyXG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL3soXFx3Kyl9L2csIGZ1bmN0aW9uIChtLCBwKSB7XHJcbiAgICAgICAgICByZXR1cm4gY1twXTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgbGV0IGN0eCA9IFwiXCI7XHJcbiAgICBsZXQgd29ya2Jvb2tYTUwgPSBcIlwiO1xyXG4gICAgbGV0IHdvcmtzaGVldHNYTUwgPSBcIlwiO1xyXG4gICAgbGV0IHJvd3NYTUwgPSBcIlwiO1xyXG5cclxuICAgIGxldCBwaWwgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChpID09IDApIHtcclxuICAgICAgICByb3dzWE1MICs9IGxhYmVsXHJcbiAgICAgIH1cclxuICAgICAgcm93c1hNTCArPSAnPFJvdz4nO1xyXG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YVtpXSkge1xyXG4gICAgICAgIGN0eCA9IHtcclxuICAgICAgICAgIG5hbWVUeXBlOiAnU3RyaW5nJyxcclxuICAgICAgICAgIGRhdGE6IGRhdGFbaV1ba2V5XVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcm93c1hNTCArPSBmb3JtYXQodG1wbENlbGxYTUwsIGN0eCk7XHJcbiAgICAgIH1cclxuICAgICAgcm93c1hNTCArPSAnPC9Sb3c+JztcclxuICAgICAgaWYgKGkgPiAwICYmIChpIC8gNjAwMDApICUgMSA9PT0gMCkge1xyXG4gICAgICAgIHBpbCsrO1xyXG4gICAgICAgIGN0eCA9IHsgcm93czogcm93c1hNTCwgbmFtZVdTOiAnU2hlZXQnICsgaSB9O1xyXG4gICAgICAgIHdvcmtzaGVldHNYTUwgKz0gZm9ybWF0KHRtcGxXb3Jrc2hlZXRYTUwsIGN0eCk7XHJcbiAgICAgICAgcm93c1hNTCA9IFwiXCI7XHJcbiAgICAgICAgcm93c1hNTCArPSBsYWJlbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjdHggPSB7IHJvd3M6IHJvd3NYTUwsIG5hbWVXUzogJ1NoZWV0JyB9O1xyXG4gICAgd29ya3NoZWV0c1hNTCArPSBmb3JtYXQodG1wbFdvcmtzaGVldFhNTCwgY3R4KTtcclxuICAgIHJvd3NYTUwgPSBcIlwiO1xyXG4gICAgY3R4ID0geyBjcmVhdGVkOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpLCB3b3Jrc2hlZXRzOiB3b3Jrc2hlZXRzWE1MIH07XHJcbiAgICB3b3JrYm9va1hNTCA9IGZvcm1hdCh0bXBsV29ya2Jvb2tYTUwsIGN0eCk7XHJcbiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJBXCIpO1xyXG4gICAgbGluay5ocmVmID0gdXJsICsgYmFzZTY0KHdvcmtib29rWE1MKTtcclxuICAgIGxpbmsuZG93bmxvYWQgPSBcIuefoumHj+aVsOaNruWvvOWHui54bHNcIlxyXG4gICAgbGluay50YXJnZXQgPSAnX2JsYW5rJztcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2MgR3ppcOino+WOi1xyXG4gICAqL1xyXG4gIGRlY29tcHJlc3NHemlwKGNvbXByZXNzZWREYXRhKSB7XHJcbiAgICBsZXQgZGVjb21wcmVzc2VkRGF0YSA9IHBha28uaW5mbGF0ZShjb21wcmVzc2VkRGF0YSk7XHJcbiAgICAvLyDlsIbop6PljovnvKnlkI7nmoTmlbDmja7ovazmjaLkuLrlrZfnrKbkuLJcclxuICAgIGxldCBkZWNvbXByZXNzZWRTdHJpbmcgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGVjb21wcmVzc2VkRGF0YSk7XHJcbiAgICByZXR1cm4gZGVjb21wcmVzc2VkU3RyaW5nXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyBjbXlr6L2scmJnXHJcbiAgICogQHBhcmFtIHsqfSBjb2xvclxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgY215a1RvUmdiKGNvbG9yKSB7XHJcbiAgICBsZXQgeyBjLCBtLCB5LCBrIH0gPSBjb2xvclxyXG4gICAgbGV0IHJnYiA9IHsgcjogMCwgZzogMCwgYjogMCB9O1xyXG4gICAgcmdiLmMgPSBjIC8gMTAwO1xyXG4gICAgcmdiLm0gPSBtIC8gMTAwO1xyXG4gICAgcmdiLnkgPSB5IC8gMTAwO1xyXG4gICAgcmdiLmsgPSBrIC8gMTAwO1xyXG4gICAgcmdiLnIgPSAxIC0gTWF0aC5taW4oMSwgcmdiLmMgKiAoMSAtIHJnYi5rKSArIHJnYi5rKTtcclxuICAgIHJnYi5nID0gMSAtIE1hdGgubWluKDEsIHJnYi5tICogKDEgLSByZ2IuaykgKyByZ2Iuayk7XHJcbiAgICByZ2IuYiA9IDEgLSBNYXRoLm1pbigxLCByZ2IueSAqICgxIC0gcmdiLmspICsgcmdiLmspO1xyXG4gICAgcmdiLnIgPSBNYXRoLnJvdW5kKHJnYi5yICogMjU1KTtcclxuICAgIHJnYi5nID0gTWF0aC5yb3VuZChyZ2IuZyAqIDI1NSlcclxuICAgIHJnYi5iID0gTWF0aC5yb3VuZChyZ2IuYiAqIDI1NSk7XHJcbiAgICByZXR1cm4gYHJnYigke3JnYi5yfSwgJHtyZ2IuZ30sICR7cmdiLmJ9KWA7XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0UHhUb1JlbShzZGssIHNlbGVjdG9yKSB7XHJcbiAgICBjb25zdCBodG1sRm9udFNpemUgPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5mb250U2l6ZSk7XHJcbiAgICBsZXQgbGlzdCA9IFtdXHJcbiAgICBsZXQgZWxlbWVudExpc3QgPSBbXVxyXG4gICAgaWYgKHNlbGVjdG9yKSB7XHJcbiAgICAgIGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZGsuZGl2X2lkKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBlbGVtZW50TGlzdC5wdXNoKGxpc3RbaV0sIC4uLmxpc3RbaV0ucXVlcnlTZWxlY3RvckFsbCgnKicpKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZWxlbWVudExpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZGsuZGl2X2lkKS5xdWVyeVNlbGVjdG9yQWxsKCcqJyk7XHJcbiAgICB9XHJcbiAgICBlbGVtZW50TGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBjb25zdCBzdHlsZSA9IGVsZW1lbnQuc3R5bGU7XHJcbiAgICAgIGNvbnN0IHJ1bGVzID0gQXJyYXkuZnJvbShzdHlsZSkuZmlsdGVyKHByb3AgPT4ge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycgJiYgcHJvcC5lbmRzV2l0aCgncHgnKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBydWxlcy5mb3JFYWNoKHByb3AgPT4ge1xyXG4gICAgICAgIGNvbnN0IHB4VmFsdWUgPSBwYXJzZUZsb2F0KHN0eWxlW3Byb3BdKTtcclxuICAgICAgICBjb25zdCByZW1WYWx1ZSA9IHB4VmFsdWUgLyBodG1sRm9udFNpemU7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IGAke3JlbVZhbHVlfXJlbWA7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc0NvbnZleChhcnIgPSBbXSkge1xyXG4gICAgY29uc3QgeyBsZW5ndGggfSA9IGFyclxyXG4gICAgbGV0IHByZSA9IDAsXHJcbiAgICAgIGN1cnIgPSAwXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGxldCBkeDEgPSBhcnJbKGkgKyAxKSAlIGxlbmd0aF0ubG5nIC0gYXJyW2ldLmxuZ1xyXG4gICAgICBsZXQgZHgyID0gYXJyWyhpICsgMikgJSBsZW5ndGhdLmxuZyAtIGFyclsoaSArIDEpICUgbGVuZ3RoXS5sbmdcclxuICAgICAgbGV0IGR5MSA9IGFyclsoaSArIDEpICUgbGVuZ3RoXS5sYXQgLSBhcnJbaV0ubGF0XHJcbiAgICAgIGxldCBkeTIgPSBhcnJbKGkgKyAyKSAlIGxlbmd0aF0ubGF0IC0gYXJyWyhpICsgMSkgJSBsZW5ndGhdLmxhdFxyXG4gICAgICBjdXJyID0gZHgxICogZHkyIC0gZHgyICogZHkxXHJcbiAgICAgIGlmIChjdXJyICE9IDApIHtcclxuICAgICAgICBpZiAoKGN1cnIgPiAwICYmIHByZSA8IDApIHx8IChjdXJyIDwgMCAmJiBwcmUgPiAwKSkgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgZWxzZSBwcmUgPSBjdXJyXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICBnZXREYXRlVGltZVN0cmluZygpIHtcclxuICAgIC8vIOWIm+W7uuS4gOS4quihqOekuuW9k+WJjeaXtumXtOeahCBEYXRlIOWvueixoVxyXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIC8vIOiOt+WPluW5tOS7vVxyXG4gICAgY29uc3QgeWVhciA9IG5vdy5nZXRGdWxsWWVhcigpO1xyXG4gICAgLy8g6I635Y+W5pyI5Lu977yI5LuOIDAg5byA5aeL77yM5omA5Lul6KaB5YqgIDHvvInvvIzlubblsIblhbbovazmjaLkuLrkuKTkvY3lrZfnrKbkuLLvvIzkuI3otrPkuKTkvY3lnKjliY3pnaLooaXpm7ZcclxuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKG5vdy5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIC8vIOiOt+WPluaXpeacn++8jOW5tuWwhuWFtui9rOaNouS4uuS4pOS9jeWtl+espuS4su+8jOS4jei2s+S4pOS9jeWcqOWJjemdouihpembtlxyXG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKG5vdy5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAvLyDojrflj5blsI/ml7bvvIzlubblsIblhbbovazmjaLkuLrkuKTkvY3lrZfnrKbkuLLvvIzkuI3otrPkuKTkvY3lnKjliY3pnaLooaXpm7ZcclxuICAgIGNvbnN0IGhvdXJzID0gU3RyaW5nKG5vdy5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgLy8g6I635Y+W5YiG6ZKf77yM5bm25bCG5YW26L2s5o2i5Li65Lik5L2N5a2X56ym5Liy77yM5LiN6Laz5Lik5L2N5Zyo5YmN6Z2i6KGl6Zu2XHJcbiAgICBjb25zdCBtaW51dGVzID0gU3RyaW5nKG5vdy5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAvLyDojrflj5bnp5LvvIzlubblsIblhbbovazmjaLkuLrkuKTkvY3lrZfnrKbkuLLvvIzkuI3otrPkuKTkvY3lnKjliY3pnaLooaXpm7ZcclxuICAgIGNvbnN0IHNlY29uZHMgPSBTdHJpbmcobm93LmdldFNlY29uZHMoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIC8vIOiOt+WPluavq+enku+8jOW5tuWwhuWFtui9rOaNouS4uuS4ieS9jeWtl+espuS4su+8jOS4jei2s+S4ieS9jeWcqOWJjemdouihpembtlxyXG4gICAgY29uc3QgbWlsbGlzZWNvbmRzID0gU3RyaW5nKG5vdy5nZXRNaWxsaXNlY29uZHMoKSkucGFkU3RhcnQoMywgJzAnKTtcclxuICAgIC8vIOWwhuW5tOOAgeaciOOAgeaXpeOAgeaXtuOAgeWIhuOAgeenkuOAgeavq+enkuaLvOaOpeaIkOaJgOmcgOeahOWtl+espuS4slxyXG4gICAgcmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9JHttaWxsaXNlY29uZHN9YDtcclxuICB9XHJcblxyXG4gIHJlcGxhY2VIb3N0KHVybCwgaG9zdCkge1xyXG4gICAgbGV0IG5ld1VybCA9IHVybFxyXG4gICAgaWYgKCF1cmwgfHwgIWhvc3QpIHtcclxuICAgICAgcmV0dXJuIHVybFxyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKCF1cmwuc3RhcnRzV2l0aChcImh0dHBcIikpIHtcclxuICAgICAgICAvL+ivtOaYjuaYr+acrOWcsOeahGpzb27vvIzlnKjno4Hnm5jkuK3lrZjlnKjnmoRcclxuICAgICAgICBpZiAoIXVybC5pbmNsdWRlcyhcIjpcIikpIHtcclxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaG9zdCkge1xyXG4gICAgICAgICAgICBsZXQgbyA9IG5ldyBVUkwodXJsLCB0aGlzLm9wdGlvbnMuaG9zdClcclxuICAgICAgICAgICAgbmV3VXJsID0gby5ocmVmXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXdVcmxcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyDnp7vpmaTlj6/og73nmoTnlKjmiLflkI065a+G56CB5YmN57yAXHJcbiAgICAgICAgY29uc3QgYXV0aFJlZ2V4ID0gL15bXkBdK0AvO1xyXG4gICAgICAgIGlmIChhdXRoUmVnZXgudGVzdCh1cmwpKSB7XHJcbiAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZShhdXRoUmVnZXgsICcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOa3u+WKoOWNj+iuruWJjee8gO+8iOWmguaenOayoeacie+8iVxyXG4gICAgICAgIGlmICghL15bYS16XSs6XFwvXFwvL2kudGVzdCh1cmwpKSB7XHJcbiAgICAgICAgICB1cmwgPSAnaHR0cDovLycgKyB1cmw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHVybCk7XHJcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsMiA9IG5ldyBVUkwoaG9zdCk7XHJcbiAgICAgICAgbGV0IGhvc3RuYW1lID0gcGFyc2VkVXJsLmhvc3RuYW1lO1xyXG4gICAgICAgIGxldCBwb3J0ID0gcGFyc2VkVXJsLnBvcnQ7XHJcblxyXG4gICAgICAgIC8vIOWkhOeQhklQdjblnLDlnYDvvIjlpoLmnpzmnInmi6zlj7fvvIlcclxuICAgICAgICBpZiAoaG9zdG5hbWUuc3RhcnRzV2l0aCgnWycpICYmIGhvc3RuYW1lLmVuZHNXaXRoKCddJykpIHtcclxuICAgICAgICAgIGhvc3RuYW1lID0gaG9zdG5hbWUuc2xpY2UoMSwgLTEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKGhvc3RuYW1lID09PSAnbG9jYWxob3N0JyB8fCBob3N0bmFtZSA9PT0gJzEyNy4wLjAuMScpICYmIHBhcnNlSW50KHBvcnQsIDEwKSAhPT0gNTUxMTApIHtcclxuICAgICAgICAgIHBhcnNlZFVybC5wb3J0ID0gcGFyc2VkVXJsMi5wb3J0XHJcbiAgICAgICAgICBwYXJzZWRVcmwucHJvdG9jb2wgPSBwYXJzZWRVcmwyLnByb3RvY29sXHJcbiAgICAgICAgICBuZXdVcmwgPSBwYXJzZWRVcmwudG9TdHJpbmcoKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3VXJsXHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBuZXdVcmxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1lc3NhZ2Uob3B0aW9uID0ge30pIHtcclxuICAgIGxldCB0eXBlID0gb3B0aW9uLnR5cGUgfHwgJ3N1Y2Nlc3MnXHJcbiAgICBsZXQgdGV4dCA9IG9wdGlvbi50ZXh0IHx8ICcnXHJcbiAgICBsZXQgZHVyYXRpb24gPSBvcHRpb24uZHVyYXRpb24gfHwgMTUwMFxyXG5cclxuICAgIGxldCBtZXNzYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1lKLWN1c3RvbS1tZXNzYWdlJyk7XHJcbiAgICBpZiAobWVzc2FnZSkge1xyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG1lc3NhZ2UpXHJcbiAgICB9XHJcbiAgICBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgIG1lc3NhZ2UuaWQgPSAnWUotY3VzdG9tLW1lc3NhZ2UnXHJcbiAgICBpZiAodHlwZSA9PSAnc3VjY2VzcycpIHtcclxuICAgICAgbWVzc2FnZS5pbm5lckhUTUwgPSBgXHJcbiAgICAgIDxpPjw/eG1sIHZlcnNpb249XCIxLjBcIiBzdGFuZGFsb25lPVwibm9cIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgXCItLy9XM0MvL0RURCBTVkcgMS4xLy9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkXCI+PHN2ZyB0PVwiMTc1NTkyOTk2MTI4MlwiIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwLWlkPVwiNTA2NFwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPjxwYXRoIGQ9XCJNODc0LjExOTYxOCAxNDkuODU5OTIyQTUxMC44MTY0NjEgNTEwLjgxNjQ2MSAwIDAgMCA1MTEuOTk3IDAuMDAyMDhhNTA5LjkxMDQ2MiA1MDkuOTEwNDYyIDAgMCAwLTM2Mi4xMTk2MTggMTQ5Ljg1Nzg0MmMtMTk5LjgxNzc4OSAxOTkuNjc5Nzg5LTE5OS44MTc3ODkgNTI0LjU4MTQ0NyAwIDcyNC4yNjAyMzZhNTA5Ljk2OTQ2MiA1MDkuOTY5NDYyIDAgMCAwIDM2Mi4xMTk2MTggMTQ5Ljg1Nzg0MkE1MDguODcyNDYzIDUwOC44NzI0NjMgMCAwIDAgODc0LjExOTYxOCA4NzQuMTIwMTU4YzE5OS44MzY3ODktMTk5LjY3OTc4OSAxOTkuODM2Nzg5LTUyNC41ODE0NDcgMC03MjQuMjYwMjM2ek04MTQuOTQyNjggMzc4LjIxMDY4MUw0NzAuOTk5MDQzIDc0NC4xMzIyOTVhMTUuMzU5OTg0IDE1LjM1OTk4NCAwIDAgMS01Ljg4Nzk5NCA0LjA5NTk5NmMtMS43NTE5OTggMS4xODA5OTktMi45MTM5OTcgMi4zNjI5OTgtNS4yNzY5OTQgMi45MTM5OTdhMzQuNDk5OTY0IDM0LjQ5OTk2NCAwIDAgMS0xMy40Njk5ODYgMi45MTQ5OTcgNDUuNTQ3OTUyIDQ1LjU0Nzk1MiAwIDAgMS0xMi44OTc5ODYtMi4zMDM5OThsLTQuMDk1OTk2LTIuMzYzOTk3YTQ1LjI5MTk1MiA0NS4yOTE5NTIgMCAwIDEtNy4wMDk5OTItNC4wOTU5OTZsLTE5Ni45MDI3OTMtMTkzLjc4OTc5NmEzNC4xMjY5NjQgMzQuMTI2OTY0IDAgMCAxLTEwLjU1NTk4OS0yNS4xODY5NzNjMC05LjM3Mzk5IDMuNTgzOTk2LTE4Ljc0Njk4IDkuOTgzOTktMjUuMTg2OTc0YTM2LjQyOTk2MiAzNi40Mjk5NjIgMCAwIDEgNTAuMzcyOTQ3IDBsMTY5Ljk4MzgyIDE2Ny40MjM4MjRMNzYzLjM4OTczNSAzMzAuMjIwNzMyYTM3LjA1OTk2MSAzNy4wNTk5NjEgMCAwIDEgNTAuMzcxOTQ3LTEuNzMyOTk4IDMzLjY0Nzk2NSAzMy42NDc5NjUgMCAwIDEgMTEuMTY1OTg4IDI1LjE4Njk3MyAzNS41NDQ5NjMgMzUuNTQ0OTYzIDAgMCAxLTkuOTgzOTkgMjQuNTc1OTc0di0wLjA0eiBtMCAwXCIgZmlsbD1cIiM1MkM0MUFcIiBwLWlkPVwiNTA2NVwiPjwvcGF0aD48L3N2Zz48L2k+JHt0ZXh0fVxyXG4gICAgYFxyXG4gICAgfSBlbHNlIGlmICh0eXBlID09ICd3YXJuaW5nJykge1xyXG4gICAgICBtZXNzYWdlLmlubmVySFRNTCA9IGBcclxuICAgICAgPGk+PD94bWwgdmVyc2lvbj1cIjEuMFwiIHN0YW5kYWxvbmU9XCJub1wiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyBcIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGRcIj48c3ZnIHQ9XCIxNzU2MDkzNTk5MjU4XCIgY2xhc3M9XCJpY29uXCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHAtaWQ9XCIxNjQ4XCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZD1cIk01MTIuMDAyNTU4IDY0LjI0NTIxYy0yNDcuMjkyMTc2IDAtNDQ3Ljc1Nzg2IDIwMC40NjQ2NjEtNDQ3Ljc1Nzg2IDQ0Ny43NTY4MzcgMCAyNDcuMjg3MDU5IDIwMC40NjQ2NjEgNDQ3Ljc1Mjc0NCA0NDcuNzU3ODYgNDQ3Ljc1Mjc0NCAyNDcuMjg2MDM2IDAgNDQ3Ljc1MTcyLTIwMC40NjQ2NjEgNDQ3Ljc1MTcyLTQ0Ny43NTI3NDRDOTU5Ljc1NDI3OSAyNjQuNzEwODk0IDc1OS4yODg1OTQgNjQuMjQ1MjEgNTEyLjAwMjU1OCA2NC4yNDUyMXpNNTEyLjAxMDc0NSA3MzUuODc1ODZjLTIwLjYwMjIyNCAwLTM3LjMxOTk3Ny0xNi43MTg3NzctMzcuMzE5OTc3LTM3LjMyMzA0NyAwLTIwLjU5NzEwNyAxNi43MTc3NTMtMzcuMzE5OTc3IDM3LjMxOTk3Ny0zNy4zMTk5NzcgMjAuNjA0MjcgMCAzNy4yOTc0NjQgMTYuNzIyODcgMzcuMjk3NDY0IDM3LjMxOTk3N0M1NDkuMzA4MjA5IDcxOS4xNTgxMDcgNTMyLjYxMzk5MiA3MzUuODc1ODYgNTEyLjAxMDc0NSA3MzUuODc1ODZ6TTU0OS4zMDgyMDkgNTY3Ljk2OTczM2MwIDIwLjYwMDE3Ny0xNi42OTMxOTQgMzcuMjkzMzcxLTM3LjI5NzQ2NCAzNy4yOTMzNzEtMjAuNjAyMjI0IDAtMzcuMzE5OTc3LTE2LjY5MzE5NC0zNy4zMTk5NzctMzcuMjkzMzcxTDQ3NC42OTA3NjggMzI1LjQyMDU4MWMwLTIwLjYwNTI5NCAxNi43MTc3NTMtMzcuMjk3NDY0IDM3LjMxOTk3Ny0zNy4yOTc0NjQgMjAuNjA0MjcgMCAzNy4yOTc0NjQgMTYuNjkzMTk0IDM3LjI5NzQ2NCAzNy4yOTc0NjRMNTQ5LjMwODIwOSA1NjcuOTY5NzMzelwiIGZpbGw9XCIjZTk4ZjM2XCIgcC1pZD1cIjE2NDlcIj48L3BhdGg+PC9zdmc+PC9pPiR7dGV4dH1cclxuICAgIGBcclxuICAgIH1cclxuXHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lc3NhZ2UpXHJcbiAgICBtZXNzYWdlLmNsYXNzTGlzdC5hZGQodHlwZSlcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUb29sc1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFBQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFBQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFBQTtBQUFBO0FBV0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQW9CQTtBQUFBO0FBakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQWhFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUpBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUFBO0FBQUE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBQUE7QUFBQTtBQVlBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQUFBO0FBQUE7QUFjQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQUFBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBQUE7QUFBQTtBQVdBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQUFBO0FBQUE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQUFBO0FBQUE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFBQTtBQUFBO0FBT0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBVUE7QUFOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUhBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQTlCQTtBQUFBO0FBQUE7QUFBQTtBQWdDQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQUE7QUFBQTtBQU1BO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFsOUNBO0FBQ0E7QUFBQTtBQUFBO0FBcTlDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Tools/index.js\n"); /***/ }), diff --git a/src/renderer/public/sdk/custom/css/index.css b/src/renderer/public/sdk/custom/css/index.css index eb6306e..cc237ac 100644 --- a/src/renderer/public/sdk/custom/css/index.css +++ b/src/renderer/public/sdk/custom/css/index.css @@ -2212,6 +2212,34 @@ .YJ-custom-base-dialog.cut-fill>.content>div .div-item:last-child .row .unit { margin-left: 5px; } +.YJ-custom-base-dialog.cut-fill>.content>div .el-slider__button { + width: 16px; + height: 16px; + border: 2px solid rgba(var(--color-sdk-base-rgb), 1); +} +.YJ-custom-base-dialog.cut-fill>.content>div .el-slider__bar { + background-color: rgba(var(--color-sdk-base-rgb), 1); +} +.YJ-custom-base-dialog.cut-fill>.content>div .firstTip { + font-size: 14px; + font-weight: 700; + letter-spacing: 0px; + line-height: 0px; + color: rgba(255, 255, 255, 1); + position: absolute; + top: 157px; + left: 340px; +} +.YJ-custom-base-dialog.cut-fill>.content>div .endTip { + font-size: 14px; + font-weight: 700; + letter-spacing: 0px; + line-height: 0px; + color: rgba(255, 255, 255, 1); + position: absolute; + top: 157px; + left: 515px; +} /* 淹没分析 */ .YJ-custom-base-dialog.submerge>.content>div .row>.col { @@ -2415,6 +2443,41 @@ .YJ-custom-base-dialog.circle-view-shed>.content { width: 290px; } +.YJ-custom-base-dialog.circle-view-shed>.content>div .el-slider__button { + width: 16px; + height: 16px; + border: 2px solid rgba(var(--color-sdk-base-rgb), 1); +} + +.YJ-custom-base-dialog.circle-view-shed>.content>div .el-slider__bar { + background-color: rgba(var(--color-sdk-base-rgb), 1); +} + +.YJ-custom-base-dialog.circle-view-shed>.content>div .firstTip { + font-size: 14px; + font-weight: 700; + letter-spacing: 0px; + line-height: 0px; + color: rgba(255, 255, 255, 1); + position: absolute; + top: 150px; + left: 88px; +} + +.YJ-custom-base-dialog.circle-view-shed>.content>div .endTip { + font-size: 14px; + font-weight: 700; + letter-spacing: 0px; + line-height: 0px; + color: rgba(255, 255, 255, 1); + position: absolute; + top: 150px; + left: 240px; +} +.el-popper.is-dark { + z-index: 100000000 !important; + /* 确保这个值足够高 */ +} /* 地形可视域分析 */ .YJ-custom-base-dialog.visibility>.content { diff --git a/src/renderer/src/I18n/zh-CN.ts b/src/renderer/src/I18n/zh-CN.ts index 92aeb01..da8f44c 100644 --- a/src/renderer/src/I18n/zh-CN.ts +++ b/src/renderer/src/I18n/zh-CN.ts @@ -64,6 +64,71 @@ export default { ersanwei: '二三维', junbiao3d: '三维军标' }, + effect: { + trajectoryMotion:"轨迹运动", + electronicFence: "电子围墙", + // nightVision: '实体墙', + radarLightWave: "扩散光波", + diffusedLightWave: "雷达光波", + scanStereoscopic: "立体雷达", + multilateralBody: "多边体", + waterSurface: "水面", + fountain: '喷泉', + waterL: '水柱', + fire: "火焰", + explosion: "爆炸", + smoke: "烟雾", + nightVision: '夜视', + // nightVision: '飞线', + }, + analysis:{ + inundationAnalysis: "淹没分析", + profileAnalysis: "剖面分析", + sightAnalysis: "视线分析", + kenAnalysis: "视域分析", + circleKen: "圆形视域", + slopeDirection: "坡度坡向", + cutFill: "土方分析", + globalContour: "全局等高线", + contour: "等高线", + clear: "清除", + }, + measure:{ + projectionArea: "投影面积", + projectionDistanceMeasure: '投影距离', + areaMeasure: "贴地面积", + distanceMeasure: "贴地距离", + heightMeasure: "垂直高度", + triangleMeasure: "空间三角", + MeasureAzimuth: '方位角', + MeasureAngle: "夹角", + lopeDistanceMeasures: '坡度', + coorMeasure: "坐标", + clear: "清除测量", + + }, + tool:{ + routePlan: "路径规划", + //清除轨迹 + graffiti: "涂鸦", + // stopGraffiti: "结束涂鸦", + clearGraffiti: "清除涂鸦", + path: "飞行漫游", + coorLocation: "坐标定位", + mouseLocation: "鼠标定位", + annotationAggregation: "标注点聚合", + // 卷帘对比 + // 屏幕截图 + // 高清出图 + // 视频录制 + pressModel: "模型压平", + terrainDig: "地形开挖", + tilesetClipping: "剖切", + clearTilesetClipping: "清除剖切", + projConvert: '度分秒', + projectionConvert: '投影转换', + gdbImport: "gdb导入" + }, bottomMenu: { groundText: '贴地文字', standText: '立体文字', diff --git a/src/renderer/src/api/login/index.ts b/src/renderer/src/api/login/index.ts index d755988..869cba3 100644 --- a/src/renderer/src/api/login/index.ts +++ b/src/renderer/src/api/login/index.ts @@ -7,5 +7,11 @@ export const LoginApi = { url: `/user/login`, data }) + }, + logout: async () => { + return await request.post({ + url: `/user/logout`, + + }) } } diff --git a/src/renderer/src/api/tree/index.ts b/src/renderer/src/api/tree/index.ts index a34f0b6..4323f53 100644 --- a/src/renderer/src/api/tree/index.ts +++ b/src/renderer/src/api/tree/index.ts @@ -7,6 +7,14 @@ export const TreeApi = { url: `/source/list` }) }, + // 新增其他资源 /source/addOtherSource + addOtherSource: async (data: any) => { + return await request.post({ + url: `/source/addOtherSource`, + data + }) + }, + //新增节点 addDirectory: async (data: any) => { return await request.post({ diff --git a/src/renderer/src/assets/images/second/MeasureAngle.png b/src/renderer/src/assets/images/second/MeasureAngle.png new file mode 100644 index 0000000..b86b3d6 Binary files /dev/null and b/src/renderer/src/assets/images/second/MeasureAngle.png differ diff --git a/src/renderer/src/assets/images/second/MeasureAzimuth.png b/src/renderer/src/assets/images/second/MeasureAzimuth.png new file mode 100644 index 0000000..3c448e0 Binary files /dev/null and b/src/renderer/src/assets/images/second/MeasureAzimuth.png differ diff --git a/src/renderer/src/assets/images/second/annotationAggregation.png b/src/renderer/src/assets/images/second/annotationAggregation.png new file mode 100644 index 0000000..bc50b3d Binary files /dev/null and b/src/renderer/src/assets/images/second/annotationAggregation.png differ diff --git a/src/renderer/src/assets/images/second/areaMeasure.png b/src/renderer/src/assets/images/second/areaMeasure.png new file mode 100644 index 0000000..f366102 Binary files /dev/null and b/src/renderer/src/assets/images/second/areaMeasure.png differ diff --git a/src/renderer/src/assets/images/second/circleKen.png b/src/renderer/src/assets/images/second/circleKen.png new file mode 100644 index 0000000..eff46be Binary files /dev/null and b/src/renderer/src/assets/images/second/circleKen.png differ diff --git a/src/renderer/src/assets/images/second/clear.png b/src/renderer/src/assets/images/second/clear.png new file mode 100644 index 0000000..8a08304 Binary files /dev/null and b/src/renderer/src/assets/images/second/clear.png differ diff --git a/src/renderer/src/assets/images/second/clearGraffiti.png b/src/renderer/src/assets/images/second/clearGraffiti.png new file mode 100644 index 0000000..e3f19e6 Binary files /dev/null and b/src/renderer/src/assets/images/second/clearGraffiti.png differ diff --git a/src/renderer/src/assets/images/second/clearTilesetClipping.png b/src/renderer/src/assets/images/second/clearTilesetClipping.png new file mode 100644 index 0000000..23ba88b Binary files /dev/null and b/src/renderer/src/assets/images/second/clearTilesetClipping.png differ diff --git a/src/renderer/src/assets/images/second/contour.png b/src/renderer/src/assets/images/second/contour.png new file mode 100644 index 0000000..b4698b1 Binary files /dev/null and b/src/renderer/src/assets/images/second/contour.png differ diff --git a/src/renderer/src/assets/images/second/coorLocation.png b/src/renderer/src/assets/images/second/coorLocation.png new file mode 100644 index 0000000..912d4f9 Binary files /dev/null and b/src/renderer/src/assets/images/second/coorLocation.png differ diff --git a/src/renderer/src/assets/images/second/coorMeasure.png b/src/renderer/src/assets/images/second/coorMeasure.png new file mode 100644 index 0000000..89c0be5 Binary files /dev/null and b/src/renderer/src/assets/images/second/coorMeasure.png differ diff --git a/src/renderer/src/assets/images/second/cutFill.png b/src/renderer/src/assets/images/second/cutFill.png new file mode 100644 index 0000000..2892b1b Binary files /dev/null and b/src/renderer/src/assets/images/second/cutFill.png differ diff --git a/src/renderer/src/assets/images/second/diffusedLightWave.png b/src/renderer/src/assets/images/second/diffusedLightWave.png new file mode 100644 index 0000000..d6ae12a Binary files /dev/null and b/src/renderer/src/assets/images/second/diffusedLightWave.png differ diff --git a/src/renderer/src/assets/images/second/distanceMeasure.png b/src/renderer/src/assets/images/second/distanceMeasure.png new file mode 100644 index 0000000..a4667cd Binary files /dev/null and b/src/renderer/src/assets/images/second/distanceMeasure.png differ diff --git a/src/renderer/src/assets/images/second/electronicFence.png b/src/renderer/src/assets/images/second/electronicFence.png new file mode 100644 index 0000000..849c9f5 Binary files /dev/null and b/src/renderer/src/assets/images/second/electronicFence.png differ diff --git a/src/renderer/src/assets/images/second/explosion.png b/src/renderer/src/assets/images/second/explosion.png new file mode 100644 index 0000000..c652b27 Binary files /dev/null and b/src/renderer/src/assets/images/second/explosion.png differ diff --git a/src/renderer/src/assets/images/second/fire.png b/src/renderer/src/assets/images/second/fire.png new file mode 100644 index 0000000..eba310e Binary files /dev/null and b/src/renderer/src/assets/images/second/fire.png differ diff --git a/src/renderer/src/assets/images/second/fountain.png b/src/renderer/src/assets/images/second/fountain.png new file mode 100644 index 0000000..f29c3ad Binary files /dev/null and b/src/renderer/src/assets/images/second/fountain.png differ diff --git a/src/renderer/src/assets/images/second/gdbImport.png b/src/renderer/src/assets/images/second/gdbImport.png new file mode 100644 index 0000000..0dc41ac Binary files /dev/null and b/src/renderer/src/assets/images/second/gdbImport.png differ diff --git a/src/renderer/src/assets/images/second/globalContour.png b/src/renderer/src/assets/images/second/globalContour.png new file mode 100644 index 0000000..0149a17 Binary files /dev/null and b/src/renderer/src/assets/images/second/globalContour.png differ diff --git a/src/renderer/src/assets/images/second/graffiti.png b/src/renderer/src/assets/images/second/graffiti.png new file mode 100644 index 0000000..3d95ff4 Binary files /dev/null and b/src/renderer/src/assets/images/second/graffiti.png differ diff --git a/src/renderer/src/assets/images/second/heightMeasure.png b/src/renderer/src/assets/images/second/heightMeasure.png new file mode 100644 index 0000000..7f07e38 Binary files /dev/null and b/src/renderer/src/assets/images/second/heightMeasure.png differ diff --git a/src/renderer/src/assets/images/second/inundationAnalysis.png b/src/renderer/src/assets/images/second/inundationAnalysis.png new file mode 100644 index 0000000..98fe389 Binary files /dev/null and b/src/renderer/src/assets/images/second/inundationAnalysis.png differ diff --git a/src/renderer/src/assets/images/second/kenAnalysis.png b/src/renderer/src/assets/images/second/kenAnalysis.png new file mode 100644 index 0000000..0497a6e Binary files /dev/null and b/src/renderer/src/assets/images/second/kenAnalysis.png differ diff --git a/src/renderer/src/assets/images/second/lopeDistanceMeasures.png b/src/renderer/src/assets/images/second/lopeDistanceMeasures.png new file mode 100644 index 0000000..c19f0ea Binary files /dev/null and b/src/renderer/src/assets/images/second/lopeDistanceMeasures.png differ diff --git a/src/renderer/src/assets/images/second/mouseLocation.png b/src/renderer/src/assets/images/second/mouseLocation.png new file mode 100644 index 0000000..478174e Binary files /dev/null and b/src/renderer/src/assets/images/second/mouseLocation.png differ diff --git a/src/renderer/src/assets/images/second/multilateralBody.png b/src/renderer/src/assets/images/second/multilateralBody.png new file mode 100644 index 0000000..dc39e04 Binary files /dev/null and b/src/renderer/src/assets/images/second/multilateralBody.png differ diff --git a/src/renderer/src/assets/images/second/nightVision.png b/src/renderer/src/assets/images/second/nightVision.png new file mode 100644 index 0000000..74cd25c Binary files /dev/null and b/src/renderer/src/assets/images/second/nightVision.png differ diff --git a/src/renderer/src/assets/images/second/path.png b/src/renderer/src/assets/images/second/path.png new file mode 100644 index 0000000..33675f3 Binary files /dev/null and b/src/renderer/src/assets/images/second/path.png differ diff --git a/src/renderer/src/assets/images/second/pressModel.png b/src/renderer/src/assets/images/second/pressModel.png new file mode 100644 index 0000000..ebf1ced Binary files /dev/null and b/src/renderer/src/assets/images/second/pressModel.png differ diff --git a/src/renderer/src/assets/images/second/profileAnalysis.png b/src/renderer/src/assets/images/second/profileAnalysis.png new file mode 100644 index 0000000..afb3b04 Binary files /dev/null and b/src/renderer/src/assets/images/second/profileAnalysis.png differ diff --git a/src/renderer/src/assets/images/second/projConvert.png b/src/renderer/src/assets/images/second/projConvert.png new file mode 100644 index 0000000..e7cb1c4 Binary files /dev/null and b/src/renderer/src/assets/images/second/projConvert.png differ diff --git a/src/renderer/src/assets/images/second/projectionArea.png b/src/renderer/src/assets/images/second/projectionArea.png new file mode 100644 index 0000000..e9ccdf7 Binary files /dev/null and b/src/renderer/src/assets/images/second/projectionArea.png differ diff --git a/src/renderer/src/assets/images/second/projectionConvert.png b/src/renderer/src/assets/images/second/projectionConvert.png new file mode 100644 index 0000000..3ed72c5 Binary files /dev/null and b/src/renderer/src/assets/images/second/projectionConvert.png differ diff --git a/src/renderer/src/assets/images/second/projectionDistanceMeasure.png b/src/renderer/src/assets/images/second/projectionDistanceMeasure.png new file mode 100644 index 0000000..57c6d1b Binary files /dev/null and b/src/renderer/src/assets/images/second/projectionDistanceMeasure.png differ diff --git a/src/renderer/src/assets/images/second/radarLightWave.png b/src/renderer/src/assets/images/second/radarLightWave.png new file mode 100644 index 0000000..6bacc01 Binary files /dev/null and b/src/renderer/src/assets/images/second/radarLightWave.png differ diff --git a/src/renderer/src/assets/images/second/routePlan.png b/src/renderer/src/assets/images/second/routePlan.png new file mode 100644 index 0000000..4c2b967 Binary files /dev/null and b/src/renderer/src/assets/images/second/routePlan.png differ diff --git a/src/renderer/src/assets/images/second/scanStereoscopic.png b/src/renderer/src/assets/images/second/scanStereoscopic.png new file mode 100644 index 0000000..2779502 Binary files /dev/null and b/src/renderer/src/assets/images/second/scanStereoscopic.png differ diff --git a/src/renderer/src/assets/images/second/sightAnalysis.png b/src/renderer/src/assets/images/second/sightAnalysis.png new file mode 100644 index 0000000..9cba520 Binary files /dev/null and b/src/renderer/src/assets/images/second/sightAnalysis.png differ diff --git a/src/renderer/src/assets/images/second/slopeDirection.png b/src/renderer/src/assets/images/second/slopeDirection.png new file mode 100644 index 0000000..22ce5ec Binary files /dev/null and b/src/renderer/src/assets/images/second/slopeDirection.png differ diff --git a/src/renderer/src/assets/images/second/smoke.png b/src/renderer/src/assets/images/second/smoke.png new file mode 100644 index 0000000..679d95b Binary files /dev/null and b/src/renderer/src/assets/images/second/smoke.png differ diff --git a/src/renderer/src/assets/images/second/terrainDig.png b/src/renderer/src/assets/images/second/terrainDig.png new file mode 100644 index 0000000..09660ce Binary files /dev/null and b/src/renderer/src/assets/images/second/terrainDig.png differ diff --git a/src/renderer/src/assets/images/second/tilesetClipping.png b/src/renderer/src/assets/images/second/tilesetClipping.png new file mode 100644 index 0000000..e814536 Binary files /dev/null and b/src/renderer/src/assets/images/second/tilesetClipping.png differ diff --git a/src/renderer/src/assets/images/second/trajectoryMotion.png b/src/renderer/src/assets/images/second/trajectoryMotion.png new file mode 100644 index 0000000..85595ea Binary files /dev/null and b/src/renderer/src/assets/images/second/trajectoryMotion.png differ diff --git a/src/renderer/src/assets/images/second/triangleMeasure.png b/src/renderer/src/assets/images/second/triangleMeasure.png new file mode 100644 index 0000000..da3ef38 Binary files /dev/null and b/src/renderer/src/assets/images/second/triangleMeasure.png differ diff --git a/src/renderer/src/assets/images/second/waterSurface.png b/src/renderer/src/assets/images/second/waterSurface.png new file mode 100644 index 0000000..a0f8372 Binary files /dev/null and b/src/renderer/src/assets/images/second/waterSurface.png differ diff --git a/src/renderer/src/assets/images/secondBj.png b/src/renderer/src/assets/images/secondBj.png new file mode 100644 index 0000000..0b4b2f9 Binary files /dev/null and b/src/renderer/src/assets/images/secondBj.png differ diff --git a/src/renderer/src/axios/index.ts b/src/renderer/src/axios/index.ts index 2783759..27644bb 100644 --- a/src/renderer/src/axios/index.ts +++ b/src/renderer/src/axios/index.ts @@ -1,3 +1,4 @@ +import router from '@renderer/router' import axios from 'axios' import type { AxiosInstance, @@ -9,14 +10,14 @@ import type { const pendingRequests = new Map() let baseURL: any if (window && window.process && window.process.type === 'renderer') { - baseURL = localStorage.getItem('ip') || 'http://127.0.0.1:8808' + baseURL = localStorage.getItem('ip') ||'http://192.168.110.25:8848'|| 'http://127.0.0.1:8808' } else { baseURL = '' } // 创建自定义配置的axios实例 const service: AxiosInstance = axios.create({ - baseURL, + baseURL:'http://192.168.110.25:8848', timeout: 10000, headers: { 'Content-Type': 'application/json', @@ -47,9 +48,12 @@ service.interceptors.request.use( pendingRequests.set(key, controller) // 在这里添加认证token - const token = localStorage.getItem('access_token') + const token = localStorage.getItem('Authorization') +console.log("localStorage.getItem('Authorization')",token); + if (token && config.headers) { - config.headers.Authorization = `Bearer ${token}` + // Bearer + config.headers.Authorization = `${token}` } return config }, @@ -63,18 +67,24 @@ service.interceptors.response.use( (response: AxiosResponse) => { const key = getRequestKey(response.config) pendingRequests.delete(key) +console.log(response); // 统一处理HTTP状态码 if (response.status === 200) { - if (response.data.code == 0) { + if ([0,200].includes(response.data.code)) { return response } - if (response.data.code != 0) { + if (response.data.code==401) { + router.push('/') + localStorage.removeItem('Authorization') + } + if (![0,200].includes(response.data.code)) { ElMessage({ message: response.data.msg || response.data.message, type: 'error' }) } + } return Promise.reject(new Error('Error')) }, diff --git a/src/renderer/src/main.ts b/src/renderer/src/main.ts index aeab955..5b9437f 100644 --- a/src/renderer/src/main.ts +++ b/src/renderer/src/main.ts @@ -25,7 +25,7 @@ import '../public/tree/jquery.ztree.exhide.js' import '../public/tree/fuzzysearch.js' import '../public/tree/newFuzzySearch' import Pagination from './components/Pagination/index.vue' - +process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true"; const i18n = createI18n({ legacy: false, locale: 'zh-CN', @@ -38,6 +38,9 @@ const i18n = createI18n({ // 注册全局指令 const setApp = createApp(App) +// 定义全局方法 + +// setApp.config.globalProperties.$md5 = md5 setApp.component('Pagination', Pagination) setupStore(setApp) setupSvgIcon(setApp) diff --git a/src/renderer/src/router/index.ts b/src/renderer/src/router/index.ts index ef42e51..bf7a99e 100644 --- a/src/renderer/src/router/index.ts +++ b/src/renderer/src/router/index.ts @@ -23,5 +23,16 @@ const router = createRouter({ history: createWebHashHistory(), routes }) +router.beforeEach((to, from, next) => { + // 去登录,放行 + if (to.path === '/') { + next() + } else { + if(localStorage.getItem('Authorization')) { + next() + }else + next("/") + } +}) export default router diff --git a/src/renderer/src/views/components/headers/components/setTool/setTool.vue b/src/renderer/src/views/components/headers/components/setTool/setTool.vue index e81a45e..0a115ac 100644 --- a/src/renderer/src/views/components/headers/components/setTool/setTool.vue +++ b/src/renderer/src/views/components/headers/components/setTool/setTool.vue @@ -13,14 +13,8 @@ --> -
+
@@ -28,14 +22,23 @@ @@ -110,6 +113,7 @@ const setList = ref([ position: relative; cursor: pointer; } + .set_item::after { content: ''; position: absolute; @@ -117,17 +121,16 @@ const setList = ref([ top: 0; bottom: 0; width: 1px; - background: linear-gradient( - 180deg, - rgba(0, 255, 255, 0), - rgba(0, 255, 255, 1), - rgba(204, 204, 204, 0) - ); + background: linear-gradient(180deg, + rgba(0, 255, 255, 0), + rgba(0, 255, 255, 1), + rgba(204, 204, 204, 0)); } .set_item.last-item::after { display: none; } + ::v-deep .el-dialog__body { padding: 10px; } diff --git a/src/renderer/src/views/components/leftSide/leftSideFirst.vue b/src/renderer/src/views/components/leftSide/leftSideFirst.vue index a4860ff..affed71 100644 --- a/src/renderer/src/views/components/leftSide/leftSideFirst.vue +++ b/src/renderer/src/views/components/leftSide/leftSideFirst.vue @@ -2,19 +2,19 @@