From 691d97d1b785159eda422b453427b10734708a14 Mon Sep 17 00:00:00 2001 From: chrisftian Date: Thu, 18 Aug 2022 14:03:51 +0800 Subject: [PATCH] feat1.4.1 --- .babelrc | 3 - babel.config.js | 15 +++ dist/cos-js-sdk-v5.js | 241 +++++++++++++++++++++++++------------- dist/cos-js-sdk-v5.min.js | 2 +- package.json | 9 +- src/tracker.js | 3 + webpack.config.js | 2 +- 7 files changed, 182 insertions(+), 93 deletions(-) delete mode 100644 .babelrc create mode 100644 babel.config.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 8aa924d..0000000 --- a/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["@babel/preset-env"] -} \ No newline at end of file diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..e96b730 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,15 @@ +module.exports = { + "sourceType": "unambiguous", + "presets": [ + ["@babel/preset-env", + { + "targets": { + "browsers": ["> 1%", "last 2 versions"] + } + } + ] + ], + "plugins": [ + "@babel/plugin-transform-runtime" + ] +} \ No newline at end of file diff --git a/dist/cos-js-sdk-v5.js b/dist/cos-js-sdk-v5.js index 899f17a..4a5a467 100644 --- a/dist/cos-js-sdk-v5.js +++ b/dist/cos-js-sdk-v5.js @@ -116,7 +116,7 @@ module.exports = COS; /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -/* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +/* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); !function (t, e) { "object" == ( false ? undefined : _typeof(exports)) && "undefined" != typeof module ? module.exports = e() : true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (e), @@ -163,7 +163,7 @@ module.exports = COS; function s(t) { try { - c(n["throw"](t)); + c(n.throw(t)); } catch (t) { i(t); } @@ -196,8 +196,8 @@ module.exports = COS; }; return i = { next: s(0), - "throw": s(1), - "return": s(2) + throw: s(1), + return: s(2) }, "function" == typeof Symbol && (i[Symbol.iterator] = function () { return this; }), i; @@ -209,7 +209,7 @@ module.exports = COS; for (; a;) { try { - if (r = 1, n && (o = 2 & i[0] ? n["return"] : i[0] ? n["throw"] || ((o = n["return"]) && o.call(n), 0) : n.next) && !(o = o.call(n, i[1])).done) return o; + if (r = 1, n && (o = 2 & i[0] ? n.return : i[0] ? n.throw || ((o = n.return) && o.call(n), 0) : n.next) && !(o = o.call(n, i[1])).done) return o; switch (n = 0, o && (i = [2 & i[0], o.value]), i[0]) { case 0: @@ -452,7 +452,7 @@ module.exports = COS; return t.prototype.reportError = function (t, e) { this.requestParams._dc = Math.random(), this.requestParams.error_msg = e, this.requestParams.error_code = t, this.network.get(this.uploadUrl, { params: this.requestParams - })["catch"](function (t) {}); + }).catch(function (t) {}); }, t; }(), g = function () { @@ -491,7 +491,7 @@ module.exports = COS; var e = JSON.parse(t.data.beaconConfig); e && (n.processData(e), n.storage.setItem(c, t.data.beaconConfig)); } catch (t) {} else n.processData(null), n.storage.setItem(c, ""); - })["catch"](function (t) {}); + }).catch(function (t) {}); }, t.prototype.processData = function (t) { var e, r, n, o, i; this.strategy.isEventUpOnOff = null !== (e = null == t ? void 0 : t.isEventUpOnOff) && void 0 !== e ? e : this.strategy.isEventUpOnOff, this.strategy.httpsUploadUrl = null !== (r = null == t ? void 0 : t.httpsUploadUrl) && void 0 !== r ? r : this.strategy.httpsUploadUrl, this.strategy.requestInterval = null !== (n = null == t ? void 0 : t.requestInterval) && void 0 !== n ? n : this.strategy.requestInterval, this.strategy.blacklist = null !== (o = null == t ? void 0 : t.blacklist) && void 0 !== o ? o : this.strategy.blacklist, this.strategy.samplelist = null !== (i = null == t ? void 0 : t.samplelist) && void 0 !== i ? i : this.strategy.samplelist; @@ -687,7 +687,7 @@ module.exports = COS; if (null === (t = n.result) || void 0 === t ? void 0 : t.value) { var r = n.result.value; - o.push(r), n.result["continue"](); + o.push(r), n.result.continue(); } else e(o); }, n.onerror = r; }); @@ -700,7 +700,7 @@ module.exports = COS; h = c.openCursor(u); h.onsuccess = function () { var t; - (null === (t = null == h ? void 0 : h.result) || void 0 === t ? void 0 : t.value) ? (l.push(null == h ? void 0 : h.result.value), null == h || h.result["continue"]()) : a(l); + (null === (t = null == h ? void 0 : h.result) || void 0 === t ? void 0 : t.value) ? (l.push(null == h ? void 0 : h.result.value), null == h || h.result.continue()) : a(l); }, h.onerror = s; }); }, t.prototype.removeDataByIndex = function (t, e, r, n, o) { @@ -712,7 +712,7 @@ module.exports = COS; h = 0; l.onsuccess = function (t) { var e = t.target.result; - e ? (h += 1, e["delete"](), e["continue"]()) : a(h); + e ? (h += 1, e.delete(), e.continue()) : a(h); }, l.onerror = s; }); }, t.prototype.createStore = function (t) { @@ -1072,7 +1072,7 @@ module.exports = COS; function s(t) { try { - c(n["throw"](t)); + c(n.throw(t)); } catch (t) { i(t); } @@ -1105,8 +1105,8 @@ module.exports = COS; }; return i = { next: s(0), - "throw": s(1), - "return": s(2) + throw: s(1), + return: s(2) }, "function" == typeof Symbol && (i[Symbol.iterator] = function () { return this; }), i; @@ -1118,7 +1118,7 @@ module.exports = COS; for (; a;) { try { - if (r = 1, n && (o = 2 & i[0] ? n["return"] : i[0] ? n["throw"] || ((o = n["return"]) && o.call(n), 0) : n.next) && !(o = o.call(n, i[1])).done) return o; + if (r = 1, n && (o = 2 & i[0] ? n.return : i[0] ? n.throw || ((o = n.return) && o.call(n), 0) : n.next) && !(o = o.call(n, i[1])).done) return o; switch (n = 0, o && (i = [2 & i[0], o.value]), i[0]) { case 0: @@ -1330,7 +1330,7 @@ module.exports = COS; p = setTimeout(function () { t(new Error("timeout")); }, s); - }), f.push(v), d = new AbortController(), i.signal = d.signal), f.push(fetch(h, i)["catch"](function (t) { + }), f.push(v), d = new AbortController(), i.signal = d.signal), f.push(fetch(h, i).catch(function (t) { return t; })), [4, Promise.race(f)]; @@ -1555,7 +1555,7 @@ module.exports = COS; if ((o = r.iterator[n.method]) === e) { if (n.delegate = null, "throw" === n.method) { - if (r.iterator["return"] && (n.method = "return", n.arg = e, t(r, n), "throw" === n.method)) return v; + if (r.iterator.return && (n.method = "return", n.arg = e, t(r, n), "throw" === n.method)) return v; n.method = "throw", n.arg = new TypeError("The iterator does not provide a 'throw' method"); } @@ -1805,7 +1805,7 @@ module.exports = COS; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), O(r), v; } }, - "catch": function _catch(t) { + catch: function _catch(t) { for (var e = this.tryEntries.length - 1; 0 <= e; --e) { var r = this.tryEntries[e]; @@ -2095,7 +2095,7 @@ module.exports = COS; e.removeSendingId(p(t.mapValue)); }); }), e.doCustomCycleTask(); - })["catch"](function (r) { + }).catch(function (r) { var o = t.data.events; e.errorReport.reportError(r.code ? r.code.toString() : "600", r.message), n && n(t.data); var i = JSON.parse(e.storage.getItem(s)); @@ -2161,7 +2161,7 @@ module.exports = COS; var e = p(t.mapValue); -1 == n.indexOf(e) && (r.push(t), n.push(e)); }), 0 != r.length && (e.storage.setItem(s, JSON.stringify(n)), e._normalLogPipeline(e.assembleData(r))); - })["catch"](function (t) {}); + }).catch(function (t) {}); }, t); }, n.prototype.onReport = function (t, e, r) { var n = this; @@ -2171,7 +2171,7 @@ module.exports = COS; var i = o.shift(); i && this.store.insertEvent(i, function (t) { t && n.errorReport.reportError("604", "insertEvent fail!"); - })["catch"](function (t) { + }).catch(function (t) { n._normalLogPipeline(n.assembleData(o)); }); } @@ -2226,7 +2226,7 @@ module.exports = COS; }, n; }(v); }); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/_webpack@4.46.0@webpack/buildin/global.js */ "./node_modules/_webpack@4.46.0@webpack/buildin/global.js"))) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), @@ -2237,7 +2237,7 @@ module.exports = COS; /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -/* WEBPACK VAR INJECTION */(function(module) {function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +/* WEBPACK VAR INJECTION */(function(module) {var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); /* CryptoJS v3.1.2 @@ -2653,7 +2653,7 @@ if (( false ? undefined : _typeof(module)) === 'object') { } else { window.CryptoJS = CryptoJS; } -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/_webpack@4.46.0@webpack/buildin/module.js */ "./node_modules/_webpack@4.46.0@webpack/buildin/module.js")(module))) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module))) /***/ }), @@ -2662,9 +2662,9 @@ if (( false ? undefined : _typeof(module)) === 'object') { !*** ./lib/json2xml.js ***! \*************************/ /*! no static exports found */ -/***/ (function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); //copyright Ryan Day 2010 , Joscha Feth 2013 [MIT Licensed] var element_start_char = "a-zA-Z_\xC0-\xD6\xD8-\xF6\xF8-\xFF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FFF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD"; @@ -2836,7 +2836,7 @@ module.exports = function (obj, options) { /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -/* WEBPACK VAR INJECTION */(function(process, global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +/* WEBPACK VAR INJECTION */(function(process, global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); /* https://github.com/emn178/js-md5 */ (function () { @@ -2860,7 +2860,7 @@ module.exports = function (obj, options) { } var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && ( false ? undefined : _typeof(module)) === 'object' && module.exports; - var AMD = true && __webpack_require__(/*! !webpack amd options */ "./node_modules/_webpack@4.46.0@webpack/buildin/amd-options.js"); + var AMD = true && __webpack_require__(/*! !webpack amd options */ "./node_modules/webpack/buildin/amd-options.js"); var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined'; var HEX_CHARS = '0123456789abcdef'.split(''); var EXTRA = [128, 32768, 8388608, -2147483648]; @@ -3510,7 +3510,7 @@ module.exports = function (obj, options) { } } })(); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/_process@0.11.10@process/browser.js */ "./node_modules/_process@0.11.10@process/browser.js"), __webpack_require__(/*! ./../node_modules/_webpack@4.46.0@webpack/buildin/global.js */ "./node_modules/_webpack@4.46.0@webpack/buildin/global.js"), __webpack_require__(/*! ./../node_modules/_webpack@4.46.0@webpack/buildin/module.js */ "./node_modules/_webpack@4.46.0@webpack/buildin/module.js")(module))) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module))) /***/ }), @@ -3519,9 +3519,9 @@ module.exports = function (obj, options) { !*** ./lib/request.js ***! \************************/ /*! no static exports found */ -/***/ (function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); var stringifyPrimitive = function stringifyPrimitive(v) { switch (_typeof(v)) { @@ -3692,7 +3692,7 @@ module.exports = request; * @author William Summers * https://github.com/metatribal/xmlToJSON */ -var DOMParser = __webpack_require__(/*! @xmldom/xmldom */ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/index.js").DOMParser; +var DOMParser = __webpack_require__(/*! @xmldom/xmldom */ "./node_modules/@xmldom/xmldom/lib/index.js").DOMParser; var xmlToJSON = function () { this.version = "1.3.5"; @@ -3844,10 +3844,78 @@ module.exports = xml2json; /***/ }), -/***/ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/conventions.js": -/*!******************************************************************************!*\ - !*** ./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/conventions.js ***! - \******************************************************************************/ +/***/ "./node_modules/@babel/runtime/helpers/classCallCheck.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/classCallCheck.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +module.exports = _classCallCheck, module.exports.__esModule = true, module.exports["default"] = module.exports; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/createClass.js": +/*!************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/createClass.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; +} + +module.exports = _createClass, module.exports.__esModule = true, module.exports["default"] = module.exports; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/typeof.js": +/*!*******************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/typeof.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _typeof(obj) { + "@babel/helpers - typeof"; + + return (module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(obj); +} + +module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports; + +/***/ }), + +/***/ "./node_modules/@xmldom/xmldom/lib/conventions.js": +/*!********************************************************!*\ + !*** ./node_modules/@xmldom/xmldom/lib/conventions.js ***! + \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { @@ -4026,17 +4094,17 @@ exports.NAMESPACE = NAMESPACE; /***/ }), -/***/ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/dom-parser.js": -/*!*****************************************************************************!*\ - !*** ./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/dom-parser.js ***! - \*****************************************************************************/ +/***/ "./node_modules/@xmldom/xmldom/lib/dom-parser.js": +/*!*******************************************************!*\ + !*** ./node_modules/@xmldom/xmldom/lib/dom-parser.js ***! + \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -var conventions = __webpack_require__(/*! ./conventions */ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/conventions.js"); -var dom = __webpack_require__(/*! ./dom */ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/dom.js") -var entities = __webpack_require__(/*! ./entities */ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/entities.js"); -var sax = __webpack_require__(/*! ./sax */ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/sax.js"); +var conventions = __webpack_require__(/*! ./conventions */ "./node_modules/@xmldom/xmldom/lib/conventions.js"); +var dom = __webpack_require__(/*! ./dom */ "./node_modules/@xmldom/xmldom/lib/dom.js") +var entities = __webpack_require__(/*! ./entities */ "./node_modules/@xmldom/xmldom/lib/entities.js"); +var sax = __webpack_require__(/*! ./sax */ "./node_modules/@xmldom/xmldom/lib/sax.js"); var DOMImplementation = dom.DOMImplementation; @@ -4359,14 +4427,14 @@ exports.DOMParser = DOMParser; /***/ }), -/***/ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/dom.js": -/*!**********************************************************************!*\ - !*** ./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/dom.js ***! - \**********************************************************************/ +/***/ "./node_modules/@xmldom/xmldom/lib/dom.js": +/*!************************************************!*\ + !*** ./node_modules/@xmldom/xmldom/lib/dom.js ***! + \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -var conventions = __webpack_require__(/*! ./conventions */ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/conventions.js"); +var conventions = __webpack_require__(/*! ./conventions */ "./node_modules/@xmldom/xmldom/lib/conventions.js"); var NAMESPACE = conventions.NAMESPACE; @@ -5904,14 +5972,14 @@ try{ /***/ }), -/***/ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/entities.js": -/*!***************************************************************************!*\ - !*** ./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/entities.js ***! - \***************************************************************************/ +/***/ "./node_modules/@xmldom/xmldom/lib/entities.js": +/*!*****************************************************!*\ + !*** ./node_modules/@xmldom/xmldom/lib/entities.js ***! + \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -var freeze = __webpack_require__(/*! ./conventions */ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/conventions.js").freeze; +var freeze = __webpack_require__(/*! ./conventions */ "./node_modules/@xmldom/xmldom/lib/conventions.js").freeze; /** * The entities that are predefined in every XML document. @@ -6188,29 +6256,29 @@ exports.entityMap = exports.HTML_ENTITIES /***/ }), -/***/ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/index.js": -/*!************************************************************************!*\ - !*** ./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/index.js ***! - \************************************************************************/ +/***/ "./node_modules/@xmldom/xmldom/lib/index.js": +/*!**************************************************!*\ + !*** ./node_modules/@xmldom/xmldom/lib/index.js ***! + \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -var dom = __webpack_require__(/*! ./dom */ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/dom.js") +var dom = __webpack_require__(/*! ./dom */ "./node_modules/@xmldom/xmldom/lib/dom.js") exports.DOMImplementation = dom.DOMImplementation exports.XMLSerializer = dom.XMLSerializer -exports.DOMParser = __webpack_require__(/*! ./dom-parser */ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/dom-parser.js").DOMParser +exports.DOMParser = __webpack_require__(/*! ./dom-parser */ "./node_modules/@xmldom/xmldom/lib/dom-parser.js").DOMParser /***/ }), -/***/ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/sax.js": -/*!**********************************************************************!*\ - !*** ./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/sax.js ***! - \**********************************************************************/ +/***/ "./node_modules/@xmldom/xmldom/lib/sax.js": +/*!************************************************!*\ + !*** ./node_modules/@xmldom/xmldom/lib/sax.js ***! + \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -var NAMESPACE = __webpack_require__(/*! ./conventions */ "./node_modules/_@xmldom_xmldom@0.8.2@@xmldom/xmldom/lib/conventions.js").NAMESPACE; +var NAMESPACE = __webpack_require__(/*! ./conventions */ "./node_modules/@xmldom/xmldom/lib/conventions.js").NAMESPACE; //[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] //[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] @@ -6864,10 +6932,10 @@ exports.ParseError = ParseError; /***/ }), -/***/ "./node_modules/_process@0.11.10@process/browser.js": -/*!**********************************************************!*\ - !*** ./node_modules/_process@0.11.10@process/browser.js ***! - \**********************************************************/ +/***/ "./node_modules/process/browser.js": +/*!*****************************************!*\ + !*** ./node_modules/process/browser.js ***! + \*****************************************/ /*! no static exports found */ /***/ (function(module, exports) { @@ -7059,7 +7127,7 @@ process.umask = function() { return 0; }; /***/ }), -/***/ "./node_modules/_webpack@4.46.0@webpack/buildin/amd-options.js": +/***/ "./node_modules/webpack/buildin/amd-options.js": /*!****************************************!*\ !*** (webpack)/buildin/amd-options.js ***! \****************************************/ @@ -7073,7 +7141,7 @@ module.exports = __webpack_amd_options__; /***/ }), -/***/ "./node_modules/_webpack@4.46.0@webpack/buildin/global.js": +/***/ "./node_modules/webpack/buildin/global.js": /*!***********************************!*\ !*** (webpack)/buildin/global.js ***! \***********************************/ @@ -7104,7 +7172,7 @@ module.exports = g; /***/ }), -/***/ "./node_modules/_webpack@4.46.0@webpack/buildin/module.js": +/***/ "./node_modules/webpack/buildin/module.js": /*!***********************************!*\ !*** (webpack)/buildin/module.js ***! \***********************************/ @@ -7144,7 +7212,7 @@ module.exports = function(module) { /*! exports provided: name, version, description, main, types, scripts, repository, keywords, author, license, bugs, homepage, dependencies, devDependencies, default */ /***/ (function(module) { -module.exports = JSON.parse("{\"name\":\"cos-js-sdk-v5\",\"version\":\"1.4.0\",\"description\":\"JavaScript SDK for [腾讯云对象存储](https://cloud.tencent.com/product/cos)\",\"main\":\"index.js\",\"types\":\"index.d.ts\",\"scripts\":{\"server\":\"node server/sts.js\",\"dev\":\"cross-env NODE_ENV=development webpack -w --mode=development\",\"build\":\"cross-env NODE_ENV=production webpack --mode=production\",\"cos-auth.min.js\":\"uglifyjs ./demo/common/cos-auth.js -o ./demo/common/cos-auth.min.js -c -m\",\"nyc\":\"node test/watcher.js && nyc report --reporter=clover --reporter=cobertura\"},\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/tencentyun/cos-js-sdk-v5.git\"},\"keywords\":[],\"author\":\"carsonxu\",\"license\":\"ISC\",\"bugs\":{\"url\":\"https://github.com/tencentyun/cos-js-sdk-v5/issues\"},\"homepage\":\"https://github.com/tencentyun/cos-js-sdk-v5#readme\",\"dependencies\":{\"@xmldom/xmldom\":\"^0.8.2\"},\"devDependencies\":{\"@babel/core\":\"7.17.9\",\"@babel/preset-env\":\"7.16.11\",\"babel-loader\":\"8.2.5\",\"body-parser\":\"^1.18.3\",\"cross-env\":\"^5.2.0\",\"express\":\"^4.16.4\",\"nyc\":\"^15.1.0\",\"puppeteer\":\"^5.3.1\",\"puppeteer-to-istanbul\":\"^1.4.0\",\"qcloud-cos-sts\":\"^3.0.2\",\"request\":\"^2.87.0\",\"webpack\":\"4.46.0\",\"webpack-cli\":\"4.10.0\",\"terser-webpack-plugin\":\"4.2.3\"}}"); +module.exports = JSON.parse("{\"name\":\"cos-js-sdk-v5\",\"version\":\"1.4.1\",\"description\":\"JavaScript SDK for [腾讯云对象存储](https://cloud.tencent.com/product/cos)\",\"main\":\"dist/cos-js-sdk-v5.js\",\"types\":\"index.d.ts\",\"scripts\":{\"server\":\"node server/sts.js\",\"dev\":\"cross-env NODE_ENV=development webpack -w --mode=development\",\"build\":\"cross-env NODE_ENV=production webpack --mode=production\",\"cos-auth.min.js\":\"uglifyjs ./demo/common/cos-auth.js -o ./demo/common/cos-auth.min.js -c -m\",\"nyc\":\"node test/watcher.js && nyc report --reporter=clover --reporter=cobertura\"},\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/tencentyun/cos-js-sdk-v5.git\"},\"keywords\":[],\"author\":\"carsonxu\",\"license\":\"ISC\",\"bugs\":{\"url\":\"https://github.com/tencentyun/cos-js-sdk-v5/issues\"},\"homepage\":\"https://github.com/tencentyun/cos-js-sdk-v5#readme\",\"dependencies\":{\"@xmldom/xmldom\":\"^0.8.2\"},\"devDependencies\":{\"@babel/core\":\"7.17.9\",\"@babel/plugin-transform-runtime\":\"7.18.10\",\"@babel/preset-env\":\"7.16.11\",\"babel-loader\":\"8.2.5\",\"body-parser\":\"^1.18.3\",\"cross-env\":\"^5.2.0\",\"express\":\"^4.16.4\",\"nyc\":\"^15.1.0\",\"puppeteer\":\"^5.3.1\",\"puppeteer-to-istanbul\":\"^1.4.0\",\"qcloud-cos-sts\":\"^3.0.2\",\"request\":\"^2.87.0\",\"terser-webpack-plugin\":\"4.2.3\",\"webpack\":\"4.46.0\",\"webpack-cli\":\"4.10.0\"}}"); /***/ }), @@ -7155,7 +7223,7 @@ module.exports = JSON.parse("{\"name\":\"cos-js-sdk-v5\",\"version\":\"1.4.0\",\ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); var session = __webpack_require__(/*! ./session */ "./src/session.js"); @@ -13287,13 +13355,11 @@ module.exports.init = initTask; /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +var _classCallCheck = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"); -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } +var _createClass = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"); -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } - -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); var pkg = __webpack_require__(/*! ../package.json */ "./package.json"); @@ -13344,6 +13410,10 @@ var utils = { }, // 获取pc端操作系统类型 getOsType: function getOsType() { + if ((typeof navigator === "undefined" ? "undefined" : _typeof(navigator)) !== 'object') { + return 'unknown os'; + } + var agent = navigator.userAgent.toLowerCase(); var isMac = /macintosh|mac os x/i.test(navigator.userAgent); @@ -13539,6 +13609,8 @@ function formatParams(params) { var Tracker = /*#__PURE__*/function () { + "use strict"; + function Tracker(opt) { _classCallCheck(this, Tracker); @@ -13743,7 +13815,7 @@ module.exports = Tracker; "use strict"; /* WEBPACK VAR INJECTION */(function(process) { -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); var md5 = __webpack_require__(/*! ../lib/md5 */ "./lib/md5.js"); @@ -14193,12 +14265,12 @@ function filter(obj, fn) { var binaryBase64 = function binaryBase64(str) { var i, len, - _char, + char, res = ''; for (i = 0, len = str.length / 2; i < len; i++) { - _char = parseInt(str[i * 2] + str[i * 2 + 1], 16); - res += String.fromCharCode(_char); + char = parseInt(str[i * 2] + str[i * 2 + 1], 16); + res += String.fromCharCode(char); } return btoa(res); @@ -14597,9 +14669,10 @@ var util = { isCIHost: isCIHost }; module.exports = util; -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/_process@0.11.10@process/browser.js */ "./node_modules/_process@0.11.10@process/browser.js"))) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/process/browser.js */ "./node_modules/process/browser.js"))) /***/ }) /******/ }); -}); \ No newline at end of file +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zLWpzLXNkay12NS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0NPUy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vQ09TL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0NPUy8uL2luZGV4LmpzIiwid2VicGFjazovL0NPUy8uL2xpYi9iZWFjb24ubWluLmpzIiwid2VicGFjazovL0NPUy8uL2xpYi9jcnlwdG8uanMiLCJ3ZWJwYWNrOi8vQ09TLy4vbGliL2pzb24yeG1sLmpzIiwid2VicGFjazovL0NPUy8uL2xpYi9tZDUuanMiLCJ3ZWJwYWNrOi8vQ09TLy4vbGliL3JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vQ09TLy4vbGliL3htbDJqc29uLmpzIiwid2VicGFjazovL0NPUy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIiwid2VicGFjazovL0NPUy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwid2VicGFjazovL0NPUy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly9DT1MvLi9ub2RlX21vZHVsZXMvQHhtbGRvbS94bWxkb20vbGliL2NvbnZlbnRpb25zLmpzIiwid2VicGFjazovL0NPUy8uL25vZGVfbW9kdWxlcy9AeG1sZG9tL3htbGRvbS9saWIvZG9tLXBhcnNlci5qcyIsIndlYnBhY2s6Ly9DT1MvLi9ub2RlX21vZHVsZXMvQHhtbGRvbS94bWxkb20vbGliL2RvbS5qcyIsIndlYnBhY2s6Ly9DT1MvLi9ub2RlX21vZHVsZXMvQHhtbGRvbS94bWxkb20vbGliL2VudGl0aWVzLmpzIiwid2VicGFjazovL0NPUy8uL25vZGVfbW9kdWxlcy9AeG1sZG9tL3htbGRvbS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQ09TLy4vbm9kZV9tb2R1bGVzL0B4bWxkb20veG1sZG9tL2xpYi9zYXguanMiLCJ3ZWJwYWNrOi8vQ09TLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9DT1MvKHdlYnBhY2spL2J1aWxkaW4vYW1kLW9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vQ09TLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly9DT1MvKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzIiwid2VicGFjazovL0NPUy8uL3NyYy9hZHZhbmNlLmpzIiwid2VicGFjazovL0NPUy8uL3NyYy9hc3luYy5qcyIsIndlYnBhY2s6Ly9DT1MvLi9zcmMvYmFzZS5qcyIsIndlYnBhY2s6Ly9DT1MvLi9zcmMvY29zLmpzIiwid2VicGFjazovL0NPUy8uL3NyYy9ldmVudC5qcyIsIndlYnBhY2s6Ly9DT1MvLi9zcmMvc2Vzc2lvbi5qcyIsIndlYnBhY2s6Ly9DT1MvLi9zcmMvdGFzay5qcyIsIndlYnBhY2s6Ly9DT1MvLi9zcmMvdHJhY2tlci5qcyIsIndlYnBhY2s6Ly9DT1MvLi9zcmMvdXRpbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJDT1NcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQ09TXCJdID0gZmFjdG9yeSgpO1xufSkod2luZG93LCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi9kaXN0L1wiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL2luZGV4LmpzXCIpO1xuIiwidmFyIENPUyA9IHJlcXVpcmUoJy4vc3JjL2NvcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENPUzsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTtcblxuIWZ1bmN0aW9uICh0LCBlKSB7XG4gIFwib2JqZWN0XCIgPT0gKHR5cGVvZiBleHBvcnRzID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoZXhwb3J0cykpICYmIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIG1vZHVsZSA/IG1vZHVsZS5leHBvcnRzID0gZSgpIDogXCJmdW5jdGlvblwiID09IHR5cGVvZiBkZWZpbmUgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShlKSA6ICh0ID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgZ2xvYmFsVGhpcyA/IGdsb2JhbFRoaXMgOiB0IHx8IHNlbGYpLkJlYWNvbkFjdGlvbiA9IGUoKTtcbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgX3QgPSBmdW5jdGlvbiB0KGUsIHIpIHtcbiAgICByZXR1cm4gKF90ID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHtcbiAgICAgIF9fcHJvdG9fXzogW11cbiAgICB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHQuX19wcm90b19fID0gZTtcbiAgICB9IHx8IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBmb3IgKHZhciByIGluIGUpIHtcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHIpICYmICh0W3JdID0gZVtyXSk7XG4gICAgICB9XG4gICAgfSkoZSwgcik7XG4gIH07XG5cbiAgdmFyIF9lID0gZnVuY3Rpb24gZSgpIHtcbiAgICByZXR1cm4gKF9lID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh2YXIgZSwgciA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgbjsgcisrKSB7XG4gICAgICAgIGZvciAodmFyIG8gaW4gZSA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSAmJiAodFtvXSA9IGVbb10pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcih0LCBlLCByLCBuKSB7XG4gICAgcmV0dXJuIG5ldyAociB8fCAociA9IFByb21pc2UpKShmdW5jdGlvbiAobywgaSkge1xuICAgICAgZnVuY3Rpb24gYSh0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYyhuLm5leHQodCkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgaSh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzKHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjKG4udGhyb3codCkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgaSh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjKHQpIHtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIHQuZG9uZSA/IG8odC52YWx1ZSkgOiAoZSA9IHQudmFsdWUsIGUgaW5zdGFuY2VvZiByID8gZSA6IG5ldyByKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgdChlKTtcbiAgICAgICAgfSkpLnRoZW4oYSwgcyk7XG4gICAgICB9XG5cbiAgICAgIGMoKG4gPSBuLmFwcGx5KHQsIGUgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbih0LCBlKSB7XG4gICAgdmFyIHIsXG4gICAgICAgIG4sXG4gICAgICAgIG8sXG4gICAgICAgIGksXG4gICAgICAgIGEgPSB7XG4gICAgICBsYWJlbDogMCxcbiAgICAgIHNlbnQ6IGZ1bmN0aW9uIHNlbnQoKSB7XG4gICAgICAgIGlmICgxICYgb1swXSkgdGhyb3cgb1sxXTtcbiAgICAgICAgcmV0dXJuIG9bMV07XG4gICAgICB9LFxuICAgICAgdHJ5czogW10sXG4gICAgICBvcHM6IFtdXG4gICAgfTtcbiAgICByZXR1cm4gaSA9IHtcbiAgICAgIG5leHQ6IHMoMCksXG4gICAgICB0aHJvdzogcygxKSxcbiAgICAgIHJldHVybjogcygyKVxuICAgIH0sIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIChpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9KSwgaTtcblxuICAgIGZ1bmN0aW9uIHMoaSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgIGlmIChyKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcblxuICAgICAgICAgIGZvciAoOyBhOykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKHIgPSAxLCBuICYmIChvID0gMiAmIGlbMF0gPyBuLnJldHVybiA6IGlbMF0gPyBuLnRocm93IHx8ICgobyA9IG4ucmV0dXJuKSAmJiBvLmNhbGwobiksIDApIDogbi5uZXh0KSAmJiAhKG8gPSBvLmNhbGwobiwgaVsxXSkpLmRvbmUpIHJldHVybiBvO1xuXG4gICAgICAgICAgICAgIHN3aXRjaCAobiA9IDAsIG8gJiYgKGkgPSBbMiAmIGlbMF0sIG8udmFsdWVdKSwgaVswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICBvID0gaTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubGFiZWwrKywge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaVsxXSxcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICBhLmxhYmVsKyssIG4gPSBpWzFdLCBpID0gWzBdO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICBpID0gYS5vcHMucG9wKCksIGEudHJ5cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKG8gPSBhLnRyeXMsIChvID0gby5sZW5ndGggPiAwICYmIG9bby5sZW5ndGggLSAxXSkgfHwgNiAhPT0gaVswXSAmJiAyICE9PSBpWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICBhID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGlmICgzID09PSBpWzBdICYmICghbyB8fCBpWzFdID4gb1swXSAmJiBpWzFdIDwgb1szXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYS5sYWJlbCA9IGlbMV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBpZiAoNiA9PT0gaVswXSAmJiBhLmxhYmVsIDwgb1sxXSkge1xuICAgICAgICAgICAgICAgICAgICBhLmxhYmVsID0gb1sxXSwgbyA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBpZiAobyAmJiBhLmxhYmVsIDwgb1syXSkge1xuICAgICAgICAgICAgICAgICAgICBhLmxhYmVsID0gb1syXSwgYS5vcHMucHVzaChpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIG9bMl0gJiYgYS5vcHMucG9wKCksIGEudHJ5cy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaSA9IGUuY2FsbCh0LCBhKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgaSA9IFs2LCB0XSwgbiA9IDA7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICByID0gbyA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKDUgJiBpWzBdKSB0aHJvdyBpWzFdO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogaVswXSA/IGlbMV0gOiB2b2lkIDAsXG4gICAgICAgICAgICBkb25lOiAhMFxuICAgICAgICAgIH07XG4gICAgICAgIH0oW2ksIHNdKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIG8gPSBcIl9fQkVBQ09OX1wiLFxuICAgICAgaSA9IFwiX19CRUFDT05fZGV2aWNlSWRcIixcbiAgICAgIGEgPSBcImxhc3RfcmVwb3J0X3RpbWVcIixcbiAgICAgIHMgPSBcInNlbmRpbmdfZXZlbnRfaWRzXCIsXG4gICAgICBjID0gXCJiZWFjb25fY29uZmlnXCIsXG4gICAgICB1ID0gXCJiZWFjb25fY29uZmlnX3JlcXVlc3RfdGltZVwiLFxuICAgICAgbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiB0KCkge1xuICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24gKGUsIHIpIHtcbiAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICB2YXIgbixcbiAgICAgICAgICAgICAgbyA9IHQuX19FdmVudHNMaXN0W2VdO1xuXG4gICAgICAgICAgaWYgKG51bGwgPT0gbyA/IHZvaWQgMCA6IG8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBvID0gby5zbGljZSgpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgbiA9IG9baV07XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgYSA9IG4uY2FsbGJhY2suYXBwbHkodCwgW3JdKTtcbiAgICAgICAgICAgICAgICBpZiAoMSA9PT0gbi50eXBlICYmIHQucmVtb3ZlKGUsIG4uY2FsbGJhY2spLCAhMSA9PT0gYSkgYnJlYWs7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyB0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMuX19FdmVudHNMaXN0ID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHQucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGlmICh0W3JdLmNhbGxiYWNrID09PSBlKSByZXR1cm4gcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC0xO1xuICAgIH0sIHQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIGlmICh2b2lkIDAgPT09IHIgJiYgKHIgPSAwKSwgdGhpcykge1xuICAgICAgICB2YXIgbiA9IHRoaXMuX19FdmVudHNMaXN0W3RdO1xuXG4gICAgICAgIGlmIChuIHx8IChuID0gdGhpcy5fX0V2ZW50c0xpc3RbdF0gPSBbXSksIC0xID09PSB0aGlzLmluZGV4T2YobiwgZSkpIHtcbiAgICAgICAgICB2YXIgbyA9IHtcbiAgICAgICAgICAgIG5hbWU6IHQsXG4gICAgICAgICAgICB0eXBlOiByIHx8IDAsXG4gICAgICAgICAgICBjYWxsYmFjazogZVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIG4ucHVzaChvKSwgdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH0sIHQucHJvdG90eXBlLm9uZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0aGlzLm9uKHQsIGUsIDEpO1xuICAgIH0sIHQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICBpZiAodGhpcykge1xuICAgICAgICB2YXIgciA9IHRoaXMuX19FdmVudHNMaXN0W3RdO1xuICAgICAgICBpZiAoIXIpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICghZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fX0V2ZW50c0xpc3RbdF07XG4gICAgICAgICAgfSBjYXRjaCAodCkge31cblxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHIubGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIG4gPSB0aGlzLmluZGV4T2YociwgZSk7XG4gICAgICAgICAgci5zcGxpY2UobiwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9LCB0O1xuICB9KCk7XG5cbiAgZnVuY3Rpb24gaCh0LCBlKSB7XG4gICAgZm9yICh2YXIgciA9IHt9LCBuID0gMCwgbyA9IE9iamVjdC5rZXlzKHQpOyBuIDwgby5sZW5ndGg7IG4rKykge1xuICAgICAgdmFyIGkgPSBvW25dLFxuICAgICAgICAgIGEgPSB0W2ldO1xuICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIGEpIHJbZihpKV0gPSBmKGEpO2Vsc2Uge1xuICAgICAgICBpZiAoZSkgdGhyb3cgbmV3IEVycm9yKFwidmFsdWUgbWFzdCBiZSBzdHJpbmcgICEhISFcIik7XG4gICAgICAgIHJbZihTdHJpbmcoaSkpXSA9IGYoU3RyaW5nKGEpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGYodCkge1xuICAgIGlmIChcInN0cmluZ1wiICE9IHR5cGVvZiB0KSByZXR1cm4gdDtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdC5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcXFxcfFwiLCBcImdcIiksIFwiJTdDXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFwmXCIsIFwiZ1wiKSwgXCIlMjZcIikucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXD1cIiwgXCJnXCIpLCBcIiUzRFwiKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcXFxcK1wiLCBcImdcIiksIFwiJTJCXCIpO1xuICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHAodCkge1xuICAgIHJldHVybiBTdHJpbmcodC5BOTkpICsgU3RyaW5nKHQuQTEwMCk7XG4gIH1cblxuICB2YXIgZCA9IGZ1bmN0aW9uIGQoKSB7fTtcblxuICB2YXIgdiA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiB0KHQpIHtcbiAgICAgIHZhciByID0gdGhpcztcbiAgICAgIHRoaXMubGlmZUN5Y2xlID0gbmV3IGwoKSwgdGhpcy51cGxvYWRKb2JRdWV1ZSA9IFtdLCB0aGlzLmFkZGl0aW9uYWxQYXJhbXMgPSB7fSwgdGhpcy5kZWxheVRpbWUgPSAwLCB0aGlzLl9ub3JtYWxMb2dQaXBlbGluZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICghdCB8fCAhdC5yZWR1Y2UgfHwgIXQubGVuZ3RoKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY3JlYXRlUGlwZWxpbmUg5pa55rOV6ZyA6KaB5Lyg5YWl6Iez5bCR5pyJ5LiA5LiqIHBpcGUg55qE5pWw57uEXCIpO1xuICAgICAgICByZXR1cm4gMSA9PT0gdC5sZW5ndGggPyBmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICAgIHRbMF0oZSwgciB8fCBkKTtcbiAgICAgICAgfSA6IHQucmVkdWNlKGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyLCBuKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBuICYmIChuID0gZCksIHQociwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gZSA/IHZvaWQgMCA6IGUodCwgbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0oW2Z1bmN0aW9uICh0KSB7XG4gICAgICAgIHIuc2VuZCh7XG4gICAgICAgICAgdXJsOiByLnN0cmF0ZWd5LmdldFVwbG9hZFVybCgpLFxuICAgICAgICAgIGRhdGE6IHQsXG4gICAgICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgICAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLThcIlxuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGUgPSByLmNvbmZpZy5vblJlcG9ydFN1Y2Nlc3M7XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09IHR5cGVvZiBlICYmIGUoSlNPTi5zdHJpbmdpZnkodC5ldmVudHMpKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBlID0gci5jb25maWcub25SZXBvcnRGYWlsO1xuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZSAmJiBlKEpTT04uc3RyaW5naWZ5KHQuZXZlbnRzKSk7XG4gICAgICAgIH0pO1xuICAgICAgfV0pLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBpZiAoIXQpIHRocm93IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUgOiBuZXcgRXJyb3IoZSk7XG4gICAgICB9KEJvb2xlYW4odC5hcHBrZXkpLCBcImFwcGtleSBtdXN0IGJlIGluaXRpYWxcIiksIHRoaXMuY29uZmlnID0gX2Uoe30sIHQpO1xuICAgIH1cblxuICAgIHJldHVybiB0LnByb3RvdHlwZS5vblVzZXJBY3Rpb24gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdGhpcy5wcmVSZXBvcnQodCwgZSwgITEpO1xuICAgIH0sIHQucHJvdG90eXBlLm9uRGlyZWN0VXNlckFjdGlvbiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB0aGlzLnByZVJlcG9ydCh0LCBlLCAhMCk7XG4gICAgfSwgdC5wcm90b3R5cGUucHJlUmVwb3J0ID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHQgPyB0aGlzLnN0cmF0ZWd5LmlzRXZlbnRVcE9uT2ZmKCkgJiYgKHRoaXMuc3RyYXRlZ3kuaXNCbGFja0V2ZW50KHQpIHx8IHRoaXMuc3RyYXRlZ3kuaXNTYW1wbGVFdmVudCh0KSB8fCB0aGlzLm9uUmVwb3J0KHQsIGUsIHIpKSA6IHRoaXMuZXJyb3JSZXBvcnQucmVwb3J0RXJyb3IoXCI2MDJcIiwgXCIgbm8gZXZlbnRDb2RlXCIpO1xuICAgIH0sIHQucHJvdG90eXBlLmFkZEFkZGl0aW9uYWxQYXJhbXMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh2YXIgZSA9IDAsIHIgPSBPYmplY3Qua2V5cyh0KTsgZSA8IHIubGVuZ3RoOyBlKyspIHtcbiAgICAgICAgdmFyIG4gPSByW2VdO1xuICAgICAgICB0aGlzLmFkZGl0aW9uYWxQYXJhbXNbbl0gPSB0W25dO1xuICAgICAgfVxuICAgIH0sIHQucHJvdG90eXBlLnNldENoYW5uZWxJZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLmNvbW1vbkluZm8uY2hhbm5lbElEID0gU3RyaW5nKHQpO1xuICAgIH0sIHQucHJvdG90eXBlLnNldE9wZW5JZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0aGlzLmNvbW1vbkluZm8ub3BlbmlkID0gU3RyaW5nKHQpO1xuICAgIH0sIHQucHJvdG90eXBlLnNldFVuaW9uaWQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdGhpcy5jb21tb25JbmZvLnVuaWQgPSBTdHJpbmcodCk7XG4gICAgfSwgdC5wcm90b3R5cGUuZ2V0RGV2aWNlSWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21tb25JbmZvLmRldmljZUlkO1xuICAgIH0sIHQucHJvdG90eXBlLmdldENvbW1vbkluZm8gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21tb25JbmZvO1xuICAgIH0sIHQucHJvdG90eXBlLnJlbW92ZVNlbmRpbmdJZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZSA9IEpTT04ucGFyc2UodGhpcy5zdG9yYWdlLmdldEl0ZW0ocykpLFxuICAgICAgICAgICAgciA9IGUuaW5kZXhPZih0KTtcbiAgICAgICAgLTEgIT0gciAmJiAoZS5zcGxpY2UociwgMSksIHRoaXMuc3RvcmFnZS5zZXRJdGVtKHMsIEpTT04uc3RyaW5naWZ5KGUpKSk7XG4gICAgICB9IGNhdGNoICh0KSB7fVxuICAgIH0sIHQ7XG4gIH0oKSxcbiAgICAgIHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gdCh0LCBlLCByLCBuKSB7XG4gICAgICB0aGlzLnJlcXVlc3RQYXJhbXMgPSB7fSwgdGhpcy5uZXR3b3JrID0gbiwgdGhpcy5yZXF1ZXN0UGFyYW1zLmF0dGFpZCA9IFwiMDA0MDAwMTQxNDRcIiwgdGhpcy5yZXF1ZXN0UGFyYW1zLnRva2VuID0gXCI2NDc4MTU5OTM3XCIsIHRoaXMucmVxdWVzdFBhcmFtcy5wcm9kdWN0X2lkID0gdC5hcHBrZXksIHRoaXMucmVxdWVzdFBhcmFtcy5wbGF0Zm9ybSA9IHIsIHRoaXMucmVxdWVzdFBhcmFtcy51aW4gPSBlLmRldmljZUlkLCB0aGlzLnJlcXVlc3RQYXJhbXMubW9kZWwgPSBcIlwiLCB0aGlzLnJlcXVlc3RQYXJhbXMub3MgPSByLCB0aGlzLnJlcXVlc3RQYXJhbXMuYXBwX3ZlcnNpb24gPSB0LmFwcFZlcnNpb24sIHRoaXMucmVxdWVzdFBhcmFtcy5zZGtfdmVyc2lvbiA9IGUuc2RrVmVyc2lvbiwgdGhpcy5yZXF1ZXN0UGFyYW1zLmVycm9yX3N0YWNrID0gXCJcIiwgdGhpcy51cGxvYWRVcmwgPSB0LmlzT3ZlcnNlYSA/IFwiaHR0cHM6Ly9odHJhY2Uud2V0dmluZm8uY29tL2t2XCIgOiBcImh0dHBzOi8vaC50cmFjZS5xcS5jb20va3ZcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gdC5wcm90b3R5cGUucmVwb3J0RXJyb3IgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdGhpcy5yZXF1ZXN0UGFyYW1zLl9kYyA9IE1hdGgucmFuZG9tKCksIHRoaXMucmVxdWVzdFBhcmFtcy5lcnJvcl9tc2cgPSBlLCB0aGlzLnJlcXVlc3RQYXJhbXMuZXJyb3JfY29kZSA9IHQsIHRoaXMubmV0d29yay5nZXQodGhpcy51cGxvYWRVcmwsIHtcbiAgICAgICAgcGFyYW1zOiB0aGlzLnJlcXVlc3RQYXJhbXNcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICh0KSB7fSk7XG4gICAgfSwgdDtcbiAgfSgpLFxuICAgICAgZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiB0KHQsIGUsIHIsIG4pIHtcbiAgICAgIHRoaXMuc3RyYXRlZ3kgPSB7XG4gICAgICAgIGlzRXZlbnRVcE9uT2ZmOiAhMCxcbiAgICAgICAgaHR0cHNVcGxvYWRVcmw6IFwiaHR0cHM6Ly9vdGhldmUuYmVhY29uLnFxLmNvbS9hbmFseXRpY3MvdjJfdXBsb2FkXCIsXG4gICAgICAgIHJlcXVlc3RJbnRlcnZhbDogMzAsXG4gICAgICAgIGJsYWNrbGlzdDogW10sXG4gICAgICAgIHNhbXBsZWxpc3Q6IFtdXG4gICAgICB9LCB0aGlzLnJlYWxTYW1wbGUgPSB7fSwgdGhpcy5hcHBrZXkgPSBcIlwiLCB0aGlzLmFwcGtleSA9IHQuYXBwa2V5LCB0aGlzLnN0b3JhZ2UgPSByO1xuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbyA9IEpTT04ucGFyc2UodGhpcy5zdG9yYWdlLmdldEl0ZW0oYykpO1xuICAgICAgICBvICYmIHRoaXMucHJvY2Vzc0RhdGEobyk7XG4gICAgICB9IGNhdGNoICh0KSB7fVxuXG4gICAgICB0LmlzT3ZlcnNlYSAmJiAodGhpcy5zdHJhdGVneS5odHRwc1VwbG9hZFVybCA9IFwiaHR0cHM6Ly9zdmliZWFjb24ub25lemFwcC5jb20vYW5hbHl0aWNzL3YyX3VwbG9hZFwiKSwgIXQuaXNPdmVyc2VhICYmIHRoaXMubmVlZFJlcXVlc3RDb25maWcoKSAmJiB0aGlzLnJlcXVlc3RDb25maWcodC5hcHBWZXJzaW9uLCBlLCBuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdC5wcm90b3R5cGUucmVxdWVzdENvbmZpZyA9IGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICB2YXIgbiA9IHRoaXM7XG4gICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh1LCBEYXRlLm5vdygpLnRvU3RyaW5nKCkpLCByLnBvc3QoXCJodHRwczovL290aC5zdHIuYmVhY29uLnFxLmNvbS90cnBjLmJlYWNvbi5jb25maWdzZXJ2ZXIuQmVhY29uQ29uZmlnU2VydmljZS9RdWVyeUNvbmZpZ1wiLCB7XG4gICAgICAgIHBsYXRmb3JtSWQ6IFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIHd4ID8gXCIzXCIgOiBcIjRcIixcbiAgICAgICAgbWFpbkFwcEtleTogdGhpcy5hcHBrZXksXG4gICAgICAgIGFwcFZlcnNpb246IHQsXG4gICAgICAgIHNka1ZlcnNpb246IGUuc2RrVmVyc2lvbixcbiAgICAgICAgb3NWZXJzaW9uOiBlLnVzZXJBZ2VudCxcbiAgICAgICAgbW9kZWw6IFwiXCIsXG4gICAgICAgIHBhY2thZ2VOYW1lOiBcIlwiLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBBMzogZS5kZXZpY2VJZFxuICAgICAgICB9XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICgwID09IHQuZGF0YS5yZXQpIHRyeSB7XG4gICAgICAgICAgdmFyIGUgPSBKU09OLnBhcnNlKHQuZGF0YS5iZWFjb25Db25maWcpO1xuICAgICAgICAgIGUgJiYgKG4ucHJvY2Vzc0RhdGEoZSksIG4uc3RvcmFnZS5zZXRJdGVtKGMsIHQuZGF0YS5iZWFjb25Db25maWcpKTtcbiAgICAgICAgfSBjYXRjaCAodCkge30gZWxzZSBuLnByb2Nlc3NEYXRhKG51bGwpLCBuLnN0b3JhZ2Uuc2V0SXRlbShjLCBcIlwiKTtcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICh0KSB7fSk7XG4gICAgfSwgdC5wcm90b3R5cGUucHJvY2Vzc0RhdGEgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUsIHIsIG4sIG8sIGk7XG4gICAgICB0aGlzLnN0cmF0ZWd5LmlzRXZlbnRVcE9uT2ZmID0gbnVsbCAhPT0gKGUgPSBudWxsID09IHQgPyB2b2lkIDAgOiB0LmlzRXZlbnRVcE9uT2ZmKSAmJiB2b2lkIDAgIT09IGUgPyBlIDogdGhpcy5zdHJhdGVneS5pc0V2ZW50VXBPbk9mZiwgdGhpcy5zdHJhdGVneS5odHRwc1VwbG9hZFVybCA9IG51bGwgIT09IChyID0gbnVsbCA9PSB0ID8gdm9pZCAwIDogdC5odHRwc1VwbG9hZFVybCkgJiYgdm9pZCAwICE9PSByID8gciA6IHRoaXMuc3RyYXRlZ3kuaHR0cHNVcGxvYWRVcmwsIHRoaXMuc3RyYXRlZ3kucmVxdWVzdEludGVydmFsID0gbnVsbCAhPT0gKG4gPSBudWxsID09IHQgPyB2b2lkIDAgOiB0LnJlcXVlc3RJbnRlcnZhbCkgJiYgdm9pZCAwICE9PSBuID8gbiA6IHRoaXMuc3RyYXRlZ3kucmVxdWVzdEludGVydmFsLCB0aGlzLnN0cmF0ZWd5LmJsYWNrbGlzdCA9IG51bGwgIT09IChvID0gbnVsbCA9PSB0ID8gdm9pZCAwIDogdC5ibGFja2xpc3QpICYmIHZvaWQgMCAhPT0gbyA/IG8gOiB0aGlzLnN0cmF0ZWd5LmJsYWNrbGlzdCwgdGhpcy5zdHJhdGVneS5zYW1wbGVsaXN0ID0gbnVsbCAhPT0gKGkgPSBudWxsID09IHQgPyB2b2lkIDAgOiB0LnNhbXBsZWxpc3QpICYmIHZvaWQgMCAhPT0gaSA/IGkgOiB0aGlzLnN0cmF0ZWd5LnNhbXBsZWxpc3Q7XG5cbiAgICAgIGZvciAodmFyIGEgPSAwLCBzID0gdGhpcy5zdHJhdGVneS5zYW1wbGVsaXN0OyBhIDwgcy5sZW5ndGg7IGErKykge1xuICAgICAgICB2YXIgYyA9IHNbYV0uc3BsaXQoXCIsXCIpO1xuICAgICAgICAyID09IGMubGVuZ3RoICYmICh0aGlzLnJlYWxTYW1wbGVbY1swXV0gPSBjWzFdKTtcbiAgICAgIH1cbiAgICB9LCB0LnByb3RvdHlwZS5uZWVkUmVxdWVzdENvbmZpZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gTnVtYmVyKHRoaXMuc3RvcmFnZS5nZXRJdGVtKHUpKTtcbiAgICAgIHJldHVybiBEYXRlLm5vdygpIC0gdCA+IDYwICogdGhpcy5zdHJhdGVneS5yZXF1ZXN0SW50ZXJ2YWwgKiAxZTM7XG4gICAgfSwgdC5wcm90b3R5cGUuZ2V0VXBsb2FkVXJsID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RyYXRlZ3kuaHR0cHNVcGxvYWRVcmwgKyBcIj9hcHBrZXk9XCIgKyB0aGlzLmFwcGtleTtcbiAgICB9LCB0LnByb3RvdHlwZS5pc0JsYWNrRXZlbnQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIC0xICE9IHRoaXMuc3RyYXRlZ3kuYmxhY2tsaXN0LmluZGV4T2YodCk7XG4gICAgfSwgdC5wcm90b3R5cGUuaXNFdmVudFVwT25PZmYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJhdGVneS5pc0V2ZW50VXBPbk9mZjtcbiAgICB9LCB0LnByb3RvdHlwZS5pc1NhbXBsZUV2ZW50ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiAhIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLnJlYWxTYW1wbGUsIHQpICYmIHRoaXMucmVhbFNhbXBsZVt0XSA8IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE1hdGguZmxvb3IoMWU0KSk7XG4gICAgfSwgdDtcbiAgfSgpLFxuICAgICAgbSA9IFwic2Vzc2lvbl9zdG9yYWdlX2tleVwiLFxuICAgICAgdyA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiB0KHQsIGUsIHIpIHtcbiAgICAgIHRoaXMuYmVhY29uID0gciwgdGhpcy5zdG9yYWdlID0gdCwgdGhpcy5kdXJhdGlvbiA9IGUsIHRoaXMuYXBwa2V5ID0gci5jb25maWcuYXBwa2V5O1xuICAgIH1cblxuICAgIHJldHVybiB0LnByb3RvdHlwZS5nZXRTZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShtKTtcbiAgICAgIGlmICghdCkgcmV0dXJuIHRoaXMuY3JlYXRlU2Vzc2lvbigpO1xuICAgICAgdmFyIGUgPSBcIlwiLFxuICAgICAgICAgIHIgPSAwO1xuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbiA9IEpTT04ucGFyc2UodCkgfHwge1xuICAgICAgICAgIHNlc3Npb25JZDogdm9pZCAwLFxuICAgICAgICAgIHNlc3Npb25TdGFydDogdm9pZCAwXG4gICAgICAgIH07XG4gICAgICAgIGlmICghbi5zZXNzaW9uSWQgfHwgIW4uc2Vzc2lvblN0YXJ0KSByZXR1cm4gdGhpcy5jcmVhdGVTZXNzaW9uKCk7XG4gICAgICAgIHZhciBvID0gTnVtYmVyKHRoaXMuc3RvcmFnZS5nZXRJdGVtKGEpKTtcbiAgICAgICAgaWYgKERhdGUubm93KCkgLSBvID4gdGhpcy5kdXJhdGlvbikgcmV0dXJuIHRoaXMuY3JlYXRlU2Vzc2lvbigpO1xuICAgICAgICBlID0gbi5zZXNzaW9uSWQsIHIgPSBuLnNlc3Npb25TdGFydDtcbiAgICAgIH0gY2F0Y2ggKHQpIHt9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlc3Npb25JZDogZSxcbiAgICAgICAgc2Vzc2lvblN0YXJ0OiByXG4gICAgICB9O1xuICAgIH0sIHQucHJvdG90eXBlLmNyZWF0ZVNlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IERhdGUubm93KCksXG4gICAgICAgICAgZSA9IHtcbiAgICAgICAgc2Vzc2lvbklkOiB0aGlzLmFwcGtleSArIFwiX1wiICsgdC50b1N0cmluZygpLFxuICAgICAgICBzZXNzaW9uU3RhcnQ6IHRcbiAgICAgIH07XG4gICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShtLCBKU09OLnN0cmluZ2lmeShlKSksIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGEsIHQudG9TdHJpbmcoKSk7XG4gICAgICB2YXIgciA9IFwiaXNfbmV3X3VzZXJcIixcbiAgICAgICAgICBuID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0ocik7XG4gICAgICByZXR1cm4gdGhpcy5iZWFjb24ub25EaXJlY3RVc2VyQWN0aW9uKFwicnFkX2FwcGxhdW5jaGVkXCIsIHtcbiAgICAgICAgQTIxOiBuID8gXCJOXCIgOiBcIllcIlxuICAgICAgfSksIHRoaXMuc3RvcmFnZS5zZXRJdGVtKHIsIEpTT04uc3RyaW5naWZ5KCExKSksIGU7XG4gICAgfSwgdDtcbiAgfSgpO1xuXG4gIGZ1bmN0aW9uIGIoKSB7XG4gICAgdmFyIHQgPSBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgICAgICBlID0gdC5pbmRleE9mKFwiY29tcGF0aWJsZVwiKSA+IC0xICYmIHQuaW5kZXhPZihcIk1TSUVcIikgPiAtMSxcbiAgICAgICAgciA9IHQuaW5kZXhPZihcIkVkZ2VcIikgPiAtMSAmJiAhZSxcbiAgICAgICAgbiA9IHQuaW5kZXhPZihcIlRyaWRlbnRcIikgPiAtMSAmJiB0LmluZGV4T2YoXCJydjoxMS4wXCIpID4gLTE7XG5cbiAgICBpZiAoZSkge1xuICAgICAgbmV3IFJlZ0V4cChcIk1TSUUgKFxcXFxkK1xcXFwuXFxcXGQrKTtcIikudGVzdCh0KTtcbiAgICAgIHZhciBvID0gcGFyc2VGbG9hdChSZWdFeHAuJDEpO1xuICAgICAgcmV0dXJuIDcgPT0gbyA/IDcgOiA4ID09IG8gPyA4IDogOSA9PSBvID8gOSA6IDEwID09IG8gPyAxMCA6IDY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHIgPyAtMiA6IG4gPyAxMSA6IC0xO1xuICB9XG5cbiAgdmFyIF9TID0gZnVuY3Rpb24gUygpIHtcbiAgICByZXR1cm4gKF9TID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodCkge1xuICAgICAgZm9yICh2YXIgZSwgciA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgbjsgcisrKSB7XG4gICAgICAgIGZvciAodmFyIG8gaW4gZSA9IGFyZ3VtZW50c1tyXSkge1xuICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSAmJiAodFtvXSA9IGVbb10pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgdmFyIEUsXG4gICAgICBJID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIHQodCwgZSkge1xuICAgICAgdm9pZCAwID09PSBlICYmIChlID0ge30pLCB0aGlzLnJlcG9ydE9wdGlvbnMgPSB7fSwgdGhpcy5jb25maWcgPSB0LCB0aGlzLnJlcG9ydE9wdGlvbnMgPSBlO1xuICAgIH1cblxuICAgIHJldHVybiB0LmNhblVzZURCID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhKG51bGwgPT09IHdpbmRvdyB8fCB2b2lkIDAgPT09IHdpbmRvdyA/IHZvaWQgMCA6IHdpbmRvdy5pbmRleGVkREIpO1xuICAgIH0sIHQucHJvdG90eXBlLm9wZW5EQiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlID0gdGhpcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAociwgbikge1xuICAgICAgICBpZiAoIXQuY2FuVXNlREIoKSkgcmV0dXJuIG4oe1xuICAgICAgICAgIG1lc3NhZ2U6IFwi5b2T5YmN5LiN5pSv5oyBIGluZGV4ZWRkYlwiXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgbyA9IGUuY29uZmlnLFxuICAgICAgICAgICAgaSA9IG8ubmFtZSxcbiAgICAgICAgICAgIGEgPSBvLnZlcnNpb24sXG4gICAgICAgICAgICBzID0gby5zdG9yZXMsXG4gICAgICAgICAgICBjID0gaW5kZXhlZERCLm9wZW4oaSwgYSk7XG4gICAgICAgIGMub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGUuZGIgPSBjLnJlc3VsdCwgcigpLCBfUyh7XG4gICAgICAgICAgICByZXN1bHQ6IDEsXG4gICAgICAgICAgICBmdW5jOiBcIm9wZW5cIixcbiAgICAgICAgICAgIHBhcmFtczogSlNPTi5zdHJpbmdpZnkoZS5jb25maWcpXG4gICAgICAgICAgfSwgZS5yZXBvcnRPcHRpb25zKTtcbiAgICAgICAgfSwgYy5vbmVycm9yID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICB2YXIgciwgbztcbiAgICAgICAgICBuKHQpLCBfUyh7XG4gICAgICAgICAgICByZXN1bHQ6IDAsXG4gICAgICAgICAgICBmdW5jOiBcIm9wZW5cIixcbiAgICAgICAgICAgIHBhcmFtczogSlNPTi5zdHJpbmdpZnkoZS5jb25maWcpLFxuICAgICAgICAgICAgZXJyb3JfbXNnOiBudWxsID09PSAobyA9IG51bGwgPT09IChyID0gdC50YXJnZXQpIHx8IHZvaWQgMCA9PT0gciA/IHZvaWQgMCA6IHIuZXJyb3IpIHx8IHZvaWQgMCA9PT0gbyA/IHZvaWQgMCA6IG8ubWVzc2FnZVxuICAgICAgICAgIH0sIGUucmVwb3J0T3B0aW9ucyk7XG4gICAgICAgIH0sIGMub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGUuZGIgPSBjLnJlc3VsdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBudWxsID09IHMgfHwgcy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIGUuY3JlYXRlU3RvcmUodCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBfUyh7XG4gICAgICAgICAgICAgIHJlc3VsdDogMCxcbiAgICAgICAgICAgICAgZnVuYzogXCJvcGVuXCIsXG4gICAgICAgICAgICAgIHBhcmFtczogSlNPTi5zdHJpbmdpZnkoZS5jb25maWcpLFxuICAgICAgICAgICAgICBlcnJvcl9tc2c6IHQubWVzc2FnZVxuICAgICAgICAgICAgfSwgZS5yZXBvcnRPcHRpb25zKSwgbih0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9LCB0LnByb3RvdHlwZS51c2VTdG9yZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5zdG9yZU5hbWUgPSB0LCB0aGlzO1xuICAgIH0sIHQucHJvdG90eXBlLmRlbGV0ZURCID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMuY2xvc2VEQigpLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICB2YXIgbiA9IGluZGV4ZWREQi5kZWxldGVEYXRhYmFzZSh0LmNvbmZpZy5uYW1lKTtcbiAgICAgICAgbi5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGUoKTtcbiAgICAgICAgfSwgbi5vbmVycm9yID0gcjtcbiAgICAgIH0pO1xuICAgIH0sIHQucHJvdG90eXBlLmNsb3NlREIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdDtcbiAgICAgIG51bGwgPT09ICh0ID0gdGhpcy5kYikgfHwgdm9pZCAwID09PSB0IHx8IHQuY2xvc2UoKSwgdGhpcy5kYiA9IG51bGw7XG4gICAgfSwgdC5wcm90b3R5cGUuZ2V0U3RvcmVDb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gdGhpcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICB2YXIgbiA9IHQuZ2V0U3RvcmUoXCJyZWFkb25seVwiKS5jb3VudCgpO1xuICAgICAgICBuLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZShuLnJlc3VsdCk7XG4gICAgICAgIH0sIG4ub25lcnJvciA9IHI7XG4gICAgICB9KTtcbiAgICB9LCB0LnByb3RvdHlwZS5jbGVhclN0b3JlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChlLCByKSB7XG4gICAgICAgIHZhciBuID0gdC5nZXRTdG9yZShcInJlYWR3cml0ZVwiKS5jbGVhcigpO1xuICAgICAgICBuLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZSgpO1xuICAgICAgICB9LCBuLm9uZXJyb3IgPSByO1xuICAgICAgfSk7XG4gICAgfSwgdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gdGhpcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAobiwgbykge1xuICAgICAgICB2YXIgaSA9IHIuZ2V0U3RvcmUoXCJyZWFkd3JpdGVcIikuYWRkKHQsIGUpO1xuICAgICAgICBpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBuKGkucmVzdWx0KTtcbiAgICAgICAgfSwgaS5vbmVycm9yID0gbztcbiAgICAgIH0pO1xuICAgIH0sIHQucHJvdG90eXBlLnB1dCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IHRoaXM7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKG4sIG8pIHtcbiAgICAgICAgdmFyIGkgPSByLmdldFN0b3JlKFwicmVhZHdyaXRlXCIpLnB1dCh0LCBlKTtcbiAgICAgICAgaS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbihpLnJlc3VsdCk7XG4gICAgICAgIH0sIGkub25lcnJvciA9IG87XG4gICAgICB9KTtcbiAgICB9LCB0LnByb3RvdHlwZS5nZXRTdG9yZUFsbERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IHRoaXM7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGUsIHIpIHtcbiAgICAgICAgdmFyIG4gPSB0LmdldFN0b3JlKFwicmVhZG9ubHlcIikub3BlbkN1cnNvcigpLFxuICAgICAgICAgICAgbyA9IFtdO1xuICAgICAgICBuLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdDtcblxuICAgICAgICAgIGlmIChudWxsID09PSAodCA9IG4ucmVzdWx0KSB8fCB2b2lkIDAgPT09IHQgPyB2b2lkIDAgOiB0LnZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgciA9IG4ucmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgby5wdXNoKHIpLCBuLnJlc3VsdC5jb250aW51ZSgpO1xuICAgICAgICAgIH0gZWxzZSBlKG8pO1xuICAgICAgICB9LCBuLm9uZXJyb3IgPSByO1xuICAgICAgfSk7XG4gICAgfSwgdC5wcm90b3R5cGUuZ2V0RGF0YVJhbmdlQnlJbmRleCA9IGZ1bmN0aW9uICh0LCBlLCByLCBuLCBvKSB7XG4gICAgICB2YXIgaSA9IHRoaXM7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIHMpIHtcbiAgICAgICAgdmFyIGMgPSBpLmdldFN0b3JlKCkuaW5kZXgodCksXG4gICAgICAgICAgICB1ID0gSURCS2V5UmFuZ2UuYm91bmQoZSwgciwgbiwgbyksXG4gICAgICAgICAgICBsID0gW10sXG4gICAgICAgICAgICBoID0gYy5vcGVuQ3Vyc29yKHUpO1xuICAgICAgICBoLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdDtcbiAgICAgICAgICAobnVsbCA9PT0gKHQgPSBudWxsID09IGggPyB2b2lkIDAgOiBoLnJlc3VsdCkgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC52YWx1ZSkgPyAobC5wdXNoKG51bGwgPT0gaCA/IHZvaWQgMCA6IGgucmVzdWx0LnZhbHVlKSwgbnVsbCA9PSBoIHx8IGgucmVzdWx0LmNvbnRpbnVlKCkpIDogYShsKTtcbiAgICAgICAgfSwgaC5vbmVycm9yID0gcztcbiAgICAgIH0pO1xuICAgIH0sIHQucHJvdG90eXBlLnJlbW92ZURhdGFCeUluZGV4ID0gZnVuY3Rpb24gKHQsIGUsIHIsIG4sIG8pIHtcbiAgICAgIHZhciBpID0gdGhpcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgcykge1xuICAgICAgICB2YXIgYyA9IGkuZ2V0U3RvcmUoXCJyZWFkd3JpdGVcIikuaW5kZXgodCksXG4gICAgICAgICAgICB1ID0gSURCS2V5UmFuZ2UuYm91bmQoZSwgciwgbiwgbyksXG4gICAgICAgICAgICBsID0gYy5vcGVuQ3Vyc29yKHUpLFxuICAgICAgICAgICAgaCA9IDA7XG4gICAgICAgIGwub25zdWNjZXNzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICB2YXIgZSA9IHQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICBlID8gKGggKz0gMSwgZS5kZWxldGUoKSwgZS5jb250aW51ZSgpKSA6IGEoaCk7XG4gICAgICAgIH0sIGwub25lcnJvciA9IHM7XG4gICAgICB9KTtcbiAgICB9LCB0LnByb3RvdHlwZS5jcmVhdGVTdG9yZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZSA9IHQubmFtZSxcbiAgICAgICAgICByID0gdC5pbmRleGVzLFxuICAgICAgICAgIG4gPSB2b2lkIDAgPT09IHIgPyBbXSA6IHIsXG4gICAgICAgICAgbyA9IHQub3B0aW9ucztcblxuICAgICAgaWYgKHRoaXMuZGIpIHtcbiAgICAgICAgdGhpcy5kYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGUpICYmIHRoaXMuZGIuZGVsZXRlT2JqZWN0U3RvcmUoZSk7XG4gICAgICAgIHZhciBpID0gdGhpcy5kYi5jcmVhdGVPYmplY3RTdG9yZShlLCBvKTtcbiAgICAgICAgbi5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgaS5jcmVhdGVJbmRleCh0LmluZGV4TmFtZSwgdC5rZXlQYXRoLCB0Lm9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCB0LnByb3RvdHlwZS5nZXRTdG9yZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgZTtcbiAgICAgIHJldHVybiB2b2lkIDAgPT09IHQgJiYgKHQgPSBcInJlYWRvbmx5XCIpLCBudWxsID09PSAoZSA9IHRoaXMuZGIpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUudHJhbnNhY3Rpb24odGhpcy5zdG9yZU5hbWUsIHQpLm9iamVjdFN0b3JlKHRoaXMuc3RvcmVOYW1lKTtcbiAgICB9LCB0O1xuICB9KCksXG4gICAgICBPID0gXCJldmVudF90YWJsZV92M1wiLFxuICAgICAgayA9IFwiZXZlbnRJZFwiLFxuICAgICAgeCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiB0KHQpIHtcbiAgICAgIHRoaXMuaXNSZWFkeSA9ICExLCB0aGlzLnRhc2tRdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpLCB0aGlzLmRiID0gbmV3IEkoe1xuICAgICAgICBuYW1lOiBcIkJlYWNvbl9cIiArIHQgKyBcIl9WM1wiLFxuICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICBzdG9yZXM6IFt7XG4gICAgICAgICAgbmFtZTogTyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBrZXlQYXRoOiBrXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbmRleGVzOiBbe1xuICAgICAgICAgICAgaW5kZXhOYW1lOiBrLFxuICAgICAgICAgICAga2V5UGF0aDogayxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgdW5pcXVlOiAhMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1dXG4gICAgICAgIH1dXG4gICAgICB9KSwgdGhpcy5vcGVuKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHQucHJvdG90eXBlLmdldENvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMucmVhZHlFeGVjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHQuZGIuZ2V0U3RvcmVDb3VudCgpO1xuICAgICAgfSk7XG4gICAgfSwgdC5wcm90b3R5cGUuc2V0SXRlbSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IHRoaXM7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkeUV4ZWMoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gci5kYi5hZGQoe1xuICAgICAgICAgIGV2ZW50SWQ6IHQsXG4gICAgICAgICAgdmFsdWU6IGVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCB0LnByb3RvdHlwZS5nZXRJdGVtID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiByKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG4odGhpcywgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICByZXR1cm4gWzIsIHRoaXMucmVhZHlFeGVjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBlLmRiLmdldERhdGFSYW5nZUJ5SW5kZXgoaywgdCwgdCk7XG4gICAgICAgICAgfSldO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIHQucHJvdG90eXBlLnJlbW92ZUl0ZW0gPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMucmVhZHlFeGVjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGUuZGIucmVtb3ZlRGF0YUJ5SW5kZXgoaywgdCwgdCk7XG4gICAgICB9KTtcbiAgICB9LCB0LnByb3RvdHlwZS51cGRhdGVJdGVtID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZhciByID0gdGhpcztcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5RXhlYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiByLmRiLnB1dCh7XG4gICAgICAgICAgZXZlbnRJZDogdCxcbiAgICAgICAgICB2YWx1ZTogZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIHQucHJvdG90eXBlLml0ZXJhdGUgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMucmVhZHlFeGVjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGUuZGIuZ2V0U3RvcmVBbGxEYXRhKCkudGhlbihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGUuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdChlLnZhbHVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCB0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbih0aGlzLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHN3aXRjaCAoZS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50YXNrUXVldWUgPSB0aGlzLnRhc2tRdWV1ZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5kYi5vcGVuREIoKTtcbiAgICAgICAgICAgICAgfSksIFs0LCB0aGlzLnRhc2tRdWV1ZV07XG5cbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2VudCgpLCB0aGlzLmlzUmVhZHkgPSAhMCwgdGhpcy5kYi51c2VTdG9yZShPKSwgWzJdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCB0LnByb3RvdHlwZS5yZWFkeUV4ZWMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNSZWFkeSA/IHQoKSA6ICh0aGlzLnRhc2tRdWV1ZSA9IHRoaXMudGFza1F1ZXVlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdCgpO1xuICAgICAgfSksIHRoaXMudGFza1F1ZXVlKTtcbiAgICB9LCB0O1xuICB9KCksXG4gICAgICBDID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIHQodCkge1xuICAgICAgdGhpcy5rZXlPYmplY3QgPSB7fSwgdGhpcy5zdG9yYWdlID0gdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdC5wcm90b3R5cGUuZ2V0Q291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldFN0b3JlQ291bnQoKTtcbiAgICB9LCB0LnByb3RvdHlwZS5yZW1vdmVJdGVtID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKHQpLCBkZWxldGUgdGhpcy5rZXlPYmplY3RbdF07XG4gICAgfSwgdC5wcm90b3R5cGUuc2V0SXRlbSA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICB2YXIgciA9IEpTT04uc3RyaW5naWZ5KGUpO1xuICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0odCwgciksIHRoaXMua2V5T2JqZWN0W3RdID0gZTtcbiAgICB9LCB0LnByb3RvdHlwZS5pdGVyYXRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodmFyIGUgPSBPYmplY3Qua2V5cyh0aGlzLmtleU9iamVjdCksIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykge1xuICAgICAgICB2YXIgbiA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGVbcl0pO1xuICAgICAgICB0KEpTT04ucGFyc2UobikpO1xuICAgICAgfVxuICAgIH0sIHQ7XG4gIH0oKSxcbiAgICAgIF8gPSBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gdCh0LCBlKSB7XG4gICAgICB2YXIgciA9IHRoaXM7XG4gICAgICB0aGlzLmRiRXZlbnRDb3VudCA9IDAsIGIoKSA+IDAgfHwgIXdpbmRvdy5pbmRleGVkREIgfHwgL1g1TGl0ZS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA/ICh0aGlzLnN0b3JlID0gbmV3IEMoZSksIHRoaXMuZGJFdmVudENvdW50ID0gdGhpcy5zdG9yZS5nZXRDb3VudCgpKSA6ICh0aGlzLnN0b3JlID0gbmV3IHgodCksIHRoaXMuZ2V0Q291bnQoKS50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHIuZGJFdmVudENvdW50ID0gdDtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdC5wcm90b3R5cGUuZ2V0Q291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbih0aGlzLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHN3aXRjaCAodC5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gdC50cnlzLnB1c2goWzAsIDIsLCAzXSksIFs0LCB0aGlzLnN0b3JlLmdldENvdW50KCldO1xuXG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIHJldHVybiBbMiwgdC5zZW50KCldO1xuXG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgIHJldHVybiB0LnNlbnQoKSwgWzIsIFByb21pc2UucmVqZWN0KCldO1xuXG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIHJldHVybiBbMl07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIHQucHJvdG90eXBlLmluc2VydEV2ZW50ID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHJldHVybiByKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByLCBvO1xuICAgICAgICByZXR1cm4gbih0aGlzLCBmdW5jdGlvbiAobikge1xuICAgICAgICAgIHN3aXRjaCAobi5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBpZiAodGhpcy5kYkV2ZW50Q291bnQgPj0gMWU0KSByZXR1cm4gWzIsIFByb21pc2UucmVqZWN0KCldO1xuICAgICAgICAgICAgICByID0gcCh0Lm1hcFZhbHVlKSwgbi5sYWJlbCA9IDE7XG5cbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgcmV0dXJuIG4udHJ5cy5wdXNoKFsxLCAzLCwgNF0pLCB0aGlzLmRiRXZlbnRDb3VudCsrLCBbNCwgdGhpcy5zdG9yZS5zZXRJdGVtKHIsIHQpXTtcblxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICByZXR1cm4gWzIsIG4uc2VudCgpXTtcblxuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICByZXR1cm4gbyA9IG4uc2VudCgpLCBlICYmIGUobywgdCksIHRoaXMuZGJFdmVudENvdW50LS0sIFsyLCBQcm9taXNlLnJlamVjdCgpXTtcblxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICByZXR1cm4gWzJdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCB0LnByb3RvdHlwZS5nZXRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdDtcbiAgICAgICAgcmV0dXJuIG4odGhpcywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBzd2l0Y2ggKGUubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgdCA9IFtdLCBlLmxhYmVsID0gMTtcblxuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICByZXR1cm4gZS50cnlzLnB1c2goWzEsIDMsLCA0XSksIFs0LCB0aGlzLnN0b3JlLml0ZXJhdGUoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICB0LnB1c2goZSk7XG4gICAgICAgICAgICAgIH0pXTtcblxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICByZXR1cm4gZS5zZW50KCksIFsyLCBQcm9taXNlLmFsbCh0KV07XG5cbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2VudCgpLCBbMiwgUHJvbWlzZS5hbGwodCldO1xuXG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIHJldHVybiBbMl07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIHQucHJvdG90eXBlLnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiByKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlO1xuICAgICAgICByZXR1cm4gbih0aGlzLCBmdW5jdGlvbiAocikge1xuICAgICAgICAgIHN3aXRjaCAoci5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBlID0gcCh0Lm1hcFZhbHVlKSwgci5sYWJlbCA9IDE7XG5cbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgcmV0dXJuIHIudHJ5cy5wdXNoKFsxLCAzLCwgNF0pLCB0aGlzLmRiRXZlbnRDb3VudC0tLCBbNCwgdGhpcy5zdG9yZS5yZW1vdmVJdGVtKGUpXTtcblxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICByZXR1cm4gWzIsIHIuc2VudCgpXTtcblxuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICByZXR1cm4gci5zZW50KCksIHRoaXMuZGJFdmVudENvdW50KyssIFsyLCBQcm9taXNlLnJlamVjdCgpXTtcblxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICByZXR1cm4gWzJdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCB0O1xuICB9KCksXG4gICAgICBfQSA9IGZ1bmN0aW9uIEEoKSB7XG4gICAgcmV0dXJuIChfQSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIGZvciAodmFyIGUsIHIgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IG47IHIrKykge1xuICAgICAgICBmb3IgKHZhciBvIGluIGUgPSBhcmd1bWVudHNbcl0pIHtcbiAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykgJiYgKHRbb10gPSBlW29dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdDtcbiAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIFAodCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHQucmVwbGFjZSgvXFwrL2csIFwiIFwiKSk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaih0LCBlKSB7XG4gICAgdmFyIHIgPSBbbnVsbCwgdm9pZCAwLCBcIlwiLCBOYU5dLmluY2x1ZGVzKHQpO1xuICAgIGlmIChlLmlzU2tpcEVtcHR5ICYmIHIpIHJldHVybiBudWxsO1xuICAgIHZhciBuID0gIWUuaXNTa2lwRW1wdHkgJiYgciA/IFwiXCIgOiB0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBlLmVuY29kZSA/IGVuY29kZVVSSUNvbXBvbmVudChuKSA6IG47XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gRCh0KSB7XG4gICAgdmFyIGUgPSB0LnNwbGl0KFwiI1wiKSxcbiAgICAgICAgciA9IGVbMF0sXG4gICAgICAgIG4gPSBlWzFdLFxuICAgICAgICBvID0gdm9pZCAwID09PSBuID8gXCJcIiA6IG4sXG4gICAgICAgIGkgPSByLnNwbGl0KFwiP1wiKSxcbiAgICAgICAgYSA9IGlbMF0sXG4gICAgICAgIHMgPSBpWzFdLFxuICAgICAgICBjID0gdm9pZCAwID09PSBzID8gXCJcIiA6IHMsXG4gICAgICAgIHUgPSBQKG8pLFxuICAgICAgICBsID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICByZXR1cm4gYy5zcGxpdChcIiZcIikuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0LnNwbGl0KFwiPVwiKSxcbiAgICAgICAgICByID0gZVswXSxcbiAgICAgICAgICBuID0gZVsxXSxcbiAgICAgICAgICBvID0gdm9pZCAwID09PSBuID8gXCJcIiA6IG4sXG4gICAgICAgICAgaSA9IFAociksXG4gICAgICAgICAgYSA9IFAobyk7XG4gICAgICBudWxsID09PSBpIHx8IG51bGwgPT09IGEgfHwgXCJcIiA9PT0gaSAmJiBcIlwiID09PSBhIHx8IGxbaV0gfHwgKGxbaV0gPSBhKTtcbiAgICB9KSwge1xuICAgICAgdXJsOiBhLFxuICAgICAgcXVlcnk6IGwsXG4gICAgICBoYXNoOiB1XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIFQodCwgZSkge1xuICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IHtcbiAgICAgIGVuY29kZTogITAsXG4gICAgICBpc1NraXBFbXB0eTogITFcbiAgICB9KTtcblxuICAgIHZhciByID0gdC51cmwsXG4gICAgICAgIG4gPSB0LnF1ZXJ5LFxuICAgICAgICBvID0gdm9pZCAwID09PSBuID8ge30gOiBuLFxuICAgICAgICBpID0gdC5oYXNoLFxuICAgICAgICBhID0gci5zcGxpdChcIiNcIiksXG4gICAgICAgIHMgPSBhWzBdLFxuICAgICAgICBjID0gYVsxXSxcbiAgICAgICAgdSA9IHZvaWQgMCA9PT0gYyA/IFwiXCIgOiBjLFxuICAgICAgICBsID0gcy5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgIGggPSBbXSxcbiAgICAgICAgZiA9IGooaSB8fCB1LCBlKSxcbiAgICAgICAgcCA9IF9BKF9BKHt9LCBEKHIpLnF1ZXJ5KSwgbyk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocCkuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIHIgPSBqKHQsIGUpLFxuICAgICAgICAgIG4gPSBqKHBbdF0sIGUpO1xuICAgICAgbnVsbCAhPT0gciAmJiBudWxsICE9PSBuICYmIGgucHVzaChyICsgXCI9XCIgKyBuKTtcbiAgICB9KSwgbCArIChoLmxlbmd0aCA/IFwiP1wiICsgaC5qb2luKFwiJlwiKSA6IFwiXCIpICsgKGYgPyBcIiNcIiArIGYgOiBcIlwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIE4odCwgZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAociwgbikge1xuICAgICAgaWYgKGUgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcInNjcmlwdFtkYXRhLXRhZz1cIiArIGUgKyBcIl1cIikubGVuZ3RoKSByZXR1cm4gcigpO1xuXG4gICAgICB2YXIgbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIiksXG4gICAgICAgICAgaSA9IF9BKHtcbiAgICAgICAgdHlwZTogXCJ0ZXh0L2phdmFzY3JpcHRcIixcbiAgICAgICAgY2hhcnNldDogXCJ1dGYtOFwiXG4gICAgICB9LCB0KTtcblxuICAgICAgT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgICBpZiAodCkgcmV0dXJuIHZvaWQgMCA9PT0gciA/IHQuZ2V0QXR0cmlidXRlKGUpIDogdC5zZXRBdHRyaWJ1dGUoZSwgcik7XG4gICAgICAgIH0obywgdCwgaVt0XSk7XG4gICAgICB9KSwgZSAmJiAoby5kYXRhc2V0LnRhZyA9IGUpLCBvLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHIoKTtcbiAgICAgIH0sIG8ub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdCA9IG8ucmVhZHlTdGF0ZTtcbiAgICAgICAgW1wiY29tcGxldGVcIiwgXCJsb2FkZWRcIl0uaW5jbHVkZXModCkgJiYgKG8ub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbCwgcigpKTtcbiAgICAgIH0sIG8ub25lcnJvciA9IG4sIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobyk7XG4gICAgfSk7XG4gIH1cblxuICAhZnVuY3Rpb24gKHQpIHtcbiAgICB0W3QuZXF1YWwgPSAwXSA9IFwiZXF1YWxcIiwgdFt0LmxvdyA9IC0xXSA9IFwibG93XCIsIHRbdC5oaWdoID0gMV0gPSBcImhpZ2hcIjtcbiAgfShFIHx8IChFID0ge30pKTtcblxuICB2YXIgX1UgPSBmdW5jdGlvbiBVKCkge1xuICAgIHJldHVybiAoX1UgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0KSB7XG4gICAgICBmb3IgKHZhciBlLCByID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBuOyByKyspIHtcbiAgICAgICAgZm9yICh2YXIgbyBpbiBlID0gYXJndW1lbnRzW3JdKSB7XG4gICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG8pICYmICh0W29dID0gZVtvXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQ7XG4gICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcblxuICBmdW5jdGlvbiBxKHQsIGUsIHIsIG4pIHtcbiAgICByZXR1cm4gbmV3IChyIHx8IChyID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChvLCBpKSB7XG4gICAgICBmdW5jdGlvbiBhKHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjKG4ubmV4dCh0KSk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICBpKHQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHModCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGMobi50aHJvdyh0KSk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICBpKHQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGModCkge1xuICAgICAgICB2YXIgZTtcbiAgICAgICAgdC5kb25lID8gbyh0LnZhbHVlKSA6IChlID0gdC52YWx1ZSwgZSBpbnN0YW5jZW9mIHIgPyBlIDogbmV3IHIoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICB0KGUpO1xuICAgICAgICB9KSkudGhlbihhLCBzKTtcbiAgICAgIH1cblxuICAgICAgYygobiA9IG4uYXBwbHkodCwgZSB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBSKHQsIGUpIHtcbiAgICB2YXIgcixcbiAgICAgICAgbixcbiAgICAgICAgbyxcbiAgICAgICAgaSxcbiAgICAgICAgYSA9IHtcbiAgICAgIGxhYmVsOiAwLFxuICAgICAgc2VudDogZnVuY3Rpb24gc2VudCgpIHtcbiAgICAgICAgaWYgKDEgJiBvWzBdKSB0aHJvdyBvWzFdO1xuICAgICAgICByZXR1cm4gb1sxXTtcbiAgICAgIH0sXG4gICAgICB0cnlzOiBbXSxcbiAgICAgIG9wczogW11cbiAgICB9O1xuICAgIHJldHVybiBpID0ge1xuICAgICAgbmV4dDogcygwKSxcbiAgICAgIHRocm93OiBzKDEpLFxuICAgICAgcmV0dXJuOiBzKDIpXG4gICAgfSwgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgKGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0pLCBpO1xuXG4gICAgZnVuY3Rpb24gcyhpKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgaWYgKHIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuXG4gICAgICAgICAgZm9yICg7IGE7KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAociA9IDEsIG4gJiYgKG8gPSAyICYgaVswXSA/IG4ucmV0dXJuIDogaVswXSA/IG4udGhyb3cgfHwgKChvID0gbi5yZXR1cm4pICYmIG8uY2FsbChuKSwgMCkgOiBuLm5leHQpICYmICEobyA9IG8uY2FsbChuLCBpWzFdKSkuZG9uZSkgcmV0dXJuIG87XG5cbiAgICAgICAgICAgICAgc3dpdGNoIChuID0gMCwgbyAmJiAoaSA9IFsyICYgaVswXSwgby52YWx1ZV0pLCBpWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgIG8gPSBpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYS5sYWJlbCsrLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpWzFdLFxuICAgICAgICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgIGEubGFiZWwrKywgbiA9IGlbMV0sIGkgPSBbMF07XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgIGkgPSBhLm9wcy5wb3AoKSwgYS50cnlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEoKG8gPSAobyA9IGEudHJ5cykubGVuZ3RoID4gMCAmJiBvW28ubGVuZ3RoIC0gMV0pIHx8IDYgIT09IGlbMF0gJiYgMiAhPT0gaVswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBpZiAoMyA9PT0gaVswXSAmJiAoIW8gfHwgaVsxXSA+IG9bMF0gJiYgaVsxXSA8IG9bM10pKSB7XG4gICAgICAgICAgICAgICAgICAgIGEubGFiZWwgPSBpWzFdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgaWYgKDYgPT09IGlbMF0gJiYgYS5sYWJlbCA8IG9bMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgYS5sYWJlbCA9IG9bMV0sIG8gPSBpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgaWYgKG8gJiYgYS5sYWJlbCA8IG9bMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgYS5sYWJlbCA9IG9bMl0sIGEub3BzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBvWzJdICYmIGEub3BzLnBvcCgpLCBhLnRyeXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGkgPSBlLmNhbGwodCwgYSk7XG4gICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgIGkgPSBbNiwgdF0sIG4gPSAwO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgciA9IG8gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICg1ICYgaVswXSkgdGhyb3cgaVsxXTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IGlbMF0gPyBpWzFdIDogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICB9O1xuICAgICAgICB9KFtpLCBzXSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBMID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIHQoKSB7XG4gICAgICB0aGlzLmludGVyY2VwdG9ycyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiB0LnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJjZXB0b3JzLnB1c2goe1xuICAgICAgICByZXNvbHZlZDogdCxcbiAgICAgICAgcmVqZWN0ZWQ6IGVcbiAgICAgIH0pLCB0aGlzLmludGVyY2VwdG9ycy5sZW5ndGggLSAxO1xuICAgIH0sIHQucHJvdG90eXBlLnRyYXZlcnNlID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9ICExKTtcbiAgICAgIHZhciByID0gUHJvbWlzZS5yZXNvbHZlKHQpO1xuICAgICAgcmV0dXJuIChlID8gQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0IDogQXJyYXkucHJvdG90eXBlLnJlZHVjZSkuY2FsbCh0aGlzLmludGVyY2VwdG9ycywgZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICB2YXIgbiA9IGUucmVzb2x2ZWQsXG4gICAgICAgICAgICAgIG8gPSBlLnJlamVjdGVkO1xuICAgICAgICAgIHIgPSByLnRoZW4obiwgbyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH0sIFwiXCIpLCByO1xuICAgIH0sIHQucHJvdG90eXBlLmVqZWN0ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRoaXMuaW50ZXJjZXB0b3JzW3RdICYmICh0aGlzLmludGVyY2VwdG9yc1t0XSA9IG51bGwpO1xuICAgIH0sIHQ7XG4gIH0oKSxcbiAgICAgIEIgPSB7XG4gICAgZGVmYXVsdHM6IHtcbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBtb2RlOiBcImNvcnNcIixcbiAgICAgIHJlZGlyZWN0OiBcImZvbGxvd1wiLFxuICAgICAgY3JlZGVudGlhbHM6IFwic2FtZS1vcmlnaW5cIlxuICAgIH0sXG4gICAgaGVhZGVyczoge1xuICAgICAgY29tbW9uOiB7XG4gICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLypcIlxuICAgICAgfSxcbiAgICAgIFBPU1Q6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIlxuICAgICAgfSxcbiAgICAgIFBVVDoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiXG4gICAgICB9LFxuICAgICAgUEFUQ0g6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIlxuICAgICAgfVxuICAgIH0sXG4gICAgYmFzZVVSTDogXCJcIixcbiAgICBwb2x5ZmlsbFVybDogXCJodHRwczovL3ZtLmd0aW1nLmNuL2NvbXBzL3NjcmlwdC9mZXRjaC5taW4uanNcIixcbiAgICBpbnRlcmNlcHRvcnM6IHtcbiAgICAgIHJlcXVlc3Q6IG5ldyBMKCksXG4gICAgICByZXNwb25zZTogbmV3IEwoKVxuICAgIH1cbiAgfSxcbiAgICAgIEogPSAvXihbYS16XVthLXpcXGQrXFwtLl0qOik/XFwvXFwvL2ksXG4gICAgICBNID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuICBmdW5jdGlvbiBWKHQpIHtcbiAgICByZXR1cm4gcSh0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGU7XG4gICAgICByZXR1cm4gUih0aGlzLCBmdW5jdGlvbiAocikge1xuICAgICAgICBzd2l0Y2ggKHIubGFiZWwpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBpZiAod2luZG93LmZldGNoKSByZXR1cm4gWzJdO1xuICAgICAgICAgICAgci5sYWJlbCA9IDE7XG5cbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gci50cnlzLnB1c2goWzEsIDMsLCA0XSksIFs0LCBOKHtcbiAgICAgICAgICAgICAgc3JjOiB0XG4gICAgICAgICAgICB9KV07XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gci5zZW50KCksIFszLCA0XTtcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHRocm93IGUgPSByLnNlbnQoKSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIEltYWdlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgSW1hZ2UoMSwgMSksXG4gICAgICAgICAgICAgICAgICAgIHIgPSBfVSh7XG4gICAgICAgICAgICAgICAgICBhdHRhaWQ6IFwiMGY0MDAwNTMxMzBcIixcbiAgICAgICAgICAgICAgICAgIHRva2VuOiBcIjY1NTIzNzQ0NDJcIixcbiAgICAgICAgICAgICAgICAgIGNvbXBzOiBcIkB0ZW5jZW50L292Yi1yZXF1ZXN0XCIsXG4gICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBcIjEuMS4xOFwiLFxuICAgICAgICAgICAgICAgICAgdWE6IG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgICAgICAgICAgICAgICB1cmw6IGxvY2F0aW9uLmhyZWYsXG4gICAgICAgICAgICAgICAgICBfZGM6IE1hdGgucmFuZG9tKClcbiAgICAgICAgICAgICAgICB9LCB0KSxcbiAgICAgICAgICAgICAgICAgICAgbiA9IE9iamVjdC5rZXlzKHIpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChyW3RdKTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKFwiJlwiKTtcblxuICAgICAgICAgICAgICAgIGUuc3JjID0gXCJodHRwczovL2gudHJhY2UucXEuY29tL2t2P1wiICsgbjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSh7XG4gICAgICAgICAgICAgIGZ1bmM6IFwibG9hZFBvbHlmaWxsXCIsXG4gICAgICAgICAgICAgIHJlc3VsdDogMCxcbiAgICAgICAgICAgICAgcGFyYW1zOiB0LFxuICAgICAgICAgICAgICBlcnJvcl9tc2c6IGUubWVzc2FnZVxuICAgICAgICAgICAgfSksIG5ldyBFcnJvcihcIuWKoOi9vSBwb2x5ZmlsbCBcIiArIHQgKyBcIiDlpLHotKU6IFwiICsgZS5tZXNzYWdlKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHJldHVybiBbMl07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gRyh0KSB7XG4gICAgcmV0dXJuIFtcIkFjY2VwdFwiLCBcIkNvbnRlbnQtVHlwZVwiXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gciA9IGUsIHZvaWQgKChuID0gdC5oZWFkZXJzKSAmJiBPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHQgIT09IHIgJiYgdC50b1VwcGVyQ2FzZSgpID09PSByLnRvVXBwZXJDYXNlKCkgJiYgKG5bcl0gPSBuW3RdLCBkZWxldGUgblt0XSk7XG4gICAgICB9KSk7XG4gICAgICB2YXIgciwgbjtcbiAgICB9KSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmIChcIltvYmplY3QgT2JqZWN0XVwiICE9PSBNLmNhbGwodCkpIHJldHVybiAhMTtcbiAgICAgIHZhciBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO1xuICAgICAgcmV0dXJuIG51bGwgPT09IGUgfHwgZSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbiAgICB9KHQuYm9keSkgJiYgKHQuYm9keSA9IEpTT04uc3RyaW5naWZ5KHQuYm9keSksIHQuaGVhZGVycyAmJiAodC5oZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLThcIikpLCB0O1xuICB9XG5cbiAgZnVuY3Rpb24gRih0KSB7XG4gICAgcmV0dXJuIHEodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBlLCByLCBuLCBvLCBpLCBhLCBzLCBjLCB1LCBsLCBoLCBmLCBwLCBkLCB2LCB5LCBnO1xuICAgICAgcmV0dXJuIFIodGhpcywgZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgc3dpdGNoIChtLmxhYmVsKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIGUgPSBCLmJhc2VVUkwsIHIgPSBCLmRlZmF1bHRzLCBuID0gQi5pbnRlcmNlcHRvcnMsIFs0LCBWKEIucG9seWZpbGxVcmwpXTtcblxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHJldHVybiBtLnNlbnQoKSwgKG8gPSBfVShfVSh7fSwgciksIHQpKS5oZWFkZXJzIHx8IChvLmhlYWRlcnMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSBcIkdFVFwiKTtcbiAgICAgICAgICAgICAgdmFyIGUgPSBCLmhlYWRlcnNbdF0gfHwge307XG4gICAgICAgICAgICAgIHJldHVybiBfVShfVSh7fSwgQi5oZWFkZXJzLmNvbW1vbiksIGUpO1xuICAgICAgICAgICAgfShvLm1ldGhvZCkpLCBHKG8pLCBbNCwgbi5yZXF1ZXN0LnRyYXZlcnNlKG8sICEwKV07XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBpZiAoKGkgPSBtLnNlbnQoKSkgaW5zdGFuY2VvZiBFcnJvcikgdGhyb3cgaTtcbiAgICAgICAgICAgIHJldHVybiBpLnVybCA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgIHJldHVybiAhdCB8fCBKLnRlc3QoZSkgPyBlIDogdC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpICsgXCIvXCIgKyBlLnJlcGxhY2UoL15cXC8rLywgXCJcIik7XG4gICAgICAgICAgICB9KGUsIGkudXJsKSwgYSA9IGkudXJsLCBzID0gaS50aW1lb3V0LCBjID0gaS5wYXJhbXMsIHUgPSBpLm1ldGhvZCwgbCA9IFtcIkdFVFwiLCBcIkRFTEVURVwiLCBcIk9QVElPTlNcIiwgXCJIRUFEXCJdLmluY2x1ZGVzKHZvaWQgMCA9PT0gdSA/IFwiR0VUXCIgOiB1KSAmJiAhIWMsIGggPSBsID8gVCh7XG4gICAgICAgICAgICAgIHVybDogYSxcbiAgICAgICAgICAgICAgcXVlcnk6IGNcbiAgICAgICAgICAgIH0pIDogYSwgZiA9IFtdLCBzICYmICFpLnNpZ25hbCAmJiAodiA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIHAgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0KG5ldyBFcnJvcihcInRpbWVvdXRcIikpO1xuICAgICAgICAgICAgICB9LCBzKTtcbiAgICAgICAgICAgIH0pLCBmLnB1c2godiksIGQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCksIGkuc2lnbmFsID0gZC5zaWduYWwpLCBmLnB1c2goZmV0Y2goaCwgaSkuY2F0Y2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICB9KSksIFs0LCBQcm9taXNlLnJhY2UoZildO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIHkgPSBtLnNlbnQoKSwgcCAmJiBjbGVhclRpbWVvdXQocCksIFs0LCBuLnJlc3BvbnNlLnRyYXZlcnNlKHkpXTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGlmICgoZyA9IG0uc2VudCgpKSBpbnN0YW5jZW9mIEVycm9yKSB0aHJvdyBudWxsID09IGQgfHwgZC5hYm9ydCgpLCBnO1xuICAgICAgICAgICAgcmV0dXJuIFsyLCBnXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgUSA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiB0KHQpIHtcbiAgICAgIEIuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKGZ1bmN0aW9uIChyKSB7XG4gICAgICAgIHZhciBuID0gci51cmwsXG4gICAgICAgICAgICBvID0gci5tZXRob2QsXG4gICAgICAgICAgICBpID0gci5ib2R5LFxuICAgICAgICAgICAgYSA9IGk7XG5cbiAgICAgICAgaWYgKHQub25SZXBvcnRCZWZvcmVTZW5kKSB7XG4gICAgICAgICAgdmFyIHMgPSB0Lm9uUmVwb3J0QmVmb3JlU2VuZCh7XG4gICAgICAgICAgICB1cmw6IG4sXG4gICAgICAgICAgICBtZXRob2Q6IG8sXG4gICAgICAgICAgICBkYXRhOiBpID8gSlNPTi5wYXJzZShpKSA6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhID0gKG51bGwgPT0gcyA/IHZvaWQgMCA6IHMuZGF0YSkgPyBKU09OLnN0cmluZ2lmeShzLmRhdGEpIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcIkdFVFwiICE9PSBvICYmICFhKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBkYXRhIGZvciBzZGssIGNhbmNlbC5cIik7XG4gICAgICAgIHJldHVybiBfZShfZSh7fSwgciksIHtcbiAgICAgICAgICBib2R5OiBhXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0LCBvKSB7XG4gICAgICByZXR1cm4gcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgciwgaTtcbiAgICAgICAgcmV0dXJuIG4odGhpcywgZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICBzd2l0Y2ggKG4ubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgcmV0dXJuIFs0LCBGKF9lKHtcbiAgICAgICAgICAgICAgICB1cmw6IHRcbiAgICAgICAgICAgICAgfSwgbykpXTtcblxuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICByZXR1cm4gWzQsIChyID0gbi5zZW50KCkpLmpzb24oKV07XG5cbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgcmV0dXJuIGkgPSBuLnNlbnQoKSwgWzIsIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogaSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHIuc3RhdHVzLFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHIuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByLmhlYWRlcnNcbiAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCB0LnByb3RvdHlwZS5wb3N0ID0gZnVuY3Rpb24gKHQsIG8sIGkpIHtcbiAgICAgIHJldHVybiByKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByLCBhO1xuICAgICAgICByZXR1cm4gbih0aGlzLCBmdW5jdGlvbiAobikge1xuICAgICAgICAgIHN3aXRjaCAobi5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gWzQsIEYoX2Uoe1xuICAgICAgICAgICAgICAgIHVybDogdCxcbiAgICAgICAgICAgICAgICBib2R5OiBvLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCJcbiAgICAgICAgICAgICAgfSwgaSkpXTtcblxuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICByZXR1cm4gWzQsIChyID0gbi5zZW50KCkpLmpzb24oKV07XG5cbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgcmV0dXJuIGEgPSBuLnNlbnQoKSwgWzIsIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogYSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHIuc3RhdHVzLFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHIuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByLmhlYWRlcnNcbiAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCB0O1xuICB9KCksXG4gICAgICBLID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIHQodCkge1xuICAgICAgdGhpcy5hcHBrZXkgPSB0O1xuICAgIH1cblxuICAgIHJldHVybiB0LnByb3RvdHlwZS5nZXRJdGVtID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTdG9yZUtleSh0KSk7XG4gICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0sIHQucHJvdG90eXBlLnJlbW92ZUl0ZW0gPSBmdW5jdGlvbiAodCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuZ2V0U3RvcmVLZXkodCkpO1xuICAgICAgfSBjYXRjaCAodCkge31cbiAgICB9LCB0LnByb3RvdHlwZS5zZXRJdGVtID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFN0b3JlS2V5KHQpLCBlKTtcbiAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgfSwgdC5wcm90b3R5cGUuc2V0U2Vzc2lvbkl0ZW0gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTdG9yZUtleSh0KSwgZSk7XG4gICAgICB9IGNhdGNoICh0KSB7fVxuICAgIH0sIHQucHJvdG90eXBlLmdldFNlc3Npb25JdGVtID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFN0b3JlS2V5KHQpKTtcbiAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSwgdC5wcm90b3R5cGUuZ2V0U3RvcmVLZXkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIG8gKyB0aGlzLmFwcGtleSArIFwiX1wiICsgdDtcbiAgICB9LCB0LnByb3RvdHlwZS5jcmVhdGVEZXZpY2VJZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB0ID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGkpO1xuICAgICAgICByZXR1cm4gdCB8fCAodCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgZm9yICh2YXIgZSA9IFwiQUJDREVGR0hKS01OUFFSU1RXWFlaYWJjZGVmaGlqa21ucHJzdHd4eXowMTIzNDU2Nzg5XCIsIHIgPSBcIlwiLCBuID0gMDsgbiA8IHQ7IG4rKykge1xuICAgICAgICAgICAgciArPSBlLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBlLmxlbmd0aCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9KDMyKSwgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGksIHQpKSwgdDtcbiAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSwgdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciB0ID0gd2luZG93LmxvY2FsU3RvcmFnZS5sZW5ndGgsIGUgPSAwOyBlIDwgdDsgZSsrKSB7XG4gICAgICAgICAgdmFyIHIgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmtleShlKTtcbiAgICAgICAgICAobnVsbCA9PSByID8gdm9pZCAwIDogci5zdWJzdHIoMCwgOSkpID09IG8gJiYgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHIpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoICh0KSB7fVxuICAgIH0sIHQucHJvdG90eXBlLmdldFN0b3JlQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdCA9IDA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmxlbmd0aDtcbiAgICAgIH0gY2F0Y2ggKHQpIHt9XG5cbiAgICAgIHJldHVybiB0O1xuICAgIH0sIHQ7XG4gIH0oKTtcblxuICBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBnbG9iYWxUaGlzID8gZ2xvYmFsVGhpcyA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIHdpbmRvdyA/IHdpbmRvdyA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIGdsb2JhbCA/IGdsb2JhbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIHNlbGYgJiYgc2VsZjtcblxuICB2YXIgVyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgdmFyIGUgPSB7XG4gICAgICBleHBvcnRzOiB7fVxuICAgIH07XG4gICAgcmV0dXJuIHQoZSwgZS5leHBvcnRzKSwgZS5leHBvcnRzO1xuICB9KGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gdCh0LCBlLCByLCBuLCBvLCBpLCBhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIHMgPSB0W2ldKGEpLFxuICAgICAgICAgICAgICBjID0gcy52YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiB2b2lkIHIodCk7XG4gICAgICAgIH1cblxuICAgICAgICBzLmRvbmUgPyBlKGMpIDogUHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4obiwgbyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGUodCwgZSkge1xuICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGUubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICB2YXIgbiA9IGVbcl07XG4gICAgICAgICAgbi5lbnVtZXJhYmxlID0gbi5lbnVtZXJhYmxlIHx8ICExLCBuLmNvbmZpZ3VyYWJsZSA9ICEwLCBcInZhbHVlXCIgaW4gbiAmJiAobi53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIG4ua2V5LCBuKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgcixcbiAgICAgICAgICBuID0gKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHQgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHZhciBlLFxuICAgICAgICAgICAgICByID0gT2JqZWN0LnByb3RvdHlwZSxcbiAgICAgICAgICAgICAgbiA9IHIuaGFzT3duUHJvcGVydHksXG4gICAgICAgICAgICAgIG8gPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LFxuICAgICAgICAgICAgICBpID0gby5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIixcbiAgICAgICAgICAgICAgYSA9IG8uYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiLFxuICAgICAgICAgICAgICBzID0gby50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICAgICAgICAgIGZ1bmN0aW9uIGModCwgZSwgcikge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBlLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiByLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgICAgICAgd3JpdGFibGU6ICEwXG4gICAgICAgICAgICB9KSwgdFtlXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYyh7fSwgXCJcIik7XG4gICAgICAgICAgfSBjYXRjaCAocikge1xuICAgICAgICAgICAgYyA9IGZ1bmN0aW9uIGModCwgZSwgcikge1xuICAgICAgICAgICAgICByZXR1cm4gdFtlXSA9IHI7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZ1bmN0aW9uIHUodCwgciwgbiwgbykge1xuICAgICAgICAgICAgdmFyIGksIGEsIHMsIGM7XG4gICAgICAgICAgICByZXR1cm4gciA9IHIgJiYgci5wcm90b3R5cGUgaW5zdGFuY2VvZiB5ID8gciA6IHksIHIgPSBPYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSwgbyA9IG5ldyBrKG8gfHwgW10pLCByLl9pbnZva2UgPSAoaSA9IHQsIGEgPSBuLCBzID0gbywgYyA9IGgsIGZ1bmN0aW9uICh0LCByKSB7XG4gICAgICAgICAgICAgIGlmIChjID09PSBwKSB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuXG4gICAgICAgICAgICAgIGlmIChjID09PSBkKSB7XG4gICAgICAgICAgICAgICAgaWYgKFwidGhyb3dcIiA9PT0gdCkgdGhyb3cgcjtcbiAgICAgICAgICAgICAgICByZXR1cm4gQygpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChzLm1ldGhvZCA9IHQsIHMuYXJnID0gcjs7KSB7XG4gICAgICAgICAgICAgICAgdmFyIG4gPSBzLmRlbGVnYXRlO1xuXG4gICAgICAgICAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICAgICAgICAgIHZhciBvID0gZnVuY3Rpb24gdChyLCBuKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgobyA9IHIuaXRlcmF0b3Jbbi5tZXRob2RdKSA9PT0gZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChuLmRlbGVnYXRlID0gbnVsbCwgXCJ0aHJvd1wiID09PSBuLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuaXRlcmF0b3IucmV0dXJuICYmIChuLm1ldGhvZCA9IFwicmV0dXJuXCIsIG4uYXJnID0gZSwgdChyLCBuKSwgXCJ0aHJvd1wiID09PSBuLm1ldGhvZCkpIHJldHVybiB2O1xuICAgICAgICAgICAgICAgICAgICAgICAgbi5tZXRob2QgPSBcInRocm93XCIsIG4uYXJnID0gbmV3IFR5cGVFcnJvcihcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ0aHJvd1wiID09PSAobyA9IGwobywgci5pdGVyYXRvciwgbi5hcmcpKS50eXBlID8gKG4ubWV0aG9kID0gXCJ0aHJvd1wiLCBuLmFyZyA9IG8uYXJnLCBuLmRlbGVnYXRlID0gbnVsbCwgdikgOiAobyA9IG8uYXJnKSA/IG8uZG9uZSA/IChuW3IucmVzdWx0TmFtZV0gPSBvLnZhbHVlLCBuLm5leHQgPSByLm5leHRMb2MsIFwicmV0dXJuXCIgIT09IG4ubWV0aG9kICYmIChuLm1ldGhvZCA9IFwibmV4dFwiLCBuLmFyZyA9IGUpLCBuLmRlbGVnYXRlID0gbnVsbCwgdikgOiBvIDogKG4ubWV0aG9kID0gXCJ0aHJvd1wiLCBuLmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKSwgbi5kZWxlZ2F0ZSA9IG51bGwsIHYpO1xuICAgICAgICAgICAgICAgICAgfShuLCBzKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG8gPT09IHYpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoXCJuZXh0XCIgPT09IHMubWV0aG9kKSBzLnNlbnQgPSBzLl9zZW50ID0gcy5hcmc7ZWxzZSBpZiAoXCJ0aHJvd1wiID09PSBzLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgaWYgKGMgPT09IGgpIHRocm93IGMgPSBkLCBzLmFyZztcbiAgICAgICAgICAgICAgICAgIHMuZGlzcGF0Y2hFeGNlcHRpb24ocy5hcmcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBcInJldHVyblwiID09PSBzLm1ldGhvZCAmJiBzLmFicnVwdChcInJldHVyblwiLCBzLmFyZyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYyA9IHAsIFwibm9ybWFsXCIgPT09IChvID0gbChpLCBhLCBzKSkudHlwZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGMgPSBzLmRvbmUgPyBkIDogZiwgby5hcmcgIT09IHYpIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvLmFyZyxcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogcy5kb25lXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBcInRocm93XCIgPT09IG8udHlwZSAmJiAoYyA9IGQsIHMubWV0aG9kID0gXCJ0aHJvd1wiLCBzLmFyZyA9IG8uYXJnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksIHI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnVuY3Rpb24gbCh0LCBlLCByKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICAgICAgYXJnOiB0LmNhbGwoZSwgcilcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRocm93XCIsXG4gICAgICAgICAgICAgICAgYXJnOiB0XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdC53cmFwID0gdTtcbiAgICAgICAgICB2YXIgaCA9IFwic3VzcGVuZGVkU3RhcnRcIixcbiAgICAgICAgICAgICAgZiA9IFwic3VzcGVuZGVkWWllbGRcIixcbiAgICAgICAgICAgICAgcCA9IFwiZXhlY3V0aW5nXCIsXG4gICAgICAgICAgICAgIGQgPSBcImNvbXBsZXRlZFwiLFxuICAgICAgICAgICAgICB2ID0ge307XG5cbiAgICAgICAgICBmdW5jdGlvbiB5KCkge31cblxuICAgICAgICAgIGZ1bmN0aW9uIGcoKSB7fVxuXG4gICAgICAgICAgZnVuY3Rpb24gbSgpIHt9XG5cbiAgICAgICAgICB2YXIgdyA9IHt9O1xuICAgICAgICAgIHdbaV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9LCAobyA9IChvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKSAmJiBvKG8oeChbXSkpKSkgJiYgbyAhPT0gciAmJiBuLmNhbGwobywgaSkgJiYgKHcgPSBvKTtcbiAgICAgICAgICB2YXIgYiA9IG0ucHJvdG90eXBlID0geS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHcpO1xuXG4gICAgICAgICAgZnVuY3Rpb24gUyh0KSB7XG4gICAgICAgICAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICBjKHQsIGUsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShlLCB0KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmdW5jdGlvbiBFKHQsIGUpIHtcbiAgICAgICAgICAgIHZhciByO1xuXG4gICAgICAgICAgICB0aGlzLl9pbnZva2UgPSBmdW5jdGlvbiAobywgaSkge1xuICAgICAgICAgICAgICBmdW5jdGlvbiBhKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAociwgYSkge1xuICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uIHIobywgaSwgYSwgcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJ0aHJvd1wiICE9PSAobyA9IGwodFtvXSwgdCwgaSkpLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IG8uYXJnO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaSA9IGMudmFsdWUpICYmIFwib2JqZWN0XCIgPT0gX3R5cGVvZihpKSAmJiBuLmNhbGwoaSwgXCJfX2F3YWl0XCIpID8gZS5yZXNvbHZlKGkuX19hd2FpdCkudGhlbihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcihcIm5leHRcIiwgdCwgYSwgcyk7XG4gICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHIoXCJ0aHJvd1wiLCB0LCBhLCBzKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KSA6IGUucmVzb2x2ZShpKS50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLnZhbHVlID0gdCwgYShjKTtcbiAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoXCJ0aHJvd1wiLCB0LCBhLCBzKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHMoby5hcmcpO1xuICAgICAgICAgICAgICAgICAgfShvLCBpLCByLCBhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiByID0gciA/IHIudGhlbihhLCBhKSA6IGEoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnVuY3Rpb24gSSh0KSB7XG4gICAgICAgICAgICB2YXIgZSA9IHtcbiAgICAgICAgICAgICAgdHJ5TG9jOiB0WzBdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgMSBpbiB0ICYmIChlLmNhdGNoTG9jID0gdFsxXSksIDIgaW4gdCAmJiAoZS5maW5hbGx5TG9jID0gdFsyXSwgZS5hZnRlckxvYyA9IHRbM10pLCB0aGlzLnRyeUVudHJpZXMucHVzaChlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmdW5jdGlvbiBPKHQpIHtcbiAgICAgICAgICAgIHZhciBlID0gdC5jb21wbGV0aW9uIHx8IHt9O1xuICAgICAgICAgICAgZS50eXBlID0gXCJub3JtYWxcIiwgZGVsZXRlIGUuYXJnLCB0LmNvbXBsZXRpb24gPSBlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZ1bmN0aW9uIGsodCkge1xuICAgICAgICAgICAgdGhpcy50cnlFbnRyaWVzID0gW3tcbiAgICAgICAgICAgICAgdHJ5TG9jOiBcInJvb3RcIlxuICAgICAgICAgICAgfV0sIHQuZm9yRWFjaChJLCB0aGlzKSwgdGhpcy5yZXNldCghMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnVuY3Rpb24geCh0KSB7XG4gICAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgICBpZiAociA9IHRbaV0pIHJldHVybiByLmNhbGwodCk7XG4gICAgICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIHQubmV4dCkgcmV0dXJuIHQ7XG5cbiAgICAgICAgICAgICAgaWYgKCFpc05hTih0Lmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcixcbiAgICAgICAgICAgICAgICAgICAgbyA9IC0xO1xuICAgICAgICAgICAgICAgIHJldHVybiAociA9IGZ1bmN0aW9uIHIoKSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKDsgKytvIDwgdC5sZW5ndGg7KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuLmNhbGwodCwgbykpIHJldHVybiByLnZhbHVlID0gdFtvXSwgci5kb25lID0gITEsIHI7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiByLnZhbHVlID0gZSwgci5kb25lID0gITAsIHI7XG4gICAgICAgICAgICAgICAgfSkubmV4dCA9IHI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbmV4dDogQ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmdW5jdGlvbiBDKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGUsXG4gICAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAoKGcucHJvdG90eXBlID0gYi5jb25zdHJ1Y3RvciA9IG0pLmNvbnN0cnVjdG9yID0gZykuZGlzcGxheU5hbWUgPSBjKG0sIHMsIFwiR2VuZXJhdG9yRnVuY3Rpb25cIiksIHQuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gISEodCA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdCAmJiB0LmNvbnN0cnVjdG9yKSAmJiAodCA9PT0gZyB8fCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIgPT09ICh0LmRpc3BsYXlOYW1lIHx8IHQubmFtZSkpO1xuICAgICAgICAgIH0sIHQubWFyayA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHQsIG0pIDogKHQuX19wcm90b19fID0gbSwgYyh0LCBzLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpKSwgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGIpLCB0O1xuICAgICAgICAgIH0sIHQuYXdyYXAgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgX19hd2FpdDogdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LCBTKEUucHJvdG90eXBlKSwgRS5wcm90b3R5cGVbYV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9LCB0LkFzeW5jSXRlcmF0b3IgPSBFLCB0LmFzeW5jID0gZnVuY3Rpb24gKGUsIHIsIG4sIG8sIGkpIHtcbiAgICAgICAgICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IFByb21pc2UpO1xuICAgICAgICAgICAgdmFyIGEgPSBuZXcgRSh1KGUsIHIsIG4sIG8pLCBpKTtcbiAgICAgICAgICAgIHJldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24ocikgPyBhIDogYS5uZXh0KCkudGhlbihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICByZXR1cm4gdC5kb25lID8gdC52YWx1ZSA6IGEubmV4dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgUyhiKSwgYyhiLCBzLCBcIkdlbmVyYXRvclwiKSwgYltpXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgIH0sIGIudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgICAgICAgICB9LCB0LmtleXMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgdmFyIGUsXG4gICAgICAgICAgICAgICAgciA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGUgaW4gdCkge1xuICAgICAgICAgICAgICByLnB1c2goZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByLnJldmVyc2UoKSwgZnVuY3Rpb24gZSgpIHtcbiAgICAgICAgICAgICAgZm9yICg7IHIubGVuZ3RoOykge1xuICAgICAgICAgICAgICAgIHZhciBuID0gci5wb3AoKTtcbiAgICAgICAgICAgICAgICBpZiAobiBpbiB0KSByZXR1cm4gZS52YWx1ZSA9IG4sIGUuZG9uZSA9ICExLCBlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGUuZG9uZSA9ICEwLCBlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LCB0LnZhbHVlcyA9IHgsIGsucHJvdG90eXBlID0ge1xuICAgICAgICAgICAgY29uc3RydWN0b3I6IGssXG4gICAgICAgICAgICByZXNldDogZnVuY3Rpb24gcmVzZXQodCkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2ID0gMCwgdGhpcy5uZXh0ID0gMCwgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IGUsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSBcIm5leHRcIiwgdGhpcy5hcmcgPSBlLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChPKSwgIXQpIGZvciAodmFyIHIgaW4gdGhpcykge1xuICAgICAgICAgICAgICAgIFwidFwiID09PSByLmNoYXJBdCgwKSAmJiBuLmNhbGwodGhpcywgcikgJiYgIWlzTmFOKCtyLnNsaWNlKDEpKSAmJiAodGhpc1tyXSA9IGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgICAgICAgICAgdGhpcy5kb25lID0gITA7XG4gICAgICAgICAgICAgIHZhciB0ID0gdGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247XG4gICAgICAgICAgICAgIGlmIChcInRocm93XCIgPT09IHQudHlwZSkgdGhyb3cgdC5hcmc7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKHQpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZG9uZSkgdGhyb3cgdDtcbiAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzO1xuXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIG8obiwgbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBzLnR5cGUgPSBcInRocm93XCIsIHMuYXJnID0gdCwgci5uZXh0ID0gbiwgbyAmJiAoci5tZXRob2QgPSBcIm5leHRcIiwgci5hcmcgPSBlKSwgISFvO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyAwIDw9IGk7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBhID0gdGhpcy50cnlFbnRyaWVzW2ldLFxuICAgICAgICAgICAgICAgICAgICBzID0gYS5jb21wbGV0aW9uO1xuICAgICAgICAgICAgICAgIGlmIChcInJvb3RcIiA9PT0gYS50cnlMb2MpIHJldHVybiBvKFwiZW5kXCIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGEudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgICAgICAgICAgdmFyIGMgPSBuLmNhbGwoYSwgXCJjYXRjaExvY1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICB1ID0gbi5jYWxsKGEsIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGMgJiYgdSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgYS5jYXRjaExvYykgcmV0dXJuIG8oYS5jYXRjaExvYywgITApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgYS5maW5hbGx5TG9jKSByZXR1cm4gbyhhLmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBhLmNhdGNoTG9jKSByZXR1cm4gbyhhLmNhdGNoTG9jLCAhMCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXUpIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgYS5maW5hbGx5TG9jKSByZXR1cm4gbyhhLmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFicnVwdDogZnVuY3Rpb24gYWJydXB0KHQsIGUpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgciA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyAwIDw9IHI7IC0tcikge1xuICAgICAgICAgICAgICAgIHZhciBvID0gdGhpcy50cnlFbnRyaWVzW3JdO1xuXG4gICAgICAgICAgICAgICAgaWYgKG8udHJ5TG9jIDw9IHRoaXMucHJldiAmJiBuLmNhbGwobywgXCJmaW5hbGx5TG9jXCIpICYmIHRoaXMucHJldiA8IG8uZmluYWxseUxvYykge1xuICAgICAgICAgICAgICAgICAgdmFyIGkgPSBvO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIGEgPSAoaSA9IGkgJiYgKFwiYnJlYWtcIiA9PT0gdCB8fCBcImNvbnRpbnVlXCIgPT09IHQpICYmIGkudHJ5TG9jIDw9IGUgJiYgZSA8PSBpLmZpbmFsbHlMb2MgPyBudWxsIDogaSkgPyBpLmNvbXBsZXRpb24gOiB7fTtcbiAgICAgICAgICAgICAgcmV0dXJuIGEudHlwZSA9IHQsIGEuYXJnID0gZSwgaSA/ICh0aGlzLm1ldGhvZCA9IFwibmV4dFwiLCB0aGlzLm5leHQgPSBpLmZpbmFsbHlMb2MsIHYpIDogdGhpcy5jb21wbGV0ZShhKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUodCwgZSkge1xuICAgICAgICAgICAgICBpZiAoXCJ0aHJvd1wiID09PSB0LnR5cGUpIHRocm93IHQuYXJnO1xuICAgICAgICAgICAgICByZXR1cm4gXCJicmVha1wiID09PSB0LnR5cGUgfHwgXCJjb250aW51ZVwiID09PSB0LnR5cGUgPyB0aGlzLm5leHQgPSB0LmFyZyA6IFwicmV0dXJuXCIgPT09IHQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHQuYXJnLCB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCIsIHRoaXMubmV4dCA9IFwiZW5kXCIpIDogXCJub3JtYWxcIiA9PT0gdC50eXBlICYmIGUgJiYgKHRoaXMubmV4dCA9IGUpLCB2O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKHQpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyAwIDw9IGU7IC0tZSkge1xuICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy50cnlFbnRyaWVzW2VdO1xuICAgICAgICAgICAgICAgIGlmIChyLmZpbmFsbHlMb2MgPT09IHQpIHJldHVybiB0aGlzLmNvbXBsZXRlKHIuY29tcGxldGlvbiwgci5hZnRlckxvYyksIE8ociksIHY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYXRjaDogZnVuY3Rpb24gX2NhdGNoKHQpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyAwIDw9IGU7IC0tZSkge1xuICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy50cnlFbnRyaWVzW2VdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHIudHJ5TG9jID09PSB0KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbixcbiAgICAgICAgICAgICAgICAgICAgICBvID0gci5jb21wbGV0aW9uO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwidGhyb3dcIiA9PT0gby50eXBlICYmIChuID0gby5hcmcsIE8ocikpLCBuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbiBkZWxlZ2F0ZVlpZWxkKHQsIHIsIG4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3I6IHgodCksXG4gICAgICAgICAgICAgICAgcmVzdWx0TmFtZTogcixcbiAgICAgICAgICAgICAgICBuZXh0TG9jOiBuXG4gICAgICAgICAgICAgIH0sIFwibmV4dFwiID09PSB0aGlzLm1ldGhvZCAmJiAodGhpcy5hcmcgPSBlKSwgdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB0O1xuICAgICAgICB9KHQuZXhwb3J0cyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZWdlbmVyYXRvclJ1bnRpbWUgPSB0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgRnVuY3Rpb24oXCJyXCIsIFwicmVnZW5lcmF0b3JSdW50aW1lID0gclwiKSh0KTtcbiAgICAgICAgfVxuICAgICAgfShyID0ge1xuICAgICAgICBleHBvcnRzOiB7fVxuICAgICAgfSksIHIuZXhwb3J0cyk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiByKHQpIHtcbiAgICAgICAgICAhZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgICAgICAgICB9KHRoaXMsIHIpLCB0aGlzLnZlcnNpb24gPSBcIjEuMC4wXCI7XG4gICAgICAgICAgdmFyIGUgPSBBcnJheS5wcm90b3R5cGUubWFwLFxuICAgICAgICAgICAgICBuID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2g7XG4gICAgICAgICAgdCAmJiAodGhpcy5oYXNoZXIgPSB0KSwgdGhpcy5lYWNoID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgICAgICAgIGlmIChudWxsICE9IHQpIGlmIChuICYmIHQuZm9yRWFjaCA9PT0gbikgdC5mb3JFYWNoKGUsIHIpO2Vsc2UgaWYgKHQubGVuZ3RoID09PSArdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IDAsIGkgPSB0Lmxlbmd0aDsgbyA8IGk7IG8rKykge1xuICAgICAgICAgICAgICAgIGlmIChlLmNhbGwociwgdFtvXSwgbywgdCkgPT09IHt9KSByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBmb3IgKHZhciBhIGluIHQpIHtcbiAgICAgICAgICAgICAgaWYgKHQuaGFzT3duUHJvcGVydHkoYSkgJiYgZS5jYWxsKHIsIHRbYV0sIGEsIHQpID09PSB7fSkgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHRoaXMubWFwID0gZnVuY3Rpb24gKHQsIHIsIG4pIHtcbiAgICAgICAgICAgIHZhciBvID0gW107XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSB0ID8gbyA6IGUgJiYgdC5tYXAgPT09IGUgPyB0Lm1hcChyLCBuKSA6ICh0aGlzLmVhY2godCwgZnVuY3Rpb24gKHQsIGUsIGkpIHtcbiAgICAgICAgICAgICAgb1tvLmxlbmd0aF0gPSByLmNhbGwobiwgdCwgZSwgaSk7XG4gICAgICAgICAgICB9KSwgbyk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvLCBpLCBhLCBzO1xuICAgICAgICByZXR1cm4gbyA9IHIsIChpID0gW3tcbiAgICAgICAgICBrZXk6IFwiZ2V0UWltZWkzNlwiLFxuICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh0LCBlKSB7XG4gICAgICAgICAgICB2YXIgciA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmdldEhpZCgpLnRoZW4oZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgdmFyIG8gPSBcIjNCSnJcIiArIHQuc3Vic3RyaW5nKDAsIDIpICsgKG4gJiYgbi5zdWJzdHJpbmcoMywgNykpLFxuICAgICAgICAgICAgICAgICAgaSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICBpLm9wZW4oXCJQT1NUXCIsIFwiaHR0cHM6Ly9zbm93Zmxha2UucXEuY29tL29sYS9oNVwiLCAhMCksIGkuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIiksIGkub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChpLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSAmJiAyMDAgPT0gaS5zdGF0dXMpIHRyeSB7XG4gICAgICAgICAgICAgICAgICBlICYmIGUoSlNPTi5wYXJzZShpLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgIGUobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LCBpLnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGFwcEtleTogdCxcbiAgICAgICAgICAgICAgICBoaWQ6IG4sXG4gICAgICAgICAgICAgICAgc2lnbjogbyxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiByLnZlcnNpb25cbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAga2V5OiBcImdldEhpZFwiLFxuICAgICAgICAgIHZhbHVlOiAoYSA9IG4ubWFyayhmdW5jdGlvbiB0KCkge1xuICAgICAgICAgICAgdmFyIGUsIHI7XG4gICAgICAgICAgICByZXR1cm4gbi53cmFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHQucHJldiA9IHQubmV4dCkge1xuICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSBbXSkucHVzaCgobiA9IHZvaWQgMCwgKG4gPSBbTWF0aC5mbG9vcih3aW5kb3cuc2NyZWVuLndpZHRoICogd2luZG93LmRldmljZVBpeGVsUmF0aW8pLCBNYXRoLmZsb29yKHdpbmRvdy5zY3JlZW4uaGVpZ2h0ICogd2luZG93LmRldmljZVBpeGVsUmF0aW8pXSkuc29ydCgpLnJldmVyc2UoKSwgbi5qb2luKFwieFwiKSkpLCBlLnB1c2goKG4gPSB2b2lkIDAsIChuID0gW01hdGguZmxvb3Iod2luZG93LnNjcmVlbi5hdmFpbFdpZHRoICogd2luZG93LmRldmljZVBpeGVsUmF0aW8pLCBNYXRoLmZsb29yKHdpbmRvdy5zY3JlZW4uYXZhaWxIZWlnaHQgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyldKS5zb3J0KCkucmV2ZXJzZSgpLCBuLmpvaW4oXCJ4XCIpKSksIGUucHVzaChuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5KSwgZS5wdXNoKCEhd2luZG93LnNlc3Npb25TdG9yYWdlKSwgZS5wdXNoKCEhd2luZG93LmluZGV4ZWREQiksIGUucHVzaChuYXZpZ2F0b3IucHJvZHVjdFN1YiksIGUucHVzaChuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSksIGUucHVzaCh0aGlzLmdldFdlYmdsVmVuZG9yQW5kUmVuZGVyZXIoKSksIGUucHVzaChuZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCkpLCB0Lm5leHQgPSAxMiwgdGhpcy5nZXRGYWN0b3IoKTtcblxuICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIgPSB0LnNlbnQsIGUucHVzaChyKSwgdGhpcy5oYXNoZXIpIHJldHVybiB0LmFicnVwdChcInJldHVyblwiLCB0aGlzLmhhc2hlcihlLmpvaW4oXCIjIyNcIiksIDMxKSk7XG4gICAgICAgICAgICAgICAgICAgIHQubmV4dCA9IDE4O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYWJydXB0KFwicmV0dXJuXCIsIHRoaXMueDY0aGFzaDEyOChlLmpvaW4oXCIjIyNcIiksIDMxKSk7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnN0b3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgbjtcbiAgICAgICAgICAgIH0sIHQsIHRoaXMpO1xuICAgICAgICAgIH0pLCBzID0gZnVuY3Rpb24gcygpIHtcbiAgICAgICAgICAgIHZhciBlID0gdGhpcyxcbiAgICAgICAgICAgICAgICByID0gYXJndW1lbnRzO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChuLCBvKSB7XG4gICAgICAgICAgICAgIHZhciBpID0gYS5hcHBseShlLCByKTtcblxuICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHtcbiAgICAgICAgICAgICAgICB0KGksIG4sIG8sIHMsIGMsIFwibmV4dFwiLCBlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkge1xuICAgICAgICAgICAgICAgIHQoaSwgbiwgbywgcywgYywgXCJ0aHJvd1wiLCBlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHModm9pZCAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfSwge1xuICAgICAgICAgIGtleTogXCJnZXRVc2VyQWdlbnRcIixcbiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBrZXk6IFwiZ2V0TmF0aXZlXCIsXG4gICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5nZXRIaWQoKS50aGVuKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgIEpTSW50ZXJmYWNlLmNhbGxiYWNrKHQudmVyc2lvbiwgZSwgdC5nZXRVc2VyQWdlbnQoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBrZXk6IFwiZ2V0V2ViZ2xWZW5kb3JBbmRSZW5kZXJlclwiLFxuICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhciB0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSxcbiAgICAgICAgICAgICAgICAgICAgZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgZSA9IHQuZ2V0Q29udGV4dChcIndlYmdsXCIpIHx8IHQuZ2V0Q29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7fVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUgfHwgbnVsbDtcbiAgICAgICAgICAgICAgfSgpLFxuICAgICAgICAgICAgICAgICAgZSA9IHQuZ2V0RXh0ZW5zaW9uKFwiV0VCR0xfZGVidWdfcmVuZGVyZXJfaW5mb1wiKSxcbiAgICAgICAgICAgICAgICAgIHIgPSBbdC5nZXRQYXJhbWV0ZXIoZS5VTk1BU0tFRF9WRU5ET1JfV0VCR0wpLCB0LmdldFBhcmFtZXRlcihlLlVOTUFTS0VEX1JFTkRFUkVSX1dFQkdMKV0uam9pbihcIn5cIiksXG4gICAgICAgICAgICAgICAgICBuID0gdC5nZXRFeHRlbnNpb24oXCJXRUJHTF9sb3NlX2NvbnRleHRcIik7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gbiAmJiBuLmxvc2VDb250ZXh0KCksIHI7XG4gICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgIGtleTogXCJnZXRGYWN0b3JcIixcbiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgdmFyIHIgPSB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24gfHwgd2luZG93LndlYmtpdFJUQ1BlZXJDb25uZWN0aW9uIHx8IHdpbmRvdy5tb3pSVENQZWVyQ29ubmVjdGlvbjtcbiAgICAgICAgICAgICAgciA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZSA9IG5ldyByKHtcbiAgICAgICAgICAgICAgICAgIGljZVNlcnZlcnM6IFtdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZS5jcmVhdGVEYXRhQ2hhbm5lbChcIlwiLCB7XG4gICAgICAgICAgICAgICAgICByZWxpYWJsZTogITFcbiAgICAgICAgICAgICAgICB9KSwgZS5vbmljZWNhbmRpZGF0ZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICB0LmNhbmRpZGF0ZSAmJiBpKFwiYT1cIi5jb25jYXQodC5jYW5kaWRhdGUuY2FuZGlkYXRlKSk7XG4gICAgICAgICAgICAgICAgfSwgZS5jcmVhdGVPZmZlcihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgaSh0LnNkcCksIGUuc2V0TG9jYWxEZXNjcmlwdGlvbih0KTtcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCkge30pO1xuICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCEoZSBpbiBuKSkge1xuICAgICAgICAgICAgICAgICAgICBuW2VdID0gITA7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IE9iamVjdC5rZXlzKG4pLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuW3RdO1xuICAgICAgICAgICAgICAgICAgICB9KSwgbyA9IDA7IG8gPCByLmxlbmd0aDsgbysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgMTYgPCByW29dLmxlbmd0aCAmJiAoci5zcGxpY2UobywgMSksIG8tLSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0KHJbMF0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkodCkge1xuICAgICAgICAgICAgICAgICAgKDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gdCA/IHQgOiBcIlwiKS5zcGxpdChcIlxcclxcblwiKS5mb3JFYWNoKGZ1bmN0aW9uICh0LCBlLCByKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuLCBpO1xuICAgICAgICAgICAgICAgICAgICB+dC5pbmRleE9mKFwiYT1jYW5kaWRhdGVcIikgPyAoaSA9IChuID0gdC5zcGxpdChcIiBcIikpWzRdLCBcImhvc3RcIiA9PT0gbls3XSAmJiBvKGkpKSA6IH50LmluZGV4T2YoXCJjPVwiKSAmJiBvKHQuc3BsaXQoXCIgXCIpWzJdKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG5bXCIwLjAuMC4wXCJdID0gITE7XG4gICAgICAgICAgICAgIH0oKSA6IHQobnVsbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBrZXk6IFwieDY0aGFzaDEyOFwiLFxuICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh0LCBlKSB7XG4gICAgICAgICAgICBmb3IgKHZhciByID0gZnVuY3Rpb24gcih0LCBlKSB7XG4gICAgICAgICAgICAgIHQgPSBbdFswXSA+Pj4gMTYsIDY1NTM1ICYgdFswXSwgdFsxXSA+Pj4gMTYsIDY1NTM1ICYgdFsxXV0sIGUgPSBbZVswXSA+Pj4gMTYsIDY1NTM1ICYgZVswXSwgZVsxXSA+Pj4gMTYsIDY1NTM1ICYgZVsxXV07XG4gICAgICAgICAgICAgIHZhciByID0gWzAsIDAsIDAsIDBdO1xuICAgICAgICAgICAgICByZXR1cm4gclszXSArPSB0WzNdICsgZVszXSwgclsyXSArPSByWzNdID4+PiAxNiwgclszXSAmPSA2NTUzNSwgclsyXSArPSB0WzJdICsgZVsyXSwgclsxXSArPSByWzJdID4+PiAxNiwgclsyXSAmPSA2NTUzNSwgclsxXSArPSB0WzFdICsgZVsxXSwgclswXSArPSByWzFdID4+PiAxNiwgclsxXSAmPSA2NTUzNSwgclswXSArPSB0WzBdICsgZVswXSwgclswXSAmPSA2NTUzNSwgW3JbMF0gPDwgMTYgfCByWzFdLCByWzJdIDw8IDE2IHwgclszXV07XG4gICAgICAgICAgICB9LCBuID0gZnVuY3Rpb24gbih0LCBlKSB7XG4gICAgICAgICAgICAgIHQgPSBbdFswXSA+Pj4gMTYsIDY1NTM1ICYgdFswXSwgdFsxXSA+Pj4gMTYsIDY1NTM1ICYgdFsxXV0sIGUgPSBbZVswXSA+Pj4gMTYsIDY1NTM1ICYgZVswXSwgZVsxXSA+Pj4gMTYsIDY1NTM1ICYgZVsxXV07XG4gICAgICAgICAgICAgIHZhciByID0gWzAsIDAsIDAsIDBdO1xuICAgICAgICAgICAgICByZXR1cm4gclszXSArPSB0WzNdICogZVszXSwgclsyXSArPSByWzNdID4+PiAxNiwgclszXSAmPSA2NTUzNSwgclsyXSArPSB0WzJdICogZVszXSwgclsxXSArPSByWzJdID4+PiAxNiwgclsyXSAmPSA2NTUzNSwgclsyXSArPSB0WzNdICogZVsyXSwgclsxXSArPSByWzJdID4+PiAxNiwgclsyXSAmPSA2NTUzNSwgclsxXSArPSB0WzFdICogZVszXSwgclswXSArPSByWzFdID4+PiAxNiwgclsxXSAmPSA2NTUzNSwgclsxXSArPSB0WzJdICogZVsyXSwgclswXSArPSByWzFdID4+PiAxNiwgclsxXSAmPSA2NTUzNSwgclsxXSArPSB0WzNdICogZVsxXSwgclswXSArPSByWzFdID4+PiAxNiwgclsxXSAmPSA2NTUzNSwgclswXSArPSB0WzBdICogZVszXSArIHRbMV0gKiBlWzJdICsgdFsyXSAqIGVbMV0gKyB0WzNdICogZVswXSwgclswXSAmPSA2NTUzNSwgW3JbMF0gPDwgMTYgfCByWzFdLCByWzJdIDw8IDE2IHwgclszXV07XG4gICAgICAgICAgICB9LCBvID0gZnVuY3Rpb24gbyh0LCBlKSB7XG4gICAgICAgICAgICAgIHJldHVybiAzMiA9PSAoZSAlPSA2NCkgPyBbdFsxXSwgdFswXV0gOiBlIDwgMzIgPyBbdFswXSA8PCBlIHwgdFsxXSA+Pj4gMzIgLSBlLCB0WzFdIDw8IGUgfCB0WzBdID4+PiAzMiAtIGVdIDogW3RbMV0gPDwgKGUgLT0gMzIpIHwgdFswXSA+Pj4gMzIgLSBlLCB0WzBdIDw8IGUgfCB0WzFdID4+PiAzMiAtIGVdO1xuICAgICAgICAgICAgfSwgaSA9IGZ1bmN0aW9uIGkodCwgZSkge1xuICAgICAgICAgICAgICByZXR1cm4gMCA9PSAoZSAlPSA2NCkgPyB0IDogZSA8IDMyID8gW3RbMF0gPDwgZSB8IHRbMV0gPj4+IDMyIC0gZSwgdFsxXSA8PCBlXSA6IFt0WzFdIDw8IGUgLSAzMiwgMF07XG4gICAgICAgICAgICB9LCBhID0gZnVuY3Rpb24gYSh0LCBlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbdFswXSBeIGVbMF0sIHRbMV0gXiBlWzFdXTtcbiAgICAgICAgICAgIH0sIHMgPSBmdW5jdGlvbiBzKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHQgPSBhKHQsIFswLCB0WzBdID4+PiAxXSksIHQgPSBuKHQsIFs0MjgzNTQzNTExLCAzOTgxODA2Nzk3XSksIHQgPSBhKHQsIFswLCB0WzBdID4+PiAxXSksIHQgPSBuKHQsIFszMzAxODgyMzY2LCA0NDQ5ODQ0MDNdKSwgYSh0LCBbMCwgdFswXSA+Pj4gMV0pO1xuICAgICAgICAgICAgfSwgYyA9ICh0ID0gdCB8fCBcIlwiKS5sZW5ndGggJSAxNiwgdSA9IHQubGVuZ3RoIC0gYywgbCA9IFswLCBlID0gZSB8fCAwXSwgaCA9IFswLCBlXSwgZiA9IFswLCAwXSwgcCA9IFswLCAwXSwgZCA9IFsyMjc3NzM1MzEzLCAyODk1NTk1MDldLCB2ID0gWzEyOTExNjkwOTEsIDY1ODg3MTE2N10sIHkgPSAwOyB5IDwgdTsgeSArPSAxNikge1xuICAgICAgICAgICAgICBmID0gWzI1NSAmIHQuY2hhckNvZGVBdCh5ICsgNCkgfCAoMjU1ICYgdC5jaGFyQ29kZUF0KHkgKyA1KSkgPDwgOCB8ICgyNTUgJiB0LmNoYXJDb2RlQXQoeSArIDYpKSA8PCAxNiB8ICgyNTUgJiB0LmNoYXJDb2RlQXQoeSArIDcpKSA8PCAyNCwgMjU1ICYgdC5jaGFyQ29kZUF0KHkpIHwgKDI1NSAmIHQuY2hhckNvZGVBdCh5ICsgMSkpIDw8IDggfCAoMjU1ICYgdC5jaGFyQ29kZUF0KHkgKyAyKSkgPDwgMTYgfCAoMjU1ICYgdC5jaGFyQ29kZUF0KHkgKyAzKSkgPDwgMjRdLCBwID0gWzI1NSAmIHQuY2hhckNvZGVBdCh5ICsgMTIpIHwgKDI1NSAmIHQuY2hhckNvZGVBdCh5ICsgMTMpKSA8PCA4IHwgKDI1NSAmIHQuY2hhckNvZGVBdCh5ICsgMTQpKSA8PCAxNiB8ICgyNTUgJiB0LmNoYXJDb2RlQXQoeSArIDE1KSkgPDwgMjQsIDI1NSAmIHQuY2hhckNvZGVBdCh5ICsgOCkgfCAoMjU1ICYgdC5jaGFyQ29kZUF0KHkgKyA5KSkgPDwgOCB8ICgyNTUgJiB0LmNoYXJDb2RlQXQoeSArIDEwKSkgPDwgMTYgfCAoMjU1ICYgdC5jaGFyQ29kZUF0KHkgKyAxMSkpIDw8IDI0XSwgZiA9IG8oZiA9IG4oZiwgZCksIDMxKSwgZiA9IG4oZiwgdiksIGwgPSByKGwgPSBvKGwgPSBhKGwsIGYpLCAyNyksIGgpLCBsID0gcihuKGwsIFswLCA1XSksIFswLCAxMzkwMjA4ODA5XSksIHAgPSBvKHAgPSBuKHAsIHYpLCAzMyksIHAgPSBuKHAsIGQpLCBoID0gcihoID0gbyhoID0gYShoLCBwKSwgMzEpLCBsKSwgaCA9IHIobihoLCBbMCwgNV0pLCBbMCwgOTQ0MzMxNDQ1XSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAoZiA9IFswLCAwXSwgcCA9IFswLCAwXSwgYykge1xuICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgIHAgPSBhKHAsIGkoWzAsIHQuY2hhckNvZGVBdCh5ICsgMTQpXSwgNDgpKTtcblxuICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgIHAgPSBhKHAsIGkoWzAsIHQuY2hhckNvZGVBdCh5ICsgMTMpXSwgNDApKTtcblxuICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgIHAgPSBhKHAsIGkoWzAsIHQuY2hhckNvZGVBdCh5ICsgMTIpXSwgMzIpKTtcblxuICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgIHAgPSBhKHAsIGkoWzAsIHQuY2hhckNvZGVBdCh5ICsgMTEpXSwgMjQpKTtcblxuICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgIHAgPSBhKHAsIGkoWzAsIHQuY2hhckNvZGVBdCh5ICsgMTApXSwgMTYpKTtcblxuICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgIHAgPSBhKHAsIGkoWzAsIHQuY2hhckNvZGVBdCh5ICsgOSldLCA4KSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgIHAgPSBhKHAsIFswLCB0LmNoYXJDb2RlQXQoeSArIDgpXSksIHAgPSBvKHAgPSBuKHAsIHYpLCAzMyksIHAgPSBuKHAsIGQpLCBoID0gYShoLCBwKTtcblxuICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgZiA9IGEoZiwgaShbMCwgdC5jaGFyQ29kZUF0KHkgKyA3KV0sIDU2KSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgIGYgPSBhKGYsIGkoWzAsIHQuY2hhckNvZGVBdCh5ICsgNildLCA0OCkpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICBmID0gYShmLCBpKFswLCB0LmNoYXJDb2RlQXQoeSArIDUpXSwgNDApKTtcblxuICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgZiA9IGEoZiwgaShbMCwgdC5jaGFyQ29kZUF0KHkgKyA0KV0sIDMyKSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIGYgPSBhKGYsIGkoWzAsIHQuY2hhckNvZGVBdCh5ICsgMyldLCAyNCkpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICBmID0gYShmLCBpKFswLCB0LmNoYXJDb2RlQXQoeSArIDIpXSwgMTYpKTtcblxuICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgZiA9IGEoZiwgaShbMCwgdC5jaGFyQ29kZUF0KHkgKyAxKV0sIDgpKTtcblxuICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZiA9IGEoZiwgW3QuY2hhckNvZGVBdCh5KV0pLCBmID0gbyhmID0gbihmLCBkKSwgMzEpLCBmID0gbihmLCB2KSwgbCA9IGEobCwgZik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBsID0gYShsLCBbMCwgdC5sZW5ndGhdKSwgaCA9IHIoaCA9IGEoaCwgWzAsIHQubGVuZ3RoXSksIGwgPSByKGwsIGgpKSwgbCA9IHMobCksIGggPSByKGggPSBzKGgpLCBsID0gcihsLCBoKSksIChcIjAwMDAwMDAwXCIgKyAobFswXSA+Pj4gMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtOCkgKyAoXCIwMDAwMDAwMFwiICsgKGxbMV0gPj4+IDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTgpICsgKFwiMDAwMDAwMDBcIiArIChoWzBdID4+PiAwKS50b1N0cmluZygxNikpLnNsaWNlKC04KSArIChcIjAwMDAwMDAwXCIgKyAoaFsxXSA+Pj4gMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtOCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XSkgJiYgZShvLnByb3RvdHlwZSwgaSksIHI7XG4gICAgICB9KCk7XG4gICAgfSgpO1xuICB9KSxcbiAgICAgIEggPSBcImxvZ2lkX3N0YXJ0XCIsXG4gICAgICB6ID0gXCI0LjUuNi13ZWJcIjtcblxuICByZXR1cm4gZnVuY3Rpb24gKHIpIHtcbiAgICBmdW5jdGlvbiBuKHQpIHtcbiAgICAgIHZhciBlID0gci5jYWxsKHRoaXMsIHQpIHx8IHRoaXM7XG4gICAgICBlLnFpbWVpMzYgPSBcIlwiLCBlLnVzZWxlc3NDeWNsZVRhc2tOdW0gPSAwLCBlLnVuZGVyV2Vha05ldCA9ICExLCBlLnNlbmQgPSBmdW5jdGlvbiAodCwgciwgbikge1xuICAgICAgICBlLnN0b3JhZ2Uuc2V0SXRlbShhLCBEYXRlLm5vdygpLnRvU3RyaW5nKCkpLCBlLm5ldHdvcmsucG9zdChlLnVwbG9hZFVybCB8fCBlLnN0cmF0ZWd5LmdldFVwbG9hZFVybCgpLCB0LmRhdGEpLnRoZW4oZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICB2YXIgbztcbiAgICAgICAgICAxMDAgPT0gKG51bGwgPT09IChvID0gbnVsbCA9PSBuID8gdm9pZCAwIDogbi5kYXRhKSB8fCB2b2lkIDAgPT09IG8gPyB2b2lkIDAgOiBvLnJlc3VsdCkgPyBlLmRlbGF5VGltZSA9IDFlMyAqIG4uZGF0YS5kZWxheVRpbWUgOiBlLmRlbGF5VGltZSA9IDAsIHIgJiYgcih0LmRhdGEpLCB0LmRhdGEuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGUuc3RvcmUucmVtb3ZlRXZlbnQodCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGUucmVtb3ZlU2VuZGluZ0lkKHAodC5tYXBWYWx1ZSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksIGUuZG9DdXN0b21DeWNsZVRhc2soKTtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICB2YXIgbyA9IHQuZGF0YS5ldmVudHM7XG4gICAgICAgICAgZS5lcnJvclJlcG9ydC5yZXBvcnRFcnJvcihyLmNvZGUgPyByLmNvZGUudG9TdHJpbmcoKSA6IFwiNjAwXCIsIHIubWVzc2FnZSksIG4gJiYgbih0LmRhdGEpO1xuICAgICAgICAgIHZhciBpID0gSlNPTi5wYXJzZShlLnN0b3JhZ2UuZ2V0SXRlbShzKSk7XG4gICAgICAgICAgby5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICBpICYmIC0xICE9IGkuaW5kZXhPZihwKHQpKSAmJiBlLnN0b3JlLmluc2VydEV2ZW50KHQsIGZ1bmN0aW9uICh0LCByKSB7XG4gICAgICAgICAgICAgIHQgJiYgZS5lcnJvclJlcG9ydC5yZXBvcnRFcnJvcihcIjYwNFwiLCBcImluc2VydEV2ZW50IGZhaWwhXCIpO1xuICAgICAgICAgICAgfSksIGUucmVtb3ZlU2VuZGluZ0lkKHAodCkpO1xuICAgICAgICAgIH0pLCBlLm1vbml0b3JVcGxvYWRGYWlsZWQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgdmFyIG4sXG4gICAgICAgICAgbyxcbiAgICAgICAgICBpID0gYigpO1xuICAgICAgcmV0dXJuIGUuaXNVbmRlcklFOCA9IGkgPiAwICYmIGkgPCA4LCBlLmlzVW5kZXJJRTggfHwgKGUuaXNVbmRlcklFID0gaSA+IDAsIHQubmVlZEluaXRRaW1laSAmJiBlLmluaXRRaW1laSh0LmFwcGtleSksIGUubmV0d29yayA9IG5ldyBRKHQpLCBlLnN0b3JhZ2UgPSBuZXcgSyh0LmFwcGtleSksIGUuaW5pdENvbW1vbkluZm8odCksIGUuc3RvcmUgPSBuZXcgXyh0LmFwcGtleSwgZS5zdG9yYWdlKSwgZS5lcnJvclJlcG9ydCA9IG5ldyB5KGUuY29uZmlnLCBlLmNvbW1vbkluZm8sIFwid2ViXCIsIGUubmV0d29yayksIGUuc3RyYXRlZ3kgPSBuZXcgZyhlLmNvbmZpZywgZS5jb21tb25JbmZvLCBlLnN0b3JhZ2UsIGUubmV0d29yayksIGUubG9naWRTdGFydFRpbWUgPSBlLnN0b3JhZ2UuZ2V0SXRlbShIKSwgZS5sb2dpZFN0YXJ0VGltZSB8fCAoZS5sb2dpZFN0YXJ0VGltZSA9IERhdGUubm93KCkudG9TdHJpbmcoKSwgZS5zdG9yYWdlLnNldEl0ZW0oSCwgZS5sb2dpZFN0YXJ0VGltZSkpLCBuID0gZS5sb2dpZFN0YXJ0VGltZSwgbyA9IERhdGUubm93KCkgLSBOdW1iZXIucGFyc2VGbG9hdChuKSwgTWF0aC5mbG9vcihvIC8gODY0ZTUpID49IDM2NSAmJiBlLnN0b3JhZ2UuY2xlYXIoKSwgZS5pbml0U2Vzc2lvbih0KSwgZS5vbkRpcmVjdFVzZXJBY3Rpb24oXCJycWRfanNfaW5pdFwiLCB7fSksIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZS5saWZlQ3ljbGUuZW1pdChcImluaXRcIik7XG4gICAgICB9LCAwKSwgZS5pbml0RGVsYXlUaW1lID0gdC5kZWxheSA/IHQuZGVsYXkgOiAxZTMsIGUuY3ljbGVUYXNrKGUuaW5pdERlbGF5VGltZSkpLCBlO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoZSwgcikge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgciAmJiBudWxsICE9PSByKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhyKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG5cbiAgICAgIGZ1bmN0aW9uIG4oKSB7XG4gICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBlO1xuICAgICAgfVxuXG4gICAgICBfdChlLCByKSwgZS5wcm90b3R5cGUgPSBudWxsID09PSByID8gT2JqZWN0LmNyZWF0ZShyKSA6IChuLnByb3RvdHlwZSA9IHIucHJvdG90eXBlLCBuZXcgbigpKTtcbiAgICB9KG4sIHIpLCBuLnByb3RvdHlwZS5pbml0UWltZWkgPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSB0aGlzO1xuICAgICAgbmV3IFcoKS5nZXRRaW1laTM2KHQsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGUucWltZWkzNiA9IHQucTM2O1xuICAgICAgfSk7XG4gICAgfSwgbi5wcm90b3R5cGUuaW5pdFNlc3Npb24gPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSAxOGU1O1xuICAgICAgdC5zZXNzaW9uRHVyYXRpb24gJiYgdC5zZXNzaW9uRHVyYXRpb24gPiAzZTQgJiYgKGUgPSB0LnNlc3Npb25EdXJhdGlvbiksIHRoaXMuYmVhY29uU2Vzc2lvbiA9IG5ldyB3KHRoaXMuc3RvcmFnZSwgZSwgdGhpcyk7XG4gICAgfSwgbi5wcm90b3R5cGUuaW5pdENvbW1vbkluZm8gPSBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGUgPSBOdW1iZXIodGhpcy5zdG9yYWdlLmdldEl0ZW0oYSkpO1xuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgciA9IEpTT04ucGFyc2UodGhpcy5zdG9yYWdlLmdldEl0ZW0ocykpO1xuICAgICAgICAoRGF0ZS5ub3coKSAtIGUgPiAzZTQgfHwgIXIpICYmIHRoaXMuc3RvcmFnZS5zZXRJdGVtKHMsIEpTT04uc3RyaW5naWZ5KFtdKSk7XG4gICAgICB9IGNhdGNoICh0KSB7fVxuXG4gICAgICB0LnVwbG9hZFVybCAmJiAodGhpcy51cGxvYWRVcmwgPSB0LnVwbG9hZFVybCArIFwiP2FwcGtleT1cIiArIHQuYXBwa2V5KTtcbiAgICAgIHZhciBuID0gW3dpbmRvdy5zY3JlZW4ud2lkdGgsIHdpbmRvdy5zY3JlZW4uaGVpZ2h0XTtcbiAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICYmIG4ucHVzaCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyksIHRoaXMuY29tbW9uSW5mbyA9IHtcbiAgICAgICAgZGV2aWNlSWQ6IHRoaXMuc3RvcmFnZS5jcmVhdGVEZXZpY2VJZCgpLFxuICAgICAgICBsYW5ndWFnZTogbmF2aWdhdG9yICYmIG5hdmlnYXRvci5sYW5ndWFnZSB8fCBcInpoX0NOXCIsXG4gICAgICAgIHF1ZXJ5OiB3aW5kb3cubG9jYXRpb24uc2VhcmNoLFxuICAgICAgICB1c2VyQWdlbnQ6IG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgICAgIHBpeGVsOiBuLmpvaW4oXCIqXCIpLFxuICAgICAgICBjaGFubmVsSUQ6IHQuY2hhbm5lbElEID8gU3RyaW5nKHQuY2hhbm5lbElEKSA6IFwiXCIsXG4gICAgICAgIG9wZW5pZDogdC5vcGVuaWQgPyBTdHJpbmcodC5vcGVuaWQpIDogXCJcIixcbiAgICAgICAgdW5pZDogdC51bmlvbmlkID8gU3RyaW5nKHQudW5pb25pZCkgOiBcIlwiLFxuICAgICAgICBzZGtWZXJzaW9uOiB6XG4gICAgICB9LCB0aGlzLmNvbmZpZy5hcHBWZXJzaW9uID0gdC52ZXJzaW9uQ29kZSA/IFN0cmluZyh0LnZlcnNpb25Db2RlKSA6IFwiXCIsIHRoaXMuY29uZmlnLnN0cmljdE1vZGUgPSB0LnN0cmljdE1vZGU7XG4gICAgfSwgbi5wcm90b3R5cGUuY3ljbGVUYXNrID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBlID0gdGhpcztcbiAgICAgIHRoaXMuaW50ZXJ2YWxJRCA9IHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGUuc3RvcmUuZ2V0RXZlbnRzKCkudGhlbihmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHZhciByID0gW10sXG4gICAgICAgICAgICAgIG4gPSBKU09OLnBhcnNlKGUuc3RvcmFnZS5nZXRJdGVtKHMpKTtcbiAgICAgICAgICBuIHx8IChuID0gW10pLCB0ICYmIHQuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgdmFyIGUgPSBwKHQubWFwVmFsdWUpO1xuICAgICAgICAgICAgLTEgPT0gbi5pbmRleE9mKGUpICYmIChyLnB1c2godCksIG4ucHVzaChlKSk7XG4gICAgICAgICAgfSksIDAgIT0gci5sZW5ndGggJiYgKGUuc3RvcmFnZS5zZXRJdGVtKHMsIEpTT04uc3RyaW5naWZ5KG4pKSwgZS5fbm9ybWFsTG9nUGlwZWxpbmUoZS5hc3NlbWJsZURhdGEocikpKTtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHQpIHt9KTtcbiAgICAgIH0sIHQpO1xuICAgIH0sIG4ucHJvdG90eXBlLm9uUmVwb3J0ID0gZnVuY3Rpb24gKHQsIGUsIHIpIHtcbiAgICAgIHZhciBuID0gdGhpcztcbiAgICAgIGlmICh0aGlzLmlzVW5kZXJJRTgpIHRoaXMuZXJyb3JSZXBvcnQucmVwb3J0RXJyb3IoXCI2MDFcIiwgXCJVbmRlcklFOFwiKTtlbHNlIHtcbiAgICAgICAgdmFyIG8gPSB0aGlzLmdlbmVyYXRlRGF0YSh0LCBlLCByKTtcbiAgICAgICAgaWYgKHIgJiYgMCA9PSB0aGlzLmRlbGF5VGltZSAmJiAhdGhpcy51bmRlcldlYWtOZXQpIHRoaXMuX25vcm1hbExvZ1BpcGVsaW5lKHRoaXMuYXNzZW1ibGVEYXRhKG8pKTtlbHNlIHtcbiAgICAgICAgICB2YXIgaSA9IG8uc2hpZnQoKTtcbiAgICAgICAgICBpICYmIHRoaXMuc3RvcmUuaW5zZXJ0RXZlbnQoaSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHQgJiYgbi5lcnJvclJlcG9ydC5yZXBvcnRFcnJvcihcIjYwNFwiLCBcImluc2VydEV2ZW50IGZhaWwhXCIpO1xuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICBuLl9ub3JtYWxMb2dQaXBlbGluZShuLmFzc2VtYmxlRGF0YShvKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBuLnByb3RvdHlwZS5vblNlbmRCZWFjb24gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgaWYgKHRoaXMuaXNVbmRlcklFKSB0aGlzLmVycm9yUmVwb3J0LnJlcG9ydEVycm9yKFwiNjA1XCIsIFwiVW5kZXJJRVwiKTtlbHNlIHtcbiAgICAgICAgdmFyIHIgPSB0aGlzLmFzc2VtYmxlRGF0YSh0aGlzLmdlbmVyYXRlRGF0YSh0LCBlLCAhMCkpO1xuICAgICAgICBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIG5hdmlnYXRvci5zZW5kQmVhY29uICYmIG5hdmlnYXRvci5zZW5kQmVhY29uKHRoaXMudXBsb2FkVXJsIHx8IHRoaXMuc3RyYXRlZ3kuZ2V0VXBsb2FkVXJsKCksIEpTT04uc3RyaW5naWZ5KHIpKTtcbiAgICAgIH1cbiAgICB9LCBuLnByb3RvdHlwZS5nZW5lcmF0ZURhdGEgPSBmdW5jdGlvbiAodCwgciwgbikge1xuICAgICAgdmFyIG8gPSBbXSxcbiAgICAgICAgICBpID0gXCI0LjUuNi13ZWJfXCIgKyAobiA/IFwiZGlyZWN0X2xvZ19pZFwiIDogXCJub3JtYWxfbG9nX2lkXCIpLFxuICAgICAgICAgIGEgPSBOdW1iZXIodGhpcy5zdG9yYWdlLmdldEl0ZW0oaSkpO1xuICAgICAgcmV0dXJuIGEgPSBhIHx8IDEsIHIgPSBfZShfZSh7fSwgciksIHtcbiAgICAgICAgQTk5OiBuID8gXCJZXCIgOiBcIk5cIixcbiAgICAgICAgQTEwMDogYS50b1N0cmluZygpLFxuICAgICAgICBBNzI6IHosXG4gICAgICAgIEE4ODogdGhpcy5sb2dpZFN0YXJ0VGltZVxuICAgICAgfSksIGErKywgdGhpcy5zdG9yYWdlLnNldEl0ZW0oaSwgYS50b1N0cmluZygpKSwgby5wdXNoKHtcbiAgICAgICAgZXZlbnRDb2RlOiB0LFxuICAgICAgICBldmVudFRpbWU6IERhdGUubm93KCkudG9TdHJpbmcoKSxcbiAgICAgICAgbWFwVmFsdWU6IGgociwgdGhpcy5jb25maWcuc3RyaWN0TW9kZSlcbiAgICAgIH0pLCBvO1xuICAgIH0sIG4ucHJvdG90eXBlLmFzc2VtYmxlRGF0YSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICB2YXIgciA9IHRoaXMuYmVhY29uU2Vzc2lvbi5nZXRTZXNzaW9uKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBWZXJzaW9uOiB0aGlzLmNvbmZpZy5hcHBWZXJzaW9uID8gZih0aGlzLmNvbmZpZy5hcHBWZXJzaW9uKSA6IFwiXCIsXG4gICAgICAgIHNka0lkOiBcImpzXCIsXG4gICAgICAgIHNka1ZlcnNpb246IHosXG4gICAgICAgIG1haW5BcHBLZXk6IHRoaXMuY29uZmlnLmFwcGtleSxcbiAgICAgICAgcGxhdGZvcm1JZDogMyxcbiAgICAgICAgY29tbW9uOiBoKF9lKF9lKHt9LCB0aGlzLmFkZGl0aW9uYWxQYXJhbXMpLCB7XG4gICAgICAgICAgQTI6IHRoaXMuY29tbW9uSW5mby5kZXZpY2VJZCxcbiAgICAgICAgICBBODogdGhpcy5jb21tb25JbmZvLm9wZW5pZCxcbiAgICAgICAgICBBMTI6IHRoaXMuY29tbW9uSW5mby5sYW5ndWFnZSxcbiAgICAgICAgICBBMTc6IHRoaXMuY29tbW9uSW5mby5waXhlbCxcbiAgICAgICAgICBBMjM6IHRoaXMuY29tbW9uSW5mby5jaGFubmVsSUQsXG4gICAgICAgICAgQTUwOiB0aGlzLmNvbW1vbkluZm8udW5pZCxcbiAgICAgICAgICBBNzY6IHIuc2Vzc2lvbklkLFxuICAgICAgICAgIEExMDE6IHRoaXMuY29tbW9uSW5mby51c2VyQWdlbnQsXG4gICAgICAgICAgQTEwMjogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgICAgICAgQTEwNDogZG9jdW1lbnQucmVmZXJyZXIsXG4gICAgICAgICAgQTExOTogdGhpcy5jb21tb25JbmZvLnF1ZXJ5LFxuICAgICAgICAgIEExNTM6IHRoaXMucWltZWkzNlxuICAgICAgICB9KSwgITEpLFxuICAgICAgICBldmVudHM6IHRcbiAgICAgIH07XG4gICAgfSwgbi5wcm90b3R5cGUubW9uaXRvclVwbG9hZEZhaWxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudXNlbGVzc0N5Y2xlVGFza051bSsrLCB0aGlzLnVzZWxlc3NDeWNsZVRhc2tOdW0gPj0gNSAmJiAod2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElEKSwgdGhpcy5jeWNsZVRhc2soNmU0KSwgdGhpcy51bmRlcldlYWtOZXQgPSAhMCk7XG4gICAgfSwgbi5wcm90b3R5cGUuZG9DdXN0b21DeWNsZVRhc2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnVzZWxlc3NDeWNsZVRhc2tOdW0gPj0gNSAmJiAod2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElEKSwgdGhpcy5jeWNsZVRhc2sodGhpcy5pbml0RGVsYXlUaW1lKSksIHRoaXMudXNlbGVzc0N5Y2xlVGFza051bSA9IDAsIHRoaXMudW5kZXJXZWFrTmV0ID0gITE7XG4gICAgfSwgbjtcbiAgfSh2KTtcbn0pOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG4vKlxuIENyeXB0b0pTIHYzLjEuMlxuIGNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuIChjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIGNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiAqL1xudmFyIENyeXB0b0pTID0gQ3J5cHRvSlMgfHwgZnVuY3Rpb24gKGcsIGwpIHtcbiAgdmFyIGUgPSB7fSxcbiAgICAgIGQgPSBlLmxpYiA9IHt9LFxuICAgICAgbSA9IGZ1bmN0aW9uIG0oKSB7fSxcbiAgICAgIGsgPSBkLkJhc2UgPSB7XG4gICAgZXh0ZW5kOiBmdW5jdGlvbiBleHRlbmQoYSkge1xuICAgICAgbS5wcm90b3R5cGUgPSB0aGlzO1xuICAgICAgdmFyIGMgPSBuZXcgbSgpO1xuICAgICAgYSAmJiBjLm1peEluKGEpO1xuICAgICAgYy5oYXNPd25Qcm9wZXJ0eShcImluaXRcIikgfHwgKGMuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYy4kc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfSk7XG4gICAgICBjLmluaXQucHJvdG90eXBlID0gYztcbiAgICAgIGMuJHN1cGVyID0gdGhpcztcbiAgICAgIHJldHVybiBjO1xuICAgIH0sXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgYSA9IHRoaXMuZXh0ZW5kKCk7XG4gICAgICBhLmluaXQuYXBwbHkoYSwgYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHt9LFxuICAgIG1peEluOiBmdW5jdGlvbiBtaXhJbihhKSB7XG4gICAgICBmb3IgKHZhciBjIGluIGEpIHtcbiAgICAgICAgYS5oYXNPd25Qcm9wZXJ0eShjKSAmJiAodGhpc1tjXSA9IGFbY10pO1xuICAgICAgfVxuXG4gICAgICBhLmhhc093blByb3BlcnR5KFwidG9TdHJpbmdcIikgJiYgKHRoaXMudG9TdHJpbmcgPSBhLnRvU3RyaW5nKTtcbiAgICB9LFxuICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKTtcbiAgICB9XG4gIH0sXG4gICAgICBwID0gZC5Xb3JkQXJyYXkgPSBrLmV4dGVuZCh7XG4gICAgaW5pdDogZnVuY3Rpb24gaW5pdChhLCBjKSB7XG4gICAgICBhID0gdGhpcy53b3JkcyA9IGEgfHwgW107XG4gICAgICB0aGlzLnNpZ0J5dGVzID0gYyAhPSBsID8gYyA6IDQgKiBhLmxlbmd0aDtcbiAgICB9LFxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZyhhKSB7XG4gICAgICByZXR1cm4gKGEgfHwgbikuc3RyaW5naWZ5KHRoaXMpO1xuICAgIH0sXG4gICAgY29uY2F0OiBmdW5jdGlvbiBjb25jYXQoYSkge1xuICAgICAgdmFyIGMgPSB0aGlzLndvcmRzLFxuICAgICAgICAgIHEgPSBhLndvcmRzLFxuICAgICAgICAgIGYgPSB0aGlzLnNpZ0J5dGVzO1xuICAgICAgYSA9IGEuc2lnQnl0ZXM7XG4gICAgICB0aGlzLmNsYW1wKCk7XG4gICAgICBpZiAoZiAlIDQpIGZvciAodmFyIGIgPSAwOyBiIDwgYTsgYisrKSB7XG4gICAgICAgIGNbZiArIGIgPj4+IDJdIHw9IChxW2IgPj4+IDJdID4+PiAyNCAtIDggKiAoYiAlIDQpICYgMjU1KSA8PCAyNCAtIDggKiAoKGYgKyBiKSAlIDQpO1xuICAgICAgfSBlbHNlIGlmICg2NTUzNSA8IHEubGVuZ3RoKSBmb3IgKGIgPSAwOyBiIDwgYTsgYiArPSA0KSB7XG4gICAgICAgIGNbZiArIGIgPj4+IDJdID0gcVtiID4+PiAyXTtcbiAgICAgIH0gZWxzZSBjLnB1c2guYXBwbHkoYywgcSk7XG4gICAgICB0aGlzLnNpZ0J5dGVzICs9IGE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGNsYW1wOiBmdW5jdGlvbiBjbGFtcCgpIHtcbiAgICAgIHZhciBhID0gdGhpcy53b3JkcyxcbiAgICAgICAgICBjID0gdGhpcy5zaWdCeXRlcztcbiAgICAgIGFbYyA+Pj4gMl0gJj0gNDI5NDk2NzI5NSA8PCAzMiAtIDggKiAoYyAlIDQpO1xuICAgICAgYS5sZW5ndGggPSBnLmNlaWwoYyAvIDQpO1xuICAgIH0sXG4gICAgY2xvbmU6IGZ1bmN0aW9uIGNsb25lKCkge1xuICAgICAgdmFyIGEgPSBrLmNsb25lLmNhbGwodGhpcyk7XG4gICAgICBhLndvcmRzID0gdGhpcy53b3Jkcy5zbGljZSgwKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH0sXG4gICAgcmFuZG9tOiBmdW5jdGlvbiByYW5kb20oYSkge1xuICAgICAgZm9yICh2YXIgYyA9IFtdLCBiID0gMDsgYiA8IGE7IGIgKz0gNCkge1xuICAgICAgICBjLnB1c2goNDI5NDk2NzI5NiAqIGcucmFuZG9tKCkgfCAwKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBwLmluaXQoYywgYSk7XG4gICAgfVxuICB9KSxcbiAgICAgIGIgPSBlLmVuYyA9IHt9LFxuICAgICAgbiA9IGIuSGV4ID0ge1xuICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGEpIHtcbiAgICAgIHZhciBjID0gYS53b3JkcztcbiAgICAgIGEgPSBhLnNpZ0J5dGVzO1xuXG4gICAgICBmb3IgKHZhciBiID0gW10sIGYgPSAwOyBmIDwgYTsgZisrKSB7XG4gICAgICAgIHZhciBkID0gY1tmID4+PiAyXSA+Pj4gMjQgLSA4ICogKGYgJSA0KSAmIDI1NTtcbiAgICAgICAgYi5wdXNoKChkID4+PiA0KS50b1N0cmluZygxNikpO1xuICAgICAgICBiLnB1c2goKGQgJiAxNSkudG9TdHJpbmcoMTYpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGIuam9pbihcIlwiKTtcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShhKSB7XG4gICAgICBmb3IgKHZhciBjID0gYS5sZW5ndGgsIGIgPSBbXSwgZiA9IDA7IGYgPCBjOyBmICs9IDIpIHtcbiAgICAgICAgYltmID4+PiAzXSB8PSBwYXJzZUludChhLnN1YnN0cihmLCAyKSwgMTYpIDw8IDI0IC0gNCAqIChmICUgOCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgcC5pbml0KGIsIGMgLyAyKTtcbiAgICB9XG4gIH0sXG4gICAgICBqID0gYi5MYXRpbjEgPSB7XG4gICAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoYSkge1xuICAgICAgdmFyIGMgPSBhLndvcmRzO1xuICAgICAgYSA9IGEuc2lnQnl0ZXM7XG5cbiAgICAgIGZvciAodmFyIGIgPSBbXSwgZiA9IDA7IGYgPCBhOyBmKyspIHtcbiAgICAgICAgYi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY1tmID4+PiAyXSA+Pj4gMjQgLSA4ICogKGYgJSA0KSAmIDI1NSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYi5qb2luKFwiXCIpO1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGEpIHtcbiAgICAgIGZvciAodmFyIGMgPSBhLmxlbmd0aCwgYiA9IFtdLCBmID0gMDsgZiA8IGM7IGYrKykge1xuICAgICAgICBiW2YgPj4+IDJdIHw9IChhLmNoYXJDb2RlQXQoZikgJiAyNTUpIDw8IDI0IC0gOCAqIChmICUgNCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgcC5pbml0KGIsIGMpO1xuICAgIH1cbiAgfSxcbiAgICAgIGggPSBiLlV0ZjggPSB7XG4gICAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoYSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoai5zdHJpbmdpZnkoYSkpKTtcbiAgICAgIH0gY2F0Y2ggKGMpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJNYWxmb3JtZWQgVVRGLTggZGF0YVwiKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShhKSB7XG4gICAgICByZXR1cm4gai5wYXJzZSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYSkpKTtcbiAgICB9XG4gIH0sXG4gICAgICByID0gZC5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtID0gay5leHRlbmQoe1xuICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXcgcC5pbml0KCk7XG4gICAgICB0aGlzLl9uRGF0YUJ5dGVzID0gMDtcbiAgICB9LFxuICAgIF9hcHBlbmQ6IGZ1bmN0aW9uIF9hcHBlbmQoYSkge1xuICAgICAgXCJzdHJpbmdcIiA9PSB0eXBlb2YgYSAmJiAoYSA9IGgucGFyc2UoYSkpO1xuXG4gICAgICB0aGlzLl9kYXRhLmNvbmNhdChhKTtcblxuICAgICAgdGhpcy5fbkRhdGFCeXRlcyArPSBhLnNpZ0J5dGVzO1xuICAgIH0sXG4gICAgX3Byb2Nlc3M6IGZ1bmN0aW9uIF9wcm9jZXNzKGEpIHtcbiAgICAgIHZhciBjID0gdGhpcy5fZGF0YSxcbiAgICAgICAgICBiID0gYy53b3JkcyxcbiAgICAgICAgICBmID0gYy5zaWdCeXRlcyxcbiAgICAgICAgICBkID0gdGhpcy5ibG9ja1NpemUsXG4gICAgICAgICAgZSA9IGYgLyAoNCAqIGQpLFxuICAgICAgICAgIGUgPSBhID8gZy5jZWlsKGUpIDogZy5tYXgoKGUgfCAwKSAtIHRoaXMuX21pbkJ1ZmZlclNpemUsIDApO1xuICAgICAgYSA9IGUgKiBkO1xuICAgICAgZiA9IGcubWluKDQgKiBhLCBmKTtcblxuICAgICAgaWYgKGEpIHtcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBhOyBrICs9IGQpIHtcbiAgICAgICAgICB0aGlzLl9kb1Byb2Nlc3NCbG9jayhiLCBrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGsgPSBiLnNwbGljZSgwLCBhKTtcbiAgICAgICAgYy5zaWdCeXRlcyAtPSBmO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IHAuaW5pdChrLCBmKTtcbiAgICB9LFxuICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgIHZhciBhID0gay5jbG9uZS5jYWxsKHRoaXMpO1xuICAgICAgYS5fZGF0YSA9IHRoaXMuX2RhdGEuY2xvbmUoKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH0sXG4gICAgX21pbkJ1ZmZlclNpemU6IDBcbiAgfSk7XG5cbiAgZC5IYXNoZXIgPSByLmV4dGVuZCh7XG4gICAgY2ZnOiBrLmV4dGVuZCgpLFxuICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoYSkge1xuICAgICAgdGhpcy5jZmcgPSB0aGlzLmNmZy5leHRlbmQoYSk7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSxcbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICByLnJlc2V0LmNhbGwodGhpcyk7XG5cbiAgICAgIHRoaXMuX2RvUmVzZXQoKTtcbiAgICB9LFxuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGEpIHtcbiAgICAgIHRoaXMuX2FwcGVuZChhKTtcblxuICAgICAgdGhpcy5fcHJvY2VzcygpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGZpbmFsaXplOiBmdW5jdGlvbiBmaW5hbGl6ZShhKSB7XG4gICAgICBhICYmIHRoaXMuX2FwcGVuZChhKTtcbiAgICAgIHJldHVybiB0aGlzLl9kb0ZpbmFsaXplKCk7XG4gICAgfSxcbiAgICBibG9ja1NpemU6IDE2LFxuICAgIF9jcmVhdGVIZWxwZXI6IGZ1bmN0aW9uIF9jcmVhdGVIZWxwZXIoYSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChiLCBkKSB7XG4gICAgICAgIHJldHVybiBuZXcgYS5pbml0KGQpLmZpbmFsaXplKGIpO1xuICAgICAgfTtcbiAgICB9LFxuICAgIF9jcmVhdGVIbWFjSGVscGVyOiBmdW5jdGlvbiBfY3JlYXRlSG1hY0hlbHBlcihhKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGIsIGQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBzLkhNQUMuaW5pdChhLCBkKS5maW5hbGl6ZShiKTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbiAgdmFyIHMgPSBlLmFsZ28gPSB7fTtcbiAgcmV0dXJuIGU7XG59KE1hdGgpO1xuXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgZyA9IENyeXB0b0pTLFxuICAgICAgbCA9IGcubGliLFxuICAgICAgZSA9IGwuV29yZEFycmF5LFxuICAgICAgZCA9IGwuSGFzaGVyLFxuICAgICAgbSA9IFtdLFxuICAgICAgbCA9IGcuYWxnby5TSEExID0gZC5leHRlbmQoe1xuICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiBfZG9SZXNldCgpIHtcbiAgICAgIHRoaXMuX2hhc2ggPSBuZXcgZS5pbml0KFsxNzMyNTg0MTkzLCA0MDIzMjMzNDE3LCAyNTYyMzgzMTAyLCAyNzE3MzM4NzgsIDMyODUzNzc1MjBdKTtcbiAgICB9LFxuICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gX2RvUHJvY2Vzc0Jsb2NrKGQsIGUpIHtcbiAgICAgIGZvciAodmFyIGIgPSB0aGlzLl9oYXNoLndvcmRzLCBuID0gYlswXSwgaiA9IGJbMV0sIGggPSBiWzJdLCBnID0gYlszXSwgbCA9IGJbNF0sIGEgPSAwOyA4MCA+IGE7IGErKykge1xuICAgICAgICBpZiAoMTYgPiBhKSBtW2FdID0gZFtlICsgYV0gfCAwO2Vsc2Uge1xuICAgICAgICAgIHZhciBjID0gbVthIC0gM10gXiBtW2EgLSA4XSBeIG1bYSAtIDE0XSBeIG1bYSAtIDE2XTtcbiAgICAgICAgICBtW2FdID0gYyA8PCAxIHwgYyA+Pj4gMzE7XG4gICAgICAgIH1cbiAgICAgICAgYyA9IChuIDw8IDUgfCBuID4+PiAyNykgKyBsICsgbVthXTtcbiAgICAgICAgYyA9IDIwID4gYSA/IGMgKyAoKGogJiBoIHwgfmogJiBnKSArIDE1MTg1MDAyNDkpIDogNDAgPiBhID8gYyArICgoaiBeIGggXiBnKSArIDE4NTk3NzUzOTMpIDogNjAgPiBhID8gYyArICgoaiAmIGggfCBqICYgZyB8IGggJiBnKSAtIDE4OTQwMDc1ODgpIDogYyArICgoaiBeIGggXiBnKSAtIDg5OTQ5NzUxNCk7XG4gICAgICAgIGwgPSBnO1xuICAgICAgICBnID0gaDtcbiAgICAgICAgaCA9IGogPDwgMzAgfCBqID4+PiAyO1xuICAgICAgICBqID0gbjtcbiAgICAgICAgbiA9IGM7XG4gICAgICB9XG5cbiAgICAgIGJbMF0gPSBiWzBdICsgbiB8IDA7XG4gICAgICBiWzFdID0gYlsxXSArIGogfCAwO1xuICAgICAgYlsyXSA9IGJbMl0gKyBoIHwgMDtcbiAgICAgIGJbM10gPSBiWzNdICsgZyB8IDA7XG4gICAgICBiWzRdID0gYls0XSArIGwgfCAwO1xuICAgIH0sXG4gICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uIF9kb0ZpbmFsaXplKCkge1xuICAgICAgdmFyIGQgPSB0aGlzLl9kYXRhLFxuICAgICAgICAgIGUgPSBkLndvcmRzLFxuICAgICAgICAgIGIgPSA4ICogdGhpcy5fbkRhdGFCeXRlcyxcbiAgICAgICAgICBnID0gOCAqIGQuc2lnQnl0ZXM7XG4gICAgICBlW2cgPj4+IDVdIHw9IDEyOCA8PCAyNCAtIGcgJSAzMjtcbiAgICAgIGVbKGcgKyA2NCA+Pj4gOSA8PCA0KSArIDE0XSA9IE1hdGguZmxvb3IoYiAvIDQyOTQ5NjcyOTYpO1xuICAgICAgZVsoZyArIDY0ID4+PiA5IDw8IDQpICsgMTVdID0gYjtcbiAgICAgIGQuc2lnQnl0ZXMgPSA0ICogZS5sZW5ndGg7XG5cbiAgICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuICAgICAgcmV0dXJuIHRoaXMuX2hhc2g7XG4gICAgfSxcbiAgICBjbG9uZTogZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgICB2YXIgZSA9IGQuY2xvbmUuY2FsbCh0aGlzKTtcbiAgICAgIGUuX2hhc2ggPSB0aGlzLl9oYXNoLmNsb25lKCk7XG4gICAgICByZXR1cm4gZTtcbiAgICB9XG4gIH0pO1xuICBnLlNIQTEgPSBkLl9jcmVhdGVIZWxwZXIobCk7XG4gIGcuSG1hY1NIQTEgPSBkLl9jcmVhdGVIbWFjSGVscGVyKGwpO1xufSkoKTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGcgPSBDcnlwdG9KUyxcbiAgICAgIGwgPSBnLmVuYy5VdGY4O1xuICBnLmFsZ28uSE1BQyA9IGcubGliLkJhc2UuZXh0ZW5kKHtcbiAgICBpbml0OiBmdW5jdGlvbiBpbml0KGUsIGQpIHtcbiAgICAgIGUgPSB0aGlzLl9oYXNoZXIgPSBuZXcgZS5pbml0KCk7XG4gICAgICBcInN0cmluZ1wiID09IHR5cGVvZiBkICYmIChkID0gbC5wYXJzZShkKSk7XG4gICAgICB2YXIgZyA9IGUuYmxvY2tTaXplLFxuICAgICAgICAgIGsgPSA0ICogZztcbiAgICAgIGQuc2lnQnl0ZXMgPiBrICYmIChkID0gZS5maW5hbGl6ZShkKSk7XG4gICAgICBkLmNsYW1wKCk7XG5cbiAgICAgIGZvciAodmFyIHAgPSB0aGlzLl9vS2V5ID0gZC5jbG9uZSgpLCBiID0gdGhpcy5faUtleSA9IGQuY2xvbmUoKSwgbiA9IHAud29yZHMsIGogPSBiLndvcmRzLCBoID0gMDsgaCA8IGc7IGgrKykge1xuICAgICAgICBuW2hdIF49IDE1NDk1NTY4MjgsIGpbaF0gXj0gOTA5NTIyNDg2O1xuICAgICAgfVxuXG4gICAgICBwLnNpZ0J5dGVzID0gYi5zaWdCeXRlcyA9IGs7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSxcbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICB2YXIgZSA9IHRoaXMuX2hhc2hlcjtcbiAgICAgIGUucmVzZXQoKTtcbiAgICAgIGUudXBkYXRlKHRoaXMuX2lLZXkpO1xuICAgIH0sXG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoZSkge1xuICAgICAgdGhpcy5faGFzaGVyLnVwZGF0ZShlKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBmaW5hbGl6ZTogZnVuY3Rpb24gZmluYWxpemUoZSkge1xuICAgICAgdmFyIGQgPSB0aGlzLl9oYXNoZXI7XG4gICAgICBlID0gZC5maW5hbGl6ZShlKTtcbiAgICAgIGQucmVzZXQoKTtcbiAgICAgIHJldHVybiBkLmZpbmFsaXplKHRoaXMuX29LZXkuY2xvbmUoKS5jb25jYXQoZSkpO1xuICAgIH1cbiAgfSk7XG59KSgpO1xuXG4oZnVuY3Rpb24gKCkge1xuICAvLyBTaG9ydGN1dHNcbiAgdmFyIEMgPSBDcnlwdG9KUztcbiAgdmFyIENfbGliID0gQy5saWI7XG4gIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG4gIHZhciBDX2VuYyA9IEMuZW5jO1xuICAvKipcbiAgICogQmFzZTY0IGVuY29kaW5nIHN0cmF0ZWd5LlxuICAgKi9cblxuICB2YXIgQmFzZTY0ID0gQ19lbmMuQmFzZTY0ID0ge1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIEJhc2U2NCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgQmFzZTY0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAgICAgdmFyIGJhc2U2NFN0cmluZyA9IENyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KHdvcmRBcnJheSk7XG4gICAgICovXG4gICAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkod29yZEFycmF5KSB7XG4gICAgICAvLyBTaG9ydGN1dHNcbiAgICAgIHZhciB3b3JkcyA9IHdvcmRBcnJheS53b3JkcztcbiAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcbiAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7IC8vIENsYW1wIGV4Y2VzcyBiaXRzXG5cbiAgICAgIHdvcmRBcnJheS5jbGFtcCgpOyAvLyBDb252ZXJ0XG5cbiAgICAgIHZhciBiYXNlNjRDaGFycyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGJ5dGUxID0gd29yZHNbaSA+Pj4gMl0gPj4+IDI0IC0gaSAlIDQgKiA4ICYgMHhmZjtcbiAgICAgICAgdmFyIGJ5dGUyID0gd29yZHNbaSArIDEgPj4+IDJdID4+PiAyNCAtIChpICsgMSkgJSA0ICogOCAmIDB4ZmY7XG4gICAgICAgIHZhciBieXRlMyA9IHdvcmRzW2kgKyAyID4+PiAyXSA+Pj4gMjQgLSAoaSArIDIpICUgNCAqIDggJiAweGZmO1xuICAgICAgICB2YXIgdHJpcGxldCA9IGJ5dGUxIDw8IDE2IHwgYnl0ZTIgPDwgOCB8IGJ5dGUzO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNCAmJiBpICsgaiAqIDAuNzUgPCBzaWdCeXRlczsgaisrKSB7XG4gICAgICAgICAgYmFzZTY0Q2hhcnMucHVzaChtYXAuY2hhckF0KHRyaXBsZXQgPj4+IDYgKiAoMyAtIGopICYgMHgzZikpO1xuICAgICAgICB9XG4gICAgICB9IC8vIEFkZCBwYWRkaW5nXG5cblxuICAgICAgdmFyIHBhZGRpbmdDaGFyID0gbWFwLmNoYXJBdCg2NCk7XG5cbiAgICAgIGlmIChwYWRkaW5nQ2hhcikge1xuICAgICAgICB3aGlsZSAoYmFzZTY0Q2hhcnMubGVuZ3RoICUgNCkge1xuICAgICAgICAgIGJhc2U2NENoYXJzLnB1c2gocGFkZGluZ0NoYXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBiYXNlNjRDaGFycy5qb2luKCcnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSBCYXNlNjQgc3RyaW5nIHRvIGEgd29yZCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlNjRTdHIgVGhlIEJhc2U2NCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShiYXNlNjRTdHJpbmcpO1xuICAgICAqL1xuICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShiYXNlNjRTdHIpIHtcbiAgICAgIC8vIFNob3J0Y3V0c1xuICAgICAgdmFyIGJhc2U2NFN0ckxlbmd0aCA9IGJhc2U2NFN0ci5sZW5ndGg7XG4gICAgICB2YXIgbWFwID0gdGhpcy5fbWFwOyAvLyBJZ25vcmUgcGFkZGluZ1xuXG4gICAgICB2YXIgcGFkZGluZ0NoYXIgPSBtYXAuY2hhckF0KDY0KTtcblxuICAgICAgaWYgKHBhZGRpbmdDaGFyKSB7XG4gICAgICAgIHZhciBwYWRkaW5nSW5kZXggPSBiYXNlNjRTdHIuaW5kZXhPZihwYWRkaW5nQ2hhcik7XG5cbiAgICAgICAgaWYgKHBhZGRpbmdJbmRleCAhPSAtMSkge1xuICAgICAgICAgIGJhc2U2NFN0ckxlbmd0aCA9IHBhZGRpbmdJbmRleDtcbiAgICAgICAgfVxuICAgICAgfSAvLyBDb252ZXJ0XG5cblxuICAgICAgdmFyIHdvcmRzID0gW107XG4gICAgICB2YXIgbkJ5dGVzID0gMDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYXNlNjRTdHJMZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSAlIDQpIHtcbiAgICAgICAgICB2YXIgYml0czEgPSBtYXAuaW5kZXhPZihiYXNlNjRTdHIuY2hhckF0KGkgLSAxKSkgPDwgaSAlIDQgKiAyO1xuICAgICAgICAgIHZhciBiaXRzMiA9IG1hcC5pbmRleE9mKGJhc2U2NFN0ci5jaGFyQXQoaSkpID4+PiA2IC0gaSAlIDQgKiAyO1xuICAgICAgICAgIHdvcmRzW25CeXRlcyA+Pj4gMl0gfD0gKGJpdHMxIHwgYml0czIpIDw8IDI0IC0gbkJ5dGVzICUgNCAqIDg7XG4gICAgICAgICAgbkJ5dGVzKys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFdvcmRBcnJheS5jcmVhdGUod29yZHMsIG5CeXRlcyk7XG4gICAgfSxcbiAgICBfbWFwOiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nXG4gIH07XG59KSgpO1xuXG5pZiAoKHR5cGVvZiBtb2R1bGUgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihtb2R1bGUpKSA9PT0gJ29iamVjdCcpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBDcnlwdG9KUztcbn0gZWxzZSB7XG4gIHdpbmRvdy5DcnlwdG9KUyA9IENyeXB0b0pTO1xufSIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG4vL2NvcHlyaWdodCBSeWFuIERheSAyMDEwIDxodHRwOi8vcnlhbmRheS5vcmc+LCBKb3NjaGEgRmV0aCAyMDEzIDxodHRwOi8vd3d3LmZldGguY29tPiBbTUlUIExpY2Vuc2VkXVxudmFyIGVsZW1lbnRfc3RhcnRfY2hhciA9IFwiYS16QS1aX1xceEMwLVxceEQ2XFx4RDgtXFx4RjZcXHhGOC1cXHhGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZGRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRFwiO1xudmFyIGVsZW1lbnRfbm9uX3N0YXJ0X2NoYXIgPSBcIi0uMC05XFx4QjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGXFx1MjA0MFwiO1xudmFyIGVsZW1lbnRfcmVwbGFjZSA9IG5ldyBSZWdFeHAoXCJeKFteXCIgKyBlbGVtZW50X3N0YXJ0X2NoYXIgKyBcIl0pfF4oKHh8WCkobXxNKShsfEwpKXwoW15cIiArIGVsZW1lbnRfc3RhcnRfY2hhciArIGVsZW1lbnRfbm9uX3N0YXJ0X2NoYXIgKyBcIl0pXCIsIFwiZ1wiKTtcbnZhciBub3Rfc2FmZV9pbl94bWwgPSAvW15cXHgwOVxceDBBXFx4MERcXHgyMC1cXHhGRlxceDg1XFx4QTAtXFx1RDdGRlxcdUUwMDAtXFx1RkRDRlxcdUZERTAtXFx1RkZGRF0vZ207XG5cbnZhciBvYmpLZXlzID0gZnVuY3Rpb24gb2JqS2V5cyhvYmopIHtcbiAgdmFyIGwgPSBbXTtcblxuICBpZiAob2JqIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgZm9yICh2YXIgayBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgbC5wdXNoKGspO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsO1xufTtcblxudmFyIHByb2Nlc3NfdG9feG1sID0gZnVuY3Rpb24gcHJvY2Vzc190b194bWwobm9kZV9kYXRhLCBvcHRpb25zKSB7XG4gIHZhciBtYWtlTm9kZSA9IGZ1bmN0aW9uIG1ha2VOb2RlKG5hbWUsIGNvbnRlbnQsIGF0dHJpYnV0ZXMsIGxldmVsLCBoYXNTdWJOb2Rlcykge1xuICAgIHZhciBpbmRlbnRfdmFsdWUgPSBvcHRpb25zLmluZGVudCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5pbmRlbnQgOiBcIlxcdFwiO1xuICAgIHZhciBpbmRlbnQgPSBvcHRpb25zLnByZXR0eVByaW50ID8gJ1xcbicgKyBuZXcgQXJyYXkobGV2ZWwpLmpvaW4oaW5kZW50X3ZhbHVlKSA6ICcnO1xuXG4gICAgaWYgKG9wdGlvbnMucmVtb3ZlSWxsZWdhbE5hbWVDaGFyYWN0ZXJzKSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGVsZW1lbnRfcmVwbGFjZSwgJ18nKTtcbiAgICB9XG5cbiAgICB2YXIgbm9kZSA9IFtpbmRlbnQsICc8JywgbmFtZSwgYXR0cmlidXRlcyB8fCAnJ107XG5cbiAgICBpZiAoY29udGVudCAmJiBjb250ZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIG5vZGUucHVzaCgnPicpO1xuICAgICAgbm9kZS5wdXNoKGNvbnRlbnQpO1xuICAgICAgaGFzU3ViTm9kZXMgJiYgbm9kZS5wdXNoKGluZGVudCk7XG4gICAgICBub2RlLnB1c2goJzwvJyk7XG4gICAgICBub2RlLnB1c2gobmFtZSk7XG4gICAgICBub2RlLnB1c2goJz4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5wdXNoKCcvPicpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlLmpvaW4oJycpO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiBmbihub2RlX2RhdGEsIG5vZGVfZGVzY3JpcHRvciwgbGV2ZWwpIHtcbiAgICB2YXIgdHlwZSA9IF90eXBlb2Yobm9kZV9kYXRhKTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5ID8gQXJyYXkuaXNBcnJheShub2RlX2RhdGEpIDogbm9kZV9kYXRhIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHR5cGUgPSAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAobm9kZV9kYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgdHlwZSA9ICdkYXRlJztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIC8vaWYgdmFsdWUgaXMgYW4gYXJyYXkgY3JlYXRlIGNoaWxkIG5vZGVzIGZyb20gdmFsdWVzXG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICAgIHZhciByZXQgPSBbXTtcbiAgICAgICAgbm9kZV9kYXRhLm1hcChmdW5jdGlvbiAodikge1xuICAgICAgICAgIHJldC5wdXNoKGZuKHYsIDEsIGxldmVsICsgMSkpOyAvL2VudHJpZXMgdGhhdCBhcmUgdmFsdWVzIG9mIGFuIGFycmF5IGFyZSB0aGUgb25seSBvbmVzIHRoYXQgY2FuIGJlIHNwZWNpYWwgbm9kZSBkZXNjcmlwdG9yc1xuICAgICAgICB9KTtcbiAgICAgICAgb3B0aW9ucy5wcmV0dHlQcmludCAmJiByZXQucHVzaCgnXFxuJyk7XG4gICAgICAgIHJldHVybiByZXQuam9pbignJyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgLy8gY2FzdCBkYXRlcyB0byBJU08gODYwMSBkYXRlIChzb2FwIGxpa2VzIGl0KVxuICAgICAgICByZXR1cm4gbm9kZV9kYXRhLnRvSlNPTiA/IG5vZGVfZGF0YS50b0pTT04oKSA6IG5vZGVfZGF0YSArICcnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgdmFyIG5vZGVzID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBub2RlX2RhdGEpIHtcbiAgICAgICAgICBpZiAobm9kZV9kYXRhLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICBpZiAobm9kZV9kYXRhW25hbWVdIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBub2RlX2RhdGFbbmFtZV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZV9kYXRhW25hbWVdLmhhc093blByb3BlcnR5KGopKSB7XG4gICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG1ha2VOb2RlKG5hbWUsIGZuKG5vZGVfZGF0YVtuYW1lXVtqXSwgMCwgbGV2ZWwgKyAxKSwgbnVsbCwgbGV2ZWwgKyAxLCBvYmpLZXlzKG5vZGVfZGF0YVtuYW1lXVtqXSkubGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBub2Rlcy5wdXNoKG1ha2VOb2RlKG5hbWUsIGZuKG5vZGVfZGF0YVtuYW1lXSwgMCwgbGV2ZWwgKyAxKSwgbnVsbCwgbGV2ZWwgKyAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5wcmV0dHlQcmludCAmJiBub2Rlcy5sZW5ndGggPiAwICYmIG5vZGVzLnB1c2goJ1xcbicpO1xuICAgICAgICByZXR1cm4gbm9kZXMuam9pbignJyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgIHJldHVybiBub2RlX2RhdGEoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBvcHRpb25zLmVzY2FwZSA/IGVzYyhub2RlX2RhdGEpIDogJycgKyBub2RlX2RhdGE7XG4gICAgfVxuICB9KG5vZGVfZGF0YSwgMCwgMCk7XG59O1xuXG52YXIgeG1sX2hlYWRlciA9IGZ1bmN0aW9uIHhtbF9oZWFkZXIoc3RhbmRhbG9uZSkge1xuICB2YXIgcmV0ID0gWyc8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiJ107XG5cbiAgaWYgKHN0YW5kYWxvbmUpIHtcbiAgICByZXQucHVzaCgnIHN0YW5kYWxvbmU9XCJ5ZXNcIicpO1xuICB9XG5cbiAgcmV0LnB1c2goJz8+Jyk7XG4gIHJldHVybiByZXQuam9pbignJyk7XG59O1xuXG5mdW5jdGlvbiBlc2Moc3RyKSB7XG4gIHJldHVybiAoJycgKyBzdHIpLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC8nL2csICcmYXBvczsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JykucmVwbGFjZShub3Rfc2FmZV9pbl94bWwsICcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICB4bWxIZWFkZXI6IHtcbiAgICAgICAgc3RhbmRhbG9uZTogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHByZXR0eVByaW50OiB0cnVlLFxuICAgICAgaW5kZW50OiBcIiAgXCIsXG4gICAgICBlc2NhcGU6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT0gJ3N0cmluZycpIHtcbiAgICB0cnkge1xuICAgICAgb2JqID0gSlNPTi5wYXJzZShvYmoudG9TdHJpbmcoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHZhciB4bWxoZWFkZXIgPSAnJztcbiAgdmFyIGRvY1R5cGUgPSAnJztcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChfdHlwZW9mKG9wdGlvbnMpID09ICdvYmplY3QnKSB7XG4gICAgICAvLyBvdXIgY29uZmlnIGlzIGFuIG9iamVjdFxuICAgICAgaWYgKG9wdGlvbnMueG1sSGVhZGVyKSB7XG4gICAgICAgIC8vIHRoZSB1c2VyIHdhbnRzIGFuIHhtbCBoZWFkZXJcbiAgICAgICAgeG1saGVhZGVyID0geG1sX2hlYWRlcighIW9wdGlvbnMueG1sSGVhZGVyLnN0YW5kYWxvbmUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZG9jVHlwZSAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICBkb2NUeXBlID0gJzwhRE9DVFlQRSAnICsgb3B0aW9ucy5kb2NUeXBlICsgJz4nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdXIgY29uZmlnIGlzIGEgYm9vbGVhbiB2YWx1ZSwgc28ganVzdCBhZGQgeG1sIGhlYWRlclxuICAgICAgeG1saGVhZGVyID0geG1sX2hlYWRlcigpO1xuICAgIH1cbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcmV0ID0gW3htbGhlYWRlciwgb3B0aW9ucy5wcmV0dHlQcmludCAmJiBkb2NUeXBlID8gJ1xcbicgOiAnJywgZG9jVHlwZSwgcHJvY2Vzc190b194bWwob2JqLCBvcHRpb25zKV07XG4gIHJldHVybiByZXQuam9pbignJykucmVwbGFjZSgvXFxuezIsfS9nLCAnXFxuJykucmVwbGFjZSgvXFxzKyQvZywgJycpO1xufTsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTtcblxuLyogaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1tZDUgKi9cbihmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgRVJST1IgPSAnaW5wdXQgaXMgaW52YWxpZCB0eXBlJztcbiAgdmFyIFdJTkRPVyA9ICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yod2luZG93KSkgPT09ICdvYmplY3QnO1xuICB2YXIgcm9vdCA9IFdJTkRPVyA/IHdpbmRvdyA6IHt9O1xuXG4gIGlmIChyb290LkpTX01ENV9OT19XSU5ET1cpIHtcbiAgICBXSU5ET1cgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBXRUJfV09SS0VSID0gIVdJTkRPVyAmJiAodHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihzZWxmKSkgPT09ICdvYmplY3QnO1xuICB2YXIgTk9ERV9KUyA9ICFyb290LkpTX01ENV9OT19OT0RFX0pTICYmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKHByb2Nlc3MpKSA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLm5vZGU7XG5cbiAgaWYgKE5PREVfSlMpIHtcbiAgICByb290ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFdFQl9XT1JLRVIpIHtcbiAgICByb290ID0gc2VsZjtcbiAgfVxuXG4gIHZhciBDT01NT05fSlMgPSAhcm9vdC5KU19NRDVfTk9fQ09NTU9OX0pTICYmICh0eXBlb2YgbW9kdWxlID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YobW9kdWxlKSkgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzO1xuICB2YXIgQU1EID0gdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kO1xuICB2YXIgQVJSQVlfQlVGRkVSID0gIXJvb3QuSlNfTUQ1X05PX0FSUkFZX0JVRkZFUiAmJiB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnO1xuICB2YXIgSEVYX0NIQVJTID0gJzAxMjM0NTY3ODlhYmNkZWYnLnNwbGl0KCcnKTtcbiAgdmFyIEVYVFJBID0gWzEyOCwgMzI3NjgsIDgzODg2MDgsIC0yMTQ3NDgzNjQ4XTtcbiAgdmFyIFNISUZUID0gWzAsIDgsIDE2LCAyNF07XG4gIHZhciBPVVRQVVRfVFlQRVMgPSBbJ2hleCcsICdhcnJheScsICdkaWdlc3QnLCAnYnVmZmVyJywgJ2FycmF5QnVmZmVyJywgJ2Jhc2U2NCddO1xuICB2YXIgQkFTRTY0X0VOQ09ERV9DSEFSID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLnNwbGl0KCcnKTtcbiAgdmFyIGJsb2NrcyA9IFtdLFxuICAgICAgYnVmZmVyODtcblxuICBpZiAoQVJSQVlfQlVGRkVSKSB7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig2OCk7XG4gICAgYnVmZmVyOCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgYmxvY2tzID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcik7XG4gIH1cblxuICBpZiAocm9vdC5KU19NRDVfTk9fTk9ERV9KUyB8fCAhQXJyYXkuaXNBcnJheSkge1xuICAgIEFycmF5LmlzQXJyYXkgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChBUlJBWV9CVUZGRVIgJiYgKHJvb3QuSlNfTUQ1X05PX0FSUkFZX0JVRkZFUl9JU19WSUVXIHx8ICFBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgQXJyYXlCdWZmZXIuaXNWaWV3ID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIF90eXBlb2Yob2JqKSA9PT0gJ29iamVjdCcgJiYgb2JqLmJ1ZmZlciAmJiBvYmouYnVmZmVyLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcjtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGhleFxuICAgKiBAbWVtYmVyb2YgbWQ1XG4gICAqIEBkZXNjcmlwdGlvbiBPdXRwdXQgaGFzaCBhcyBoZXggc3RyaW5nXG4gICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fFVpbnQ4QXJyYXl8QXJyYXlCdWZmZXJ9IG1lc3NhZ2UgbWVzc2FnZSB0byBoYXNoXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IEhleCBzdHJpbmdcbiAgICogQGV4YW1wbGVcbiAgICogbWQ1LmhleCgnVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZycpO1xuICAgKiAvLyBlcXVhbCB0b1xuICAgKiBtZDUoJ1RoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cnKTtcbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZGlnZXN0XG4gICAqIEBtZW1iZXJvZiBtZDVcbiAgICogQGRlc2NyaXB0aW9uIE91dHB1dCBoYXNoIGFzIGJ5dGVzIGFycmF5XG4gICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fFVpbnQ4QXJyYXl8QXJyYXlCdWZmZXJ9IG1lc3NhZ2UgbWVzc2FnZSB0byBoYXNoXG4gICAqIEByZXR1cm5zIHtBcnJheX0gQnl0ZXMgYXJyYXlcbiAgICogQGV4YW1wbGVcbiAgICogbWQ1LmRpZ2VzdCgnVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZycpO1xuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBhcnJheVxuICAgKiBAbWVtYmVyb2YgbWQ1XG4gICAqIEBkZXNjcmlwdGlvbiBPdXRwdXQgaGFzaCBhcyBieXRlcyBhcnJheVxuICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheXxVaW50OEFycmF5fEFycmF5QnVmZmVyfSBtZXNzYWdlIG1lc3NhZ2UgdG8gaGFzaFxuICAgKiBAcmV0dXJucyB7QXJyYXl9IEJ5dGVzIGFycmF5XG4gICAqIEBleGFtcGxlXG4gICAqIG1kNS5hcnJheSgnVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZycpO1xuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBhcnJheUJ1ZmZlclxuICAgKiBAbWVtYmVyb2YgbWQ1XG4gICAqIEBkZXNjcmlwdGlvbiBPdXRwdXQgaGFzaCBhcyBBcnJheUJ1ZmZlclxuICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheXxVaW50OEFycmF5fEFycmF5QnVmZmVyfSBtZXNzYWdlIG1lc3NhZ2UgdG8gaGFzaFxuICAgKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IEFycmF5QnVmZmVyXG4gICAqIEBleGFtcGxlXG4gICAqIG1kNS5hcnJheUJ1ZmZlcignVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZycpO1xuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBidWZmZXJcbiAgICogQGRlcHJlY2F0ZWQgVGhpcyBtYXliZSBjb25mdXNlIHdpdGggQnVmZmVyIGluIG5vZGUuanMuIFBsZWFzZSB1c2UgYXJyYXlCdWZmZXIgaW5zdGVhZC5cbiAgICogQG1lbWJlcm9mIG1kNVxuICAgKiBAZGVzY3JpcHRpb24gT3V0cHV0IGhhc2ggYXMgQXJyYXlCdWZmZXJcbiAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl8VWludDhBcnJheXxBcnJheUJ1ZmZlcn0gbWVzc2FnZSBtZXNzYWdlIHRvIGhhc2hcbiAgICogQHJldHVybnMge0FycmF5QnVmZmVyfSBBcnJheUJ1ZmZlclxuICAgKiBAZXhhbXBsZVxuICAgKiBtZDUuYnVmZmVyKCdUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nJyk7XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJhc2U2NFxuICAgKiBAbWVtYmVyb2YgbWQ1XG4gICAqIEBkZXNjcmlwdGlvbiBPdXRwdXQgaGFzaCBhcyBiYXNlNjQgc3RyaW5nXG4gICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fFVpbnQ4QXJyYXl8QXJyYXlCdWZmZXJ9IG1lc3NhZ2UgbWVzc2FnZSB0byBoYXNoXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IGJhc2U2NCBzdHJpbmdcbiAgICogQGV4YW1wbGVcbiAgICogbWQ1LmJhc2U2NCgnVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZycpO1xuICAgKi9cblxuXG4gIHZhciBjcmVhdGVPdXRwdXRNZXRob2QgPSBmdW5jdGlvbiBjcmVhdGVPdXRwdXRNZXRob2Qob3V0cHV0VHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAobWVzc2FnZSwgaXNCaW5TdHIpIHtcbiAgICAgIHJldHVybiBuZXcgTWQ1KHRydWUpLnVwZGF0ZShtZXNzYWdlLCBpc0JpblN0cilbb3V0cHV0VHlwZV0oKTtcbiAgICB9O1xuICB9O1xuICAvKipcbiAgICogQG1ldGhvZCBjcmVhdGVcbiAgICogQG1lbWJlcm9mIG1kNVxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIE1kNSBvYmplY3RcbiAgICogQHJldHVybnMge01kNX0gTWQ1IG9iamVjdC5cbiAgICogQGV4YW1wbGVcbiAgICogdmFyIGhhc2ggPSBtZDUuY3JlYXRlKCk7XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgKiBAbWVtYmVyb2YgbWQ1XG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYW5kIHVwZGF0ZSBNZDUgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fFVpbnQ4QXJyYXl8QXJyYXlCdWZmZXJ9IG1lc3NhZ2UgbWVzc2FnZSB0byBoYXNoXG4gICAqIEByZXR1cm5zIHtNZDV9IE1kNSBvYmplY3QuXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBoYXNoID0gbWQ1LnVwZGF0ZSgnVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZycpO1xuICAgKiAvLyBlcXVhbCB0b1xuICAgKiB2YXIgaGFzaCA9IG1kNS5jcmVhdGUoKTtcbiAgICogaGFzaC51cGRhdGUoJ1RoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cnKTtcbiAgICovXG5cblxuICB2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gY3JlYXRlTWV0aG9kKCkge1xuICAgIHZhciBtZXRob2QgPSBjcmVhdGVPdXRwdXRNZXRob2QoJ2hleCcpO1xuXG4gICAgaWYgKE5PREVfSlMpIHtcbiAgICAgIG1ldGhvZCA9IG5vZGVXcmFwKG1ldGhvZCk7XG4gICAgfVxuXG4gICAgbWV0aG9kLmdldEN0eCA9IG1ldGhvZC5jcmVhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbmV3IE1kNSgpO1xuICAgIH07XG5cbiAgICBtZXRob2QudXBkYXRlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBtZXRob2QuY3JlYXRlKCkudXBkYXRlKG1lc3NhZ2UpO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE9VVFBVVF9UWVBFUy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHR5cGUgPSBPVVRQVVRfVFlQRVNbaV07XG4gICAgICBtZXRob2RbdHlwZV0gPSBjcmVhdGVPdXRwdXRNZXRob2QodHlwZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGhvZDtcbiAgfTtcblxuICB2YXIgbm9kZVdyYXAgPSBmdW5jdGlvbiBub2RlV3JhcChtZXRob2QpIHtcbiAgICB2YXIgY3J5cHRvID0gZXZhbChcInJlcXVpcmUoJ2NyeXB0bycpXCIpO1xuICAgIHZhciBCdWZmZXIgPSBldmFsKFwicmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyXCIpO1xuXG4gICAgdmFyIG5vZGVNZXRob2QgPSBmdW5jdGlvbiBub2RlTWV0aG9kKG1lc3NhZ2UpIHtcbiAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUobWVzc2FnZSwgJ3V0ZjgnKS5kaWdlc3QoJ2hleCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgRVJST1I7XG4gICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICBtZXNzYWdlID0gbmV3IFVpbnQ4QXJyYXkobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWVzc2FnZSkgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KG1lc3NhZ2UpIHx8IG1lc3NhZ2UuY29uc3RydWN0b3IgPT09IEJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShuZXcgQnVmZmVyKG1lc3NhZ2UpKS5kaWdlc3QoJ2hleCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG1ldGhvZChtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIG5vZGVNZXRob2Q7XG4gIH07XG4gIC8qKlxuICAgKiBNZDUgY2xhc3NcbiAgICogQGNsYXNzIE1kNVxuICAgKiBAZGVzY3JpcHRpb24gVGhpcyBpcyBpbnRlcm5hbCBjbGFzcy5cbiAgICogQHNlZSB7QGxpbmsgbWQ1LmNyZWF0ZX1cbiAgICovXG5cblxuICBmdW5jdGlvbiBNZDUoc2hhcmVkTWVtb3J5KSB7XG4gICAgaWYgKHNoYXJlZE1lbW9yeSkge1xuICAgICAgYmxvY2tzWzBdID0gYmxvY2tzWzE2XSA9IGJsb2Nrc1sxXSA9IGJsb2Nrc1syXSA9IGJsb2Nrc1szXSA9IGJsb2Nrc1s0XSA9IGJsb2Nrc1s1XSA9IGJsb2Nrc1s2XSA9IGJsb2Nrc1s3XSA9IGJsb2Nrc1s4XSA9IGJsb2Nrc1s5XSA9IGJsb2Nrc1sxMF0gPSBibG9ja3NbMTFdID0gYmxvY2tzWzEyXSA9IGJsb2Nrc1sxM10gPSBibG9ja3NbMTRdID0gYmxvY2tzWzE1XSA9IDA7XG4gICAgICB0aGlzLmJsb2NrcyA9IGJsb2NrcztcbiAgICAgIHRoaXMuYnVmZmVyOCA9IGJ1ZmZlcjg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChBUlJBWV9CVUZGRVIpIHtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig2OCk7XG4gICAgICAgIHRoaXMuYnVmZmVyOCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgIHRoaXMuYmxvY2tzID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJsb2NrcyA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmgwID0gdGhpcy5oMSA9IHRoaXMuaDIgPSB0aGlzLmgzID0gdGhpcy5zdGFydCA9IHRoaXMuYnl0ZXMgPSB0aGlzLmhCeXRlcyA9IDA7XG4gICAgdGhpcy5maW5hbGl6ZWQgPSB0aGlzLmhhc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuZmlyc3QgPSB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgKiBAbWVtYmVyb2YgTWQ1XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlIGhhc2hcbiAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl8VWludDhBcnJheXxBcnJheUJ1ZmZlcn0gbWVzc2FnZSBtZXNzYWdlIHRvIGhhc2hcbiAgICogQHJldHVybnMge01kNX0gTWQ1IG9iamVjdC5cbiAgICogQHNlZSB7QGxpbmsgbWQ1LnVwZGF0ZX1cbiAgICovXG5cblxuICBNZDUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChtZXNzYWdlLCBpc0JpblN0cikge1xuICAgIGlmICh0aGlzLmZpbmFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBjb2RlLFxuICAgICAgICBpbmRleCA9IDAsXG4gICAgICAgIGksXG4gICAgICAgIGxlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoLFxuICAgICAgICBibG9ja3MgPSB0aGlzLmJsb2NrcztcbiAgICB2YXIgYnVmZmVyOCA9IHRoaXMuYnVmZmVyODtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuaGFzaGVkKSB7XG4gICAgICAgIHRoaXMuaGFzaGVkID0gZmFsc2U7XG4gICAgICAgIGJsb2Nrc1swXSA9IGJsb2Nrc1sxNl07XG4gICAgICAgIGJsb2Nrc1sxNl0gPSBibG9ja3NbMV0gPSBibG9ja3NbMl0gPSBibG9ja3NbM10gPSBibG9ja3NbNF0gPSBibG9ja3NbNV0gPSBibG9ja3NbNl0gPSBibG9ja3NbN10gPSBibG9ja3NbOF0gPSBibG9ja3NbOV0gPSBibG9ja3NbMTBdID0gYmxvY2tzWzExXSA9IGJsb2Nrc1sxMl0gPSBibG9ja3NbMTNdID0gYmxvY2tzWzE0XSA9IGJsb2Nrc1sxNV0gPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoQVJSQVlfQlVGRkVSKSB7XG4gICAgICAgIGZvciAoaSA9IHRoaXMuc3RhcnQ7IGluZGV4IDwgbGVuZ3RoICYmIGkgPCA2NDsgKytpbmRleCkge1xuICAgICAgICAgIGNvZGUgPSBtZXNzYWdlLmNoYXJDb2RlQXQoaW5kZXgpO1xuXG4gICAgICAgICAgaWYgKGlzQmluU3RyIHx8IGNvZGUgPCAweDgwKSB7XG4gICAgICAgICAgICBidWZmZXI4W2krK10gPSBjb2RlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA8IDB4ODAwKSB7XG4gICAgICAgICAgICBidWZmZXI4W2krK10gPSAweGMwIHwgY29kZSA+PiA2O1xuICAgICAgICAgICAgYnVmZmVyOFtpKytdID0gMHg4MCB8IGNvZGUgJiAweDNmO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA8IDB4ZDgwMCB8fCBjb2RlID49IDB4ZTAwMCkge1xuICAgICAgICAgICAgYnVmZmVyOFtpKytdID0gMHhlMCB8IGNvZGUgPj4gMTI7XG4gICAgICAgICAgICBidWZmZXI4W2krK10gPSAweDgwIHwgY29kZSA+PiA2ICYgMHgzZjtcbiAgICAgICAgICAgIGJ1ZmZlcjhbaSsrXSA9IDB4ODAgfCBjb2RlICYgMHgzZjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29kZSA9IDB4MTAwMDAgKyAoKGNvZGUgJiAweDNmZikgPDwgMTAgfCBtZXNzYWdlLmNoYXJDb2RlQXQoKytpbmRleCkgJiAweDNmZik7XG4gICAgICAgICAgICBidWZmZXI4W2krK10gPSAweGYwIHwgY29kZSA+PiAxODtcbiAgICAgICAgICAgIGJ1ZmZlcjhbaSsrXSA9IDB4ODAgfCBjb2RlID4+IDEyICYgMHgzZjtcbiAgICAgICAgICAgIGJ1ZmZlcjhbaSsrXSA9IDB4ODAgfCBjb2RlID4+IDYgJiAweDNmO1xuICAgICAgICAgICAgYnVmZmVyOFtpKytdID0gMHg4MCB8IGNvZGUgJiAweDNmO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpID0gdGhpcy5zdGFydDsgaW5kZXggPCBsZW5ndGggJiYgaSA8IDY0OyArK2luZGV4KSB7XG4gICAgICAgICAgY29kZSA9IG1lc3NhZ2UuY2hhckNvZGVBdChpbmRleCk7XG5cbiAgICAgICAgICBpZiAoaXNCaW5TdHIgfHwgY29kZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGJsb2Nrc1tpID4+IDJdIHw9IGNvZGUgPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgICAgfSBlbHNlIGlmIChjb2RlIDwgMHg4MDApIHtcbiAgICAgICAgICAgIGJsb2Nrc1tpID4+IDJdIHw9ICgweGMwIHwgY29kZSA+PiA2KSA8PCBTSElGVFtpKysgJiAzXTtcbiAgICAgICAgICAgIGJsb2Nrc1tpID4+IDJdIHw9ICgweDgwIHwgY29kZSAmIDB4M2YpIDw8IFNISUZUW2krKyAmIDNdO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA8IDB4ZDgwMCB8fCBjb2RlID49IDB4ZTAwMCkge1xuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4ZTAgfCBjb2RlID4+IDEyKSA8PCBTSElGVFtpKysgJiAzXTtcbiAgICAgICAgICAgIGJsb2Nrc1tpID4+IDJdIHw9ICgweDgwIHwgY29kZSA+PiA2ICYgMHgzZikgPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHg4MCB8IGNvZGUgJiAweDNmKSA8PCBTSElGVFtpKysgJiAzXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29kZSA9IDB4MTAwMDAgKyAoKGNvZGUgJiAweDNmZikgPDwgMTAgfCBtZXNzYWdlLmNoYXJDb2RlQXQoKytpbmRleCkgJiAweDNmZik7XG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHhmMCB8IGNvZGUgPj4gMTgpIDw8IFNISUZUW2krKyAmIDNdO1xuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4ODAgfCBjb2RlID4+IDEyICYgMHgzZikgPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHg4MCB8IGNvZGUgPj4gNiAmIDB4M2YpIDw8IFNISUZUW2krKyAmIDNdO1xuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4ODAgfCBjb2RlICYgMHgzZikgPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGFzdEJ5dGVJbmRleCA9IGk7XG4gICAgICB0aGlzLmJ5dGVzICs9IGkgLSB0aGlzLnN0YXJ0O1xuXG4gICAgICBpZiAoaSA+PSA2NCkge1xuICAgICAgICB0aGlzLnN0YXJ0ID0gaSAtIDY0O1xuICAgICAgICB0aGlzLmhhc2goKTtcbiAgICAgICAgdGhpcy5oYXNoZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGFydCA9IGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYnl0ZXMgPiA0Mjk0OTY3Mjk1KSB7XG4gICAgICB0aGlzLmhCeXRlcyArPSB0aGlzLmJ5dGVzIC8gNDI5NDk2NzI5NiA8PCAwO1xuICAgICAgdGhpcy5ieXRlcyA9IHRoaXMuYnl0ZXMgJSA0Mjk0OTY3Mjk2O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIE1kNS5wcm90b3R5cGUuZmluYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maW5hbGl6ZWQgPSB0cnVlO1xuICAgIHZhciBibG9ja3MgPSB0aGlzLmJsb2NrcyxcbiAgICAgICAgaSA9IHRoaXMubGFzdEJ5dGVJbmRleDtcbiAgICBibG9ja3NbaSA+PiAyXSB8PSBFWFRSQVtpICYgM107XG5cbiAgICBpZiAoaSA+PSA1Nikge1xuICAgICAgaWYgKCF0aGlzLmhhc2hlZCkge1xuICAgICAgICB0aGlzLmhhc2goKTtcbiAgICAgIH1cblxuICAgICAgYmxvY2tzWzBdID0gYmxvY2tzWzE2XTtcbiAgICAgIGJsb2Nrc1sxNl0gPSBibG9ja3NbMV0gPSBibG9ja3NbMl0gPSBibG9ja3NbM10gPSBibG9ja3NbNF0gPSBibG9ja3NbNV0gPSBibG9ja3NbNl0gPSBibG9ja3NbN10gPSBibG9ja3NbOF0gPSBibG9ja3NbOV0gPSBibG9ja3NbMTBdID0gYmxvY2tzWzExXSA9IGJsb2Nrc1sxMl0gPSBibG9ja3NbMTNdID0gYmxvY2tzWzE0XSA9IGJsb2Nrc1sxNV0gPSAwO1xuICAgIH1cblxuICAgIGJsb2Nrc1sxNF0gPSB0aGlzLmJ5dGVzIDw8IDM7XG4gICAgYmxvY2tzWzE1XSA9IHRoaXMuaEJ5dGVzIDw8IDMgfCB0aGlzLmJ5dGVzID4+PiAyOTtcbiAgICB0aGlzLmhhc2goKTtcbiAgfTtcblxuICBNZDUucHJvdG90eXBlLmhhc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGEsXG4gICAgICAgIGIsXG4gICAgICAgIGMsXG4gICAgICAgIGQsXG4gICAgICAgIGJjLFxuICAgICAgICBkYSxcbiAgICAgICAgYmxvY2tzID0gdGhpcy5ibG9ja3M7XG5cbiAgICBpZiAodGhpcy5maXJzdCkge1xuICAgICAgYSA9IGJsb2Nrc1swXSAtIDY4MDg3NjkzNztcbiAgICAgIGEgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpIC0gMjcxNzMzODc5IDw8IDA7XG4gICAgICBkID0gKC0xNzMyNTg0MTk0IF4gYSAmIDIwMDQzMTgwNzEpICsgYmxvY2tzWzFdIC0gMTE3ODMwNzA4O1xuICAgICAgZCA9IChkIDw8IDEyIHwgZCA+Pj4gMjApICsgYSA8PCAwO1xuICAgICAgYyA9ICgtMjcxNzMzODc5IF4gZCAmIChhIF4gLTI3MTczMzg3OSkpICsgYmxvY2tzWzJdIC0gMTEyNjQ3ODM3NTtcbiAgICAgIGMgPSAoYyA8PCAxNyB8IGMgPj4+IDE1KSArIGQgPDwgMDtcbiAgICAgIGIgPSAoYSBeIGMgJiAoZCBeIGEpKSArIGJsb2Nrc1szXSAtIDEzMTYyNTkyMDk7XG4gICAgICBiID0gKGIgPDwgMjIgfCBiID4+PiAxMCkgKyBjIDw8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSB0aGlzLmgwO1xuICAgICAgYiA9IHRoaXMuaDE7XG4gICAgICBjID0gdGhpcy5oMjtcbiAgICAgIGQgPSB0aGlzLmgzO1xuICAgICAgYSArPSAoZCBeIGIgJiAoYyBeIGQpKSArIGJsb2Nrc1swXSAtIDY4MDg3NjkzNjtcbiAgICAgIGEgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiA8PCAwO1xuICAgICAgZCArPSAoYyBeIGEgJiAoYiBeIGMpKSArIGJsb2Nrc1sxXSAtIDM4OTU2NDU4NjtcbiAgICAgIGQgPSAoZCA8PCAxMiB8IGQgPj4+IDIwKSArIGEgPDwgMDtcbiAgICAgIGMgKz0gKGIgXiBkICYgKGEgXiBiKSkgKyBibG9ja3NbMl0gKyA2MDYxMDU4MTk7XG4gICAgICBjID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIDw8IDA7XG4gICAgICBiICs9IChhIF4gYyAmIChkIF4gYSkpICsgYmxvY2tzWzNdIC0gMTA0NDUyNTMzMDtcbiAgICAgIGIgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgPDwgMDtcbiAgICB9XG5cbiAgICBhICs9IChkIF4gYiAmIChjIF4gZCkpICsgYmxvY2tzWzRdIC0gMTc2NDE4ODk3O1xuICAgIGEgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiA8PCAwO1xuICAgIGQgKz0gKGMgXiBhICYgKGIgXiBjKSkgKyBibG9ja3NbNV0gKyAxMjAwMDgwNDI2O1xuICAgIGQgPSAoZCA8PCAxMiB8IGQgPj4+IDIwKSArIGEgPDwgMDtcbiAgICBjICs9IChiIF4gZCAmIChhIF4gYikpICsgYmxvY2tzWzZdIC0gMTQ3MzIzMTM0MTtcbiAgICBjID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIDw8IDA7XG4gICAgYiArPSAoYSBeIGMgJiAoZCBeIGEpKSArIGJsb2Nrc1s3XSAtIDQ1NzA1OTgzO1xuICAgIGIgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgPDwgMDtcbiAgICBhICs9IChkIF4gYiAmIChjIF4gZCkpICsgYmxvY2tzWzhdICsgMTc3MDAzNTQxNjtcbiAgICBhID0gKGEgPDwgNyB8IGEgPj4+IDI1KSArIGIgPDwgMDtcbiAgICBkICs9IChjIF4gYSAmIChiIF4gYykpICsgYmxvY2tzWzldIC0gMTk1ODQxNDQxNztcbiAgICBkID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIDw8IDA7XG4gICAgYyArPSAoYiBeIGQgJiAoYSBeIGIpKSArIGJsb2Nrc1sxMF0gLSA0MjA2MztcbiAgICBjID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIDw8IDA7XG4gICAgYiArPSAoYSBeIGMgJiAoZCBeIGEpKSArIGJsb2Nrc1sxMV0gLSAxOTkwNDA0MTYyO1xuICAgIGIgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgPDwgMDtcbiAgICBhICs9IChkIF4gYiAmIChjIF4gZCkpICsgYmxvY2tzWzEyXSArIDE4MDQ2MDM2ODI7XG4gICAgYSA9IChhIDw8IDcgfCBhID4+PiAyNSkgKyBiIDw8IDA7XG4gICAgZCArPSAoYyBeIGEgJiAoYiBeIGMpKSArIGJsb2Nrc1sxM10gLSA0MDM0MTEwMTtcbiAgICBkID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIDw8IDA7XG4gICAgYyArPSAoYiBeIGQgJiAoYSBeIGIpKSArIGJsb2Nrc1sxNF0gLSAxNTAyMDAyMjkwO1xuICAgIGMgPSAoYyA8PCAxNyB8IGMgPj4+IDE1KSArIGQgPDwgMDtcbiAgICBiICs9IChhIF4gYyAmIChkIF4gYSkpICsgYmxvY2tzWzE1XSArIDEyMzY1MzUzMjk7XG4gICAgYiA9IChiIDw8IDIyIHwgYiA+Pj4gMTApICsgYyA8PCAwO1xuICAgIGEgKz0gKGMgXiBkICYgKGIgXiBjKSkgKyBibG9ja3NbMV0gLSAxNjU3OTY1MTA7XG4gICAgYSA9IChhIDw8IDUgfCBhID4+PiAyNykgKyBiIDw8IDA7XG4gICAgZCArPSAoYiBeIGMgJiAoYSBeIGIpKSArIGJsb2Nrc1s2XSAtIDEwNjk1MDE2MzI7XG4gICAgZCA9IChkIDw8IDkgfCBkID4+PiAyMykgKyBhIDw8IDA7XG4gICAgYyArPSAoYSBeIGIgJiAoZCBeIGEpKSArIGJsb2Nrc1sxMV0gKyA2NDM3MTc3MTM7XG4gICAgYyA9IChjIDw8IDE0IHwgYyA+Pj4gMTgpICsgZCA8PCAwO1xuICAgIGIgKz0gKGQgXiBhICYgKGMgXiBkKSkgKyBibG9ja3NbMF0gLSAzNzM4OTczMDI7XG4gICAgYiA9IChiIDw8IDIwIHwgYiA+Pj4gMTIpICsgYyA8PCAwO1xuICAgIGEgKz0gKGMgXiBkICYgKGIgXiBjKSkgKyBibG9ja3NbNV0gLSA3MDE1NTg2OTE7XG4gICAgYSA9IChhIDw8IDUgfCBhID4+PiAyNykgKyBiIDw8IDA7XG4gICAgZCArPSAoYiBeIGMgJiAoYSBeIGIpKSArIGJsb2Nrc1sxMF0gKyAzODAxNjA4MztcbiAgICBkID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgPDwgMDtcbiAgICBjICs9IChhIF4gYiAmIChkIF4gYSkpICsgYmxvY2tzWzE1XSAtIDY2MDQ3ODMzNTtcbiAgICBjID0gKGMgPDwgMTQgfCBjID4+PiAxOCkgKyBkIDw8IDA7XG4gICAgYiArPSAoZCBeIGEgJiAoYyBeIGQpKSArIGJsb2Nrc1s0XSAtIDQwNTUzNzg0ODtcbiAgICBiID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIDw8IDA7XG4gICAgYSArPSAoYyBeIGQgJiAoYiBeIGMpKSArIGJsb2Nrc1s5XSArIDU2ODQ0NjQzODtcbiAgICBhID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgPDwgMDtcbiAgICBkICs9IChiIF4gYyAmIChhIF4gYikpICsgYmxvY2tzWzE0XSAtIDEwMTk4MDM2OTA7XG4gICAgZCA9IChkIDw8IDkgfCBkID4+PiAyMykgKyBhIDw8IDA7XG4gICAgYyArPSAoYSBeIGIgJiAoZCBeIGEpKSArIGJsb2Nrc1szXSAtIDE4NzM2Mzk2MTtcbiAgICBjID0gKGMgPDwgMTQgfCBjID4+PiAxOCkgKyBkIDw8IDA7XG4gICAgYiArPSAoZCBeIGEgJiAoYyBeIGQpKSArIGJsb2Nrc1s4XSArIDExNjM1MzE1MDE7XG4gICAgYiA9IChiIDw8IDIwIHwgYiA+Pj4gMTIpICsgYyA8PCAwO1xuICAgIGEgKz0gKGMgXiBkICYgKGIgXiBjKSkgKyBibG9ja3NbMTNdIC0gMTQ0NDY4MTQ2NztcbiAgICBhID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgPDwgMDtcbiAgICBkICs9IChiIF4gYyAmIChhIF4gYikpICsgYmxvY2tzWzJdIC0gNTE0MDM3ODQ7XG4gICAgZCA9IChkIDw8IDkgfCBkID4+PiAyMykgKyBhIDw8IDA7XG4gICAgYyArPSAoYSBeIGIgJiAoZCBeIGEpKSArIGJsb2Nrc1s3XSArIDE3MzUzMjg0NzM7XG4gICAgYyA9IChjIDw8IDE0IHwgYyA+Pj4gMTgpICsgZCA8PCAwO1xuICAgIGIgKz0gKGQgXiBhICYgKGMgXiBkKSkgKyBibG9ja3NbMTJdIC0gMTkyNjYwNzczNDtcbiAgICBiID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIDw8IDA7XG4gICAgYmMgPSBiIF4gYztcbiAgICBhICs9IChiYyBeIGQpICsgYmxvY2tzWzVdIC0gMzc4NTU4O1xuICAgIGEgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiA8PCAwO1xuICAgIGQgKz0gKGJjIF4gYSkgKyBibG9ja3NbOF0gLSAyMDIyNTc0NDYzO1xuICAgIGQgPSAoZCA8PCAxMSB8IGQgPj4+IDIxKSArIGEgPDwgMDtcbiAgICBkYSA9IGQgXiBhO1xuICAgIGMgKz0gKGRhIF4gYikgKyBibG9ja3NbMTFdICsgMTgzOTAzMDU2MjtcbiAgICBjID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIDw8IDA7XG4gICAgYiArPSAoZGEgXiBjKSArIGJsb2Nrc1sxNF0gLSAzNTMwOTU1NjtcbiAgICBiID0gKGIgPDwgMjMgfCBiID4+PiA5KSArIGMgPDwgMDtcbiAgICBiYyA9IGIgXiBjO1xuICAgIGEgKz0gKGJjIF4gZCkgKyBibG9ja3NbMV0gLSAxNTMwOTkyMDYwO1xuICAgIGEgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiA8PCAwO1xuICAgIGQgKz0gKGJjIF4gYSkgKyBibG9ja3NbNF0gKyAxMjcyODkzMzUzO1xuICAgIGQgPSAoZCA8PCAxMSB8IGQgPj4+IDIxKSArIGEgPDwgMDtcbiAgICBkYSA9IGQgXiBhO1xuICAgIGMgKz0gKGRhIF4gYikgKyBibG9ja3NbN10gLSAxNTU0OTc2MzI7XG4gICAgYyA9IChjIDw8IDE2IHwgYyA+Pj4gMTYpICsgZCA8PCAwO1xuICAgIGIgKz0gKGRhIF4gYykgKyBibG9ja3NbMTBdIC0gMTA5NDczMDY0MDtcbiAgICBiID0gKGIgPDwgMjMgfCBiID4+PiA5KSArIGMgPDwgMDtcbiAgICBiYyA9IGIgXiBjO1xuICAgIGEgKz0gKGJjIF4gZCkgKyBibG9ja3NbMTNdICsgNjgxMjc5MTc0O1xuICAgIGEgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiA8PCAwO1xuICAgIGQgKz0gKGJjIF4gYSkgKyBibG9ja3NbMF0gLSAzNTg1MzcyMjI7XG4gICAgZCA9IChkIDw8IDExIHwgZCA+Pj4gMjEpICsgYSA8PCAwO1xuICAgIGRhID0gZCBeIGE7XG4gICAgYyArPSAoZGEgXiBiKSArIGJsb2Nrc1szXSAtIDcyMjUyMTk3OTtcbiAgICBjID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIDw8IDA7XG4gICAgYiArPSAoZGEgXiBjKSArIGJsb2Nrc1s2XSArIDc2MDI5MTg5O1xuICAgIGIgPSAoYiA8PCAyMyB8IGIgPj4+IDkpICsgYyA8PCAwO1xuICAgIGJjID0gYiBeIGM7XG4gICAgYSArPSAoYmMgXiBkKSArIGJsb2Nrc1s5XSAtIDY0MDM2NDQ4NztcbiAgICBhID0gKGEgPDwgNCB8IGEgPj4+IDI4KSArIGIgPDwgMDtcbiAgICBkICs9IChiYyBeIGEpICsgYmxvY2tzWzEyXSAtIDQyMTgxNTgzNTtcbiAgICBkID0gKGQgPDwgMTEgfCBkID4+PiAyMSkgKyBhIDw8IDA7XG4gICAgZGEgPSBkIF4gYTtcbiAgICBjICs9IChkYSBeIGIpICsgYmxvY2tzWzE1XSArIDUzMDc0MjUyMDtcbiAgICBjID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIDw8IDA7XG4gICAgYiArPSAoZGEgXiBjKSArIGJsb2Nrc1syXSAtIDk5NTMzODY1MTtcbiAgICBiID0gKGIgPDwgMjMgfCBiID4+PiA5KSArIGMgPDwgMDtcbiAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsgYmxvY2tzWzBdIC0gMTk4NjMwODQ0O1xuICAgIGEgPSAoYSA8PCA2IHwgYSA+Pj4gMjYpICsgYiA8PCAwO1xuICAgIGQgKz0gKGIgXiAoYSB8IH5jKSkgKyBibG9ja3NbN10gKyAxMTI2ODkxNDE1O1xuICAgIGQgPSAoZCA8PCAxMCB8IGQgPj4+IDIyKSArIGEgPDwgMDtcbiAgICBjICs9IChhIF4gKGQgfCB+YikpICsgYmxvY2tzWzE0XSAtIDE0MTYzNTQ5MDU7XG4gICAgYyA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCA8PCAwO1xuICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBibG9ja3NbNV0gLSA1NzQzNDA1NTtcbiAgICBiID0gKGIgPDwgMjEgfCBiID4+PiAxMSkgKyBjIDw8IDA7XG4gICAgYSArPSAoYyBeIChiIHwgfmQpKSArIGJsb2Nrc1sxMl0gKyAxNzAwNDg1NTcxO1xuICAgIGEgPSAoYSA8PCA2IHwgYSA+Pj4gMjYpICsgYiA8PCAwO1xuICAgIGQgKz0gKGIgXiAoYSB8IH5jKSkgKyBibG9ja3NbM10gLSAxODk0OTg2NjA2O1xuICAgIGQgPSAoZCA8PCAxMCB8IGQgPj4+IDIyKSArIGEgPDwgMDtcbiAgICBjICs9IChhIF4gKGQgfCB+YikpICsgYmxvY2tzWzEwXSAtIDEwNTE1MjM7XG4gICAgYyA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCA8PCAwO1xuICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBibG9ja3NbMV0gLSAyMDU0OTIyNzk5O1xuICAgIGIgPSAoYiA8PCAyMSB8IGIgPj4+IDExKSArIGMgPDwgMDtcbiAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsgYmxvY2tzWzhdICsgMTg3MzMxMzM1OTtcbiAgICBhID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgPDwgMDtcbiAgICBkICs9IChiIF4gKGEgfCB+YykpICsgYmxvY2tzWzE1XSAtIDMwNjExNzQ0O1xuICAgIGQgPSAoZCA8PCAxMCB8IGQgPj4+IDIyKSArIGEgPDwgMDtcbiAgICBjICs9IChhIF4gKGQgfCB+YikpICsgYmxvY2tzWzZdIC0gMTU2MDE5ODM4MDtcbiAgICBjID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIDw8IDA7XG4gICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGJsb2Nrc1sxM10gKyAxMzA5MTUxNjQ5O1xuICAgIGIgPSAoYiA8PCAyMSB8IGIgPj4+IDExKSArIGMgPDwgMDtcbiAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsgYmxvY2tzWzRdIC0gMTQ1NTIzMDcwO1xuICAgIGEgPSAoYSA8PCA2IHwgYSA+Pj4gMjYpICsgYiA8PCAwO1xuICAgIGQgKz0gKGIgXiAoYSB8IH5jKSkgKyBibG9ja3NbMTFdIC0gMTEyMDIxMDM3OTtcbiAgICBkID0gKGQgPDwgMTAgfCBkID4+PiAyMikgKyBhIDw8IDA7XG4gICAgYyArPSAoYSBeIChkIHwgfmIpKSArIGJsb2Nrc1syXSArIDcxODc4NzI1OTtcbiAgICBjID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIDw8IDA7XG4gICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGJsb2Nrc1s5XSAtIDM0MzQ4NTU1MTtcbiAgICBiID0gKGIgPDwgMjEgfCBiID4+PiAxMSkgKyBjIDw8IDA7XG5cbiAgICBpZiAodGhpcy5maXJzdCkge1xuICAgICAgdGhpcy5oMCA9IGEgKyAxNzMyNTg0MTkzIDw8IDA7XG4gICAgICB0aGlzLmgxID0gYiAtIDI3MTczMzg3OSA8PCAwO1xuICAgICAgdGhpcy5oMiA9IGMgLSAxNzMyNTg0MTk0IDw8IDA7XG4gICAgICB0aGlzLmgzID0gZCArIDI3MTczMzg3OCA8PCAwO1xuICAgICAgdGhpcy5maXJzdCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmgwID0gdGhpcy5oMCArIGEgPDwgMDtcbiAgICAgIHRoaXMuaDEgPSB0aGlzLmgxICsgYiA8PCAwO1xuICAgICAgdGhpcy5oMiA9IHRoaXMuaDIgKyBjIDw8IDA7XG4gICAgICB0aGlzLmgzID0gdGhpcy5oMyArIGQgPDwgMDtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBAbWV0aG9kIGhleFxuICAgKiBAbWVtYmVyb2YgTWQ1XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gT3V0cHV0IGhhc2ggYXMgaGV4IHN0cmluZ1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBIZXggc3RyaW5nXG4gICAqIEBzZWUge0BsaW5rIG1kNS5oZXh9XG4gICAqIEBleGFtcGxlXG4gICAqIGhhc2guaGV4KCk7XG4gICAqL1xuXG5cbiAgTWQ1LnByb3RvdHlwZS5oZXggPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5maW5hbGl6ZSgpO1xuICAgIHZhciBoMCA9IHRoaXMuaDAsXG4gICAgICAgIGgxID0gdGhpcy5oMSxcbiAgICAgICAgaDIgPSB0aGlzLmgyLFxuICAgICAgICBoMyA9IHRoaXMuaDM7XG4gICAgcmV0dXJuIEhFWF9DSEFSU1toMCA+PiA0ICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDAgJiAweDBGXSArIEhFWF9DSEFSU1toMCA+PiAxMiAmIDB4MEZdICsgSEVYX0NIQVJTW2gwID4+IDggJiAweDBGXSArIEhFWF9DSEFSU1toMCA+PiAyMCAmIDB4MEZdICsgSEVYX0NIQVJTW2gwID4+IDE2ICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDAgPj4gMjggJiAweDBGXSArIEhFWF9DSEFSU1toMCA+PiAyNCAmIDB4MEZdICsgSEVYX0NIQVJTW2gxID4+IDQgJiAweDBGXSArIEhFWF9DSEFSU1toMSAmIDB4MEZdICsgSEVYX0NIQVJTW2gxID4+IDEyICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDEgPj4gOCAmIDB4MEZdICsgSEVYX0NIQVJTW2gxID4+IDIwICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDEgPj4gMTYgJiAweDBGXSArIEhFWF9DSEFSU1toMSA+PiAyOCAmIDB4MEZdICsgSEVYX0NIQVJTW2gxID4+IDI0ICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDIgPj4gNCAmIDB4MEZdICsgSEVYX0NIQVJTW2gyICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDIgPj4gMTIgJiAweDBGXSArIEhFWF9DSEFSU1toMiA+PiA4ICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDIgPj4gMjAgJiAweDBGXSArIEhFWF9DSEFSU1toMiA+PiAxNiAmIDB4MEZdICsgSEVYX0NIQVJTW2gyID4+IDI4ICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDIgPj4gMjQgJiAweDBGXSArIEhFWF9DSEFSU1toMyA+PiA0ICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDMgJiAweDBGXSArIEhFWF9DSEFSU1toMyA+PiAxMiAmIDB4MEZdICsgSEVYX0NIQVJTW2gzID4+IDggJiAweDBGXSArIEhFWF9DSEFSU1toMyA+PiAyMCAmIDB4MEZdICsgSEVYX0NIQVJTW2gzID4+IDE2ICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDMgPj4gMjggJiAweDBGXSArIEhFWF9DSEFSU1toMyA+PiAyNCAmIDB4MEZdO1xuICB9O1xuICAvKipcbiAgICogQG1ldGhvZCB0b1N0cmluZ1xuICAgKiBAbWVtYmVyb2YgTWQ1XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gT3V0cHV0IGhhc2ggYXMgaGV4IHN0cmluZ1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBIZXggc3RyaW5nXG4gICAqIEBzZWUge0BsaW5rIG1kNS5oZXh9XG4gICAqIEBleGFtcGxlXG4gICAqIGhhc2gudG9TdHJpbmcoKTtcbiAgICovXG5cblxuICBNZDUucHJvdG90eXBlLnRvU3RyaW5nID0gTWQ1LnByb3RvdHlwZS5oZXg7XG4gIC8qKlxuICAgKiBAbWV0aG9kIGRpZ2VzdFxuICAgKiBAbWVtYmVyb2YgTWQ1XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gT3V0cHV0IGhhc2ggYXMgYnl0ZXMgYXJyYXlcbiAgICogQHJldHVybnMge0FycmF5fSBCeXRlcyBhcnJheVxuICAgKiBAc2VlIHtAbGluayBtZDUuZGlnZXN0fVxuICAgKiBAZXhhbXBsZVxuICAgKiBoYXNoLmRpZ2VzdCgpO1xuICAgKi9cblxuICBNZDUucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICBpZiAoZm9ybWF0ID09PSAnaGV4JykgcmV0dXJuIHRoaXMuaGV4KCk7XG4gICAgdGhpcy5maW5hbGl6ZSgpO1xuICAgIHZhciBoMCA9IHRoaXMuaDAsXG4gICAgICAgIGgxID0gdGhpcy5oMSxcbiAgICAgICAgaDIgPSB0aGlzLmgyLFxuICAgICAgICBoMyA9IHRoaXMuaDM7XG4gICAgdmFyIHJlcyA9IFtoMCAmIDB4RkYsIGgwID4+IDggJiAweEZGLCBoMCA+PiAxNiAmIDB4RkYsIGgwID4+IDI0ICYgMHhGRiwgaDEgJiAweEZGLCBoMSA+PiA4ICYgMHhGRiwgaDEgPj4gMTYgJiAweEZGLCBoMSA+PiAyNCAmIDB4RkYsIGgyICYgMHhGRiwgaDIgPj4gOCAmIDB4RkYsIGgyID4+IDE2ICYgMHhGRiwgaDIgPj4gMjQgJiAweEZGLCBoMyAmIDB4RkYsIGgzID4+IDggJiAweEZGLCBoMyA+PiAxNiAmIDB4RkYsIGgzID4+IDI0ICYgMHhGRl07XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbiAgLyoqXG4gICAqIEBtZXRob2QgYXJyYXlcbiAgICogQG1lbWJlcm9mIE1kNVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIE91dHB1dCBoYXNoIGFzIGJ5dGVzIGFycmF5XG4gICAqIEByZXR1cm5zIHtBcnJheX0gQnl0ZXMgYXJyYXlcbiAgICogQHNlZSB7QGxpbmsgbWQ1LmFycmF5fVxuICAgKiBAZXhhbXBsZVxuICAgKiBoYXNoLmFycmF5KCk7XG4gICAqL1xuXG5cbiAgTWQ1LnByb3RvdHlwZS5hcnJheSA9IE1kNS5wcm90b3R5cGUuZGlnZXN0O1xuICAvKipcbiAgICogQG1ldGhvZCBhcnJheUJ1ZmZlclxuICAgKiBAbWVtYmVyb2YgTWQ1XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gT3V0cHV0IGhhc2ggYXMgQXJyYXlCdWZmZXJcbiAgICogQHJldHVybnMge0FycmF5QnVmZmVyfSBBcnJheUJ1ZmZlclxuICAgKiBAc2VlIHtAbGluayBtZDUuYXJyYXlCdWZmZXJ9XG4gICAqIEBleGFtcGxlXG4gICAqIGhhc2guYXJyYXlCdWZmZXIoKTtcbiAgICovXG5cbiAgTWQ1LnByb3RvdHlwZS5hcnJheUJ1ZmZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZpbmFsaXplKCk7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigxNik7XG4gICAgdmFyIGJsb2NrcyA9IG5ldyBVaW50MzJBcnJheShidWZmZXIpO1xuICAgIGJsb2Nrc1swXSA9IHRoaXMuaDA7XG4gICAgYmxvY2tzWzFdID0gdGhpcy5oMTtcbiAgICBibG9ja3NbMl0gPSB0aGlzLmgyO1xuICAgIGJsb2Nrc1szXSA9IHRoaXMuaDM7XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEBtZXRob2QgYnVmZmVyXG4gICAqIEBkZXByZWNhdGVkIFRoaXMgbWF5YmUgY29uZnVzZSB3aXRoIEJ1ZmZlciBpbiBub2RlLmpzLiBQbGVhc2UgdXNlIGFycmF5QnVmZmVyIGluc3RlYWQuXG4gICAqIEBtZW1iZXJvZiBNZDVcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBPdXRwdXQgaGFzaCBhcyBBcnJheUJ1ZmZlclxuICAgKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IEFycmF5QnVmZmVyXG4gICAqIEBzZWUge0BsaW5rIG1kNS5idWZmZXJ9XG4gICAqIEBleGFtcGxlXG4gICAqIGhhc2guYnVmZmVyKCk7XG4gICAqL1xuXG5cbiAgTWQ1LnByb3RvdHlwZS5idWZmZXIgPSBNZDUucHJvdG90eXBlLmFycmF5QnVmZmVyO1xuICAvKipcbiAgICogQG1ldGhvZCBiYXNlNjRcbiAgICogQG1lbWJlcm9mIE1kNVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIE91dHB1dCBoYXNoIGFzIGJhc2U2NCBzdHJpbmdcbiAgICogQHJldHVybnMge1N0cmluZ30gYmFzZTY0IHN0cmluZ1xuICAgKiBAc2VlIHtAbGluayBtZDUuYmFzZTY0fVxuICAgKiBAZXhhbXBsZVxuICAgKiBoYXNoLmJhc2U2NCgpO1xuICAgKi9cblxuICBNZDUucHJvdG90eXBlLmJhc2U2NCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdjEsXG4gICAgICAgIHYyLFxuICAgICAgICB2MyxcbiAgICAgICAgYmFzZTY0U3RyID0gJycsXG4gICAgICAgIGJ5dGVzID0gdGhpcy5hcnJheSgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNTspIHtcbiAgICAgIHYxID0gYnl0ZXNbaSsrXTtcbiAgICAgIHYyID0gYnl0ZXNbaSsrXTtcbiAgICAgIHYzID0gYnl0ZXNbaSsrXTtcbiAgICAgIGJhc2U2NFN0ciArPSBCQVNFNjRfRU5DT0RFX0NIQVJbdjEgPj4+IDJdICsgQkFTRTY0X0VOQ09ERV9DSEFSWyh2MSA8PCA0IHwgdjIgPj4+IDQpICYgNjNdICsgQkFTRTY0X0VOQ09ERV9DSEFSWyh2MiA8PCAyIHwgdjMgPj4+IDYpICYgNjNdICsgQkFTRTY0X0VOQ09ERV9DSEFSW3YzICYgNjNdO1xuICAgIH1cblxuICAgIHYxID0gYnl0ZXNbaV07XG4gICAgYmFzZTY0U3RyICs9IEJBU0U2NF9FTkNPREVfQ0hBUlt2MSA+Pj4gMl0gKyBCQVNFNjRfRU5DT0RFX0NIQVJbdjEgPDwgNCAmIDYzXSArICc9PSc7XG4gICAgcmV0dXJuIGJhc2U2NFN0cjtcbiAgfTtcblxuICB2YXIgZXhwb3J0cyA9IGNyZWF0ZU1ldGhvZCgpO1xuXG4gIGlmIChDT01NT05fSlMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHM7XG4gIH0gZWxzZSB7XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBtZDVcYlxuICAgICAqIEBkZXNjcmlwdGlvbiBNZDUgaGFzaCBmdW5jdGlvbiwgZXhwb3J0IHRvIGdsb2JhbCBpbiBicm93c2Vycy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheXxVaW50OEFycmF5fEFycmF5QnVmZmVyfSBtZXNzYWdlIG1lc3NhZ2UgdG8gaGFzaFxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IG1kNSBoYXNoZXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1kNSgnJyk7IC8vIGQ0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0MjdlXG4gICAgICogbWQ1KCdUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nJyk7IC8vIDllMTA3ZDlkMzcyYmI2ODI2YmQ4MWQzNTQyYTQxOWQ2XG4gICAgICogbWQ1KCdUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLicpOyAvLyBlNGQ5MDljMjkwZDBmYjFjYTA2OGZmYWRkZjIyY2JkMFxuICAgICAqXG4gICAgICogLy8gSXQgYWxzbyBzdXBwb3J0cyBVVEYtOCBlbmNvZGluZ1xuICAgICAqIG1kNSgn5Lit5paHJyk7IC8vIGE3YmFjMjIzOWZjZGNiM2EwNjc5MDNkODA3N2M0YTA3XG4gICAgICpcbiAgICAgKiAvLyBJdCBhbHNvIHN1cHBvcnRzIGJ5dGUgYEFycmF5YCwgYFVpbnQ4QXJyYXlgLCBgQXJyYXlCdWZmZXJgXG4gICAgICogbWQ1KFtdKTsgLy8gZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2VcbiAgICAgKiBtZDUobmV3IFVpbnQ4QXJyYXkoW10pKTsgLy8gZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2VcbiAgICAgKi9cbiAgICByb290Lm1kNSA9IGV4cG9ydHM7XG5cbiAgICBpZiAoQU1EKSB7XG4gICAgICBkZWZpbmUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZXhwb3J0cztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSkoKTsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTtcblxudmFyIHN0cmluZ2lmeVByaW1pdGl2ZSA9IGZ1bmN0aW9uIHN0cmluZ2lmeVByaW1pdGl2ZSh2KSB7XG4gIHN3aXRjaCAoX3R5cGVvZih2KSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdjtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHYgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBpc0Zpbml0ZSh2KSA/IHYgOiAnJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbnZhciBxdWVyeVN0cmluZ2lmeSA9IGZ1bmN0aW9uIHF1ZXJ5U3RyaW5naWZ5KG9iaiwgc2VwLCBlcSwgbmFtZSkge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcblxuICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgb2JqID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKF90eXBlb2Yob2JqKSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24gKGspIHtcbiAgICAgIHZhciBrcyA9IGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUoaykpICsgZXE7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ialtrXSkpIHtcbiAgICAgICAgcmV0dXJuIG9ialtrXS5tYXAoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKHYpKTtcbiAgICAgICAgfSkuam9pbihzZXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmpba10pKTtcbiAgICAgIH1cbiAgICB9KS5maWx0ZXIoQm9vbGVhbikuam9pbihzZXApO1xuICB9XG5cbiAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG5hbWUpKSArIGVxICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmopKTtcbn07XG5cbnZhciB4aHJSZXMgPSBmdW5jdGlvbiB4aHJSZXMoZXJyLCB4aHIsIGJvZHkpIHtcbiAgdmFyIGhlYWRlcnMgPSB7fTtcbiAgeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLnRyaW0oKS5zcGxpdCgnXFxuJykuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmIChpdGVtKSB7XG4gICAgICB2YXIgaW5kZXggPSBpdGVtLmluZGV4T2YoJzonKTtcbiAgICAgIHZhciBrZXkgPSBpdGVtLnN1YnN0cigwLCBpbmRleCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgdmFsID0gaXRlbS5zdWJzdHIoaW5kZXggKyAxKS50cmltKCk7XG4gICAgICBoZWFkZXJzW2tleV0gPSB2YWw7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBlcnJvcjogZXJyLFxuICAgIHN0YXR1c0NvZGU6IHhoci5zdGF0dXMsXG4gICAgc3RhdHVzTWVzc2FnZTogeGhyLnN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogaGVhZGVycyxcbiAgICBib2R5OiBib2R5XG4gIH07XG59O1xuXG52YXIgeGhyQm9keSA9IGZ1bmN0aW9uIHhockJvZHkoeGhyLCBkYXRhVHlwZSkge1xuICByZXR1cm4gIWRhdGFUeXBlICYmIGRhdGFUeXBlID09PSAndGV4dCcgPyB4aHIucmVzcG9uc2VUZXh0IDogeGhyLnJlc3BvbnNlO1xufTtcblxudmFyIHJlcXVlc3QgPSBmdW5jdGlvbiByZXF1ZXN0KG9wdCwgY2FsbGJhY2spIHtcbiAgLy8gbWV0aG9kXG4gIHZhciBtZXRob2QgPSAob3B0Lm1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKTsgLy8gdXJs44CBcXNcblxuICB2YXIgdXJsID0gb3B0LnVybDtcblxuICBpZiAob3B0LnFzKSB7XG4gICAgdmFyIHFzU3RyID0gcXVlcnlTdHJpbmdpZnkob3B0LnFzKTtcblxuICAgIGlmIChxc1N0cikge1xuICAgICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyBxc1N0cjtcbiAgICB9XG4gIH0gLy8g5Yib5bu6IGFqYXgg5a6e5L6LXG5cblxuICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gIHhoci5vcGVuKG1ldGhvZCwgdXJsLCB0cnVlKTtcbiAgeGhyLnJlc3BvbnNlVHlwZSA9IG9wdC5kYXRhVHlwZSB8fCAndGV4dCc7IC8vIOWkhOeQhiB4aHJGaWVsZHMg5bGe5oCnXG5cbiAgaWYgKG9wdC54aHJGaWVsZHMpIHtcbiAgICBmb3IgKHZhciB4aHJGaWVsZCBpbiBvcHQueGhyRmllbGRzKSB7XG4gICAgICB4aHJbeGhyRmllbGRdID0gb3B0LnhockZpZWxkc1t4aHJGaWVsZF07XG4gICAgfVxuICB9IC8vIOWkhOeQhiBoZWFkZXJzXG5cblxuICB2YXIgaGVhZGVycyA9IG9wdC5oZWFkZXJzO1xuXG4gIGlmIChoZWFkZXJzKSB7XG4gICAgZm9yICh2YXIga2V5IGluIGhlYWRlcnMpIHtcbiAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGtleSkgJiYga2V5LnRvTG93ZXJDYXNlKCkgIT09ICdjb250ZW50LWxlbmd0aCcgJiYga2V5LnRvTG93ZXJDYXNlKCkgIT09ICd1c2VyLWFnZW50JyAmJiBrZXkudG9Mb3dlckNhc2UoKSAhPT0gJ29yaWdpbicgJiYga2V5LnRvTG93ZXJDYXNlKCkgIT09ICdob3N0Jykge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIG9ucHJvZ3Jlc3NcblxuXG4gIGlmIChvcHQub25Qcm9ncmVzcyAmJiB4aHIudXBsb2FkKSB4aHIudXBsb2FkLm9ucHJvZ3Jlc3MgPSBvcHQub25Qcm9ncmVzcztcbiAgaWYgKG9wdC5vbkRvd25sb2FkUHJvZ3Jlc3MpIHhoci5vbnByb2dyZXNzID0gb3B0Lm9uRG93bmxvYWRQcm9ncmVzczsgLy8gdGltZW91dFxuXG4gIGlmIChvcHQudGltZW91dCkgeGhyLnRpbWVvdXQgPSBvcHQudGltZW91dDtcblxuICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCd0aW1lb3V0Jyk7XG4gICAgY2FsbGJhY2soeGhyUmVzKGVycm9yLCB4aHIpKTtcbiAgfTsgLy8gc3VjY2VzcyAyeHgvM3h4LzR4eFxuXG5cbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsYmFjayh4aHJSZXMobnVsbCwgeGhyLCB4aHJCb2R5KHhociwgb3B0LmRhdGFUeXBlKSkpO1xuICB9OyAvLyBlcnJvciA1eHgvMCAo572R57uc6ZSZ6K+v44CB6Leo5Z+f5oql6ZSZ44CBSHR0cHMgY29ubmVjdC1zcmMg6ZmQ5Yi255qE5oql6ZSZ5pe2IHN0YXR1c0NvZGUg5Li6IDApXG5cblxuICB4aHIub25lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICB2YXIgYm9keSA9IHhockJvZHkoeGhyLCBvcHQuZGF0YVR5cGUpO1xuXG4gICAgaWYgKGJvZHkpIHtcbiAgICAgIC8vIDV4eFxuICAgICAgY2FsbGJhY2soeGhyUmVzKG51bGwsIHhociwgYm9keSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyAwXG4gICAgICB2YXIgZXJyb3IgPSB4aHIuc3RhdHVzVGV4dDtcbiAgICAgIGlmICghZXJyb3IgJiYgeGhyLnN0YXR1cyA9PT0gMCkgZXJyb3IgPSBuZXcgRXJyb3IoJ0NPUlMgYmxvY2tlZCBvciBuZXR3b3JrIGVycm9yJyk7XG4gICAgICBjYWxsYmFjayh4aHJSZXMoZXJyb3IsIHhociwgYm9keSkpO1xuICAgIH1cbiAgfTsgLy8gc2VuZFxuXG5cbiAgeGhyLnNlbmQob3B0LmJvZHkgfHwgJycpOyAvLyDov5Tlm54gYWpheCDlrp7kvovvvIznlKjkuo7lpJbpg6josIPnlKggeGhyLmFib3J0XG5cbiAgcmV0dXJuIHhocjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWVzdDsiLCIvKiBDb3B5cmlnaHQgMjAxNSBXaWxsaWFtIFN1bW1lcnMsIE1ldGFUcmliYWwgTExDXG4gKiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9KWE9OXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBAYXV0aG9yIFdpbGxpYW0gU3VtbWVyc1xuICogaHR0cHM6Ly9naXRodWIuY29tL21ldGF0cmliYWwveG1sVG9KU09OXG4gKi9cbnZhciBET01QYXJzZXIgPSByZXF1aXJlKCdAeG1sZG9tL3htbGRvbScpLkRPTVBhcnNlcjtcblxudmFyIHhtbFRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy52ZXJzaW9uID0gXCIxLjMuNVwiO1xuICB2YXIgb3B0aW9ucyA9IHtcbiAgICAvLyBzZXQgdXAgdGhlIGRlZmF1bHQgb3B0aW9uc1xuICAgIG1lcmdlQ0RBVEE6IHRydWUsXG4gICAgLy8gZXh0cmFjdCBjZGF0YSBhbmQgbWVyZ2Ugd2l0aCB0ZXh0XG4gICAgbm9ybWFsaXplOiB0cnVlLFxuICAgIC8vIGNvbGxhcHNlIG11bHRpcGxlIHNwYWNlcyB0byBzaW5nbGUgc3BhY2VcbiAgICBzdHJpcEVsZW1QcmVmaXg6IHRydWUgLy8gZm9yIGVsZW1lbnRzIG9mIHNhbWUgbmFtZSBpbiBkaWZmIG5hbWVzcGFjZXMsIHlvdSBjYW4gZW5hYmxlIG5hbWVzcGFjZXMgYW5kIGFjY2VzcyB0aGUgbnNrZXkgcHJvcGVydHlcblxuICB9O1xuICB2YXIgcHJlZml4TWF0Y2ggPSBuZXcgUmVnRXhwKC8oPyF4bWxucyleLio6Lyk7XG4gIHZhciB0cmltTWF0Y2ggPSBuZXcgUmVnRXhwKC9eXFxzK3xcXHMrJC9nKTtcblxuICB0aGlzLmdyb2tUeXBlID0gZnVuY3Rpb24gKHNWYWx1ZSkge1xuICAgIGlmICgvXlxccyokLy50ZXN0KHNWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICgvXig/OnRydWV8ZmFsc2UpJC9pLnRlc3Qoc1ZhbHVlKSkge1xuICAgICAgcmV0dXJuIHNWYWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIjtcbiAgICB9XG5cbiAgICBpZiAoaXNGaW5pdGUoc1ZhbHVlKSkge1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoc1ZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc1ZhbHVlO1xuICB9O1xuXG4gIHRoaXMucGFyc2VTdHJpbmcgPSBmdW5jdGlvbiAoeG1sU3RyaW5nLCBvcHQpIHtcbiAgICBpZiAoeG1sU3RyaW5nKSB7XG4gICAgICB2YXIgeG1sID0gdGhpcy5zdHJpbmdUb1hNTCh4bWxTdHJpbmcpO1xuXG4gICAgICBpZiAoeG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwYXJzZXJlcnJvcicpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlWE1MKHhtbCwgb3B0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMucGFyc2VYTUwgPSBmdW5jdGlvbiAob1hNTFBhcmVudCwgb3B0KSB7XG4gICAgLy8gaW5pdGlhbGl6ZSBvcHRpb25zXG4gICAgZm9yICh2YXIga2V5IGluIG9wdCkge1xuICAgICAgb3B0aW9uc1trZXldID0gb3B0W2tleV07XG4gICAgfVxuXG4gICAgdmFyIHZSZXN1bHQgPSB7fSxcbiAgICAgICAgbkxlbmd0aCA9IDAsXG4gICAgICAgIHNDb2xsZWN0ZWRUeHQgPSBcIlwiOyAvLyBpdGVyYXRlIG92ZXIgdGhlIGNoaWxkcmVuXG5cbiAgICB2YXIgY2hpbGROdW0gPSBvWE1MUGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoO1xuXG4gICAgaWYgKGNoaWxkTnVtKSB7XG4gICAgICBmb3IgKHZhciBvTm9kZSwgc1Byb3AsIHZDb250ZW50LCBuSXRlbSA9IDA7IG5JdGVtIDwgb1hNTFBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aDsgbkl0ZW0rKykge1xuICAgICAgICBvTm9kZSA9IG9YTUxQYXJlbnQuY2hpbGROb2Rlcy5pdGVtKG5JdGVtKTtcblxuICAgICAgICBpZiAob05vZGUubm9kZVR5cGUgPT09IDQpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5tZXJnZUNEQVRBKSB7XG4gICAgICAgICAgICBzQ29sbGVjdGVkVHh0ICs9IG9Ob2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyogbm9kZVR5cGUgaXMgXCJDREFUQVNlY3Rpb25cIiAoNCkgKi9cbiAgICAgICAgZWxzZSBpZiAob05vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICBzQ29sbGVjdGVkVHh0ICs9IG9Ob2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvKiBub2RlVHlwZSBpcyBcIlRleHRcIiAoMykgKi9cbiAgICAgICAgZWxzZSBpZiAob05vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAvKiBub2RlVHlwZSBpcyBcIkVsZW1lbnRcIiAoMSkgKi9cbiAgICAgICAgICBpZiAobkxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdlJlc3VsdCA9IHt9O1xuICAgICAgICAgIH0gLy8gdXNpbmcgbm9kZU5hbWUgdG8gc3VwcG9ydCBicm93c2VyIChJRSkgaW1wbGVtZW50YXRpb24gd2l0aCBubyAnbG9jYWxOYW1lJyBwcm9wZXJ0eVxuXG5cbiAgICAgICAgICBpZiAob3B0aW9ucy5zdHJpcEVsZW1QcmVmaXgpIHtcbiAgICAgICAgICAgIHNQcm9wID0gb05vZGUubm9kZU5hbWUucmVwbGFjZShwcmVmaXhNYXRjaCwgJycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzUHJvcCA9IG9Ob2RlLm5vZGVOYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZDb250ZW50ID0geG1sVG9KU09OLnBhcnNlWE1MKG9Ob2RlKTtcblxuICAgICAgICAgIGlmICh2UmVzdWx0Lmhhc093blByb3BlcnR5KHNQcm9wKSkge1xuICAgICAgICAgICAgaWYgKHZSZXN1bHRbc1Byb3BdLmNvbnN0cnVjdG9yICE9PSBBcnJheSkge1xuICAgICAgICAgICAgICB2UmVzdWx0W3NQcm9wXSA9IFt2UmVzdWx0W3NQcm9wXV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZSZXN1bHRbc1Byb3BdLnB1c2godkNvbnRlbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2UmVzdWx0W3NQcm9wXSA9IHZDb250ZW50O1xuICAgICAgICAgICAgbkxlbmd0aCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghT2JqZWN0LmtleXModlJlc3VsdCkubGVuZ3RoKSB7XG4gICAgICAvLyB2UmVzdWx0ID0gc0NvbGxlY3RlZFR4dC5yZXBsYWNlKHRyaW1NYXRjaCwgJycpIHx8ICcnOyAvLyBieSBjYXJzb254dSDkv67lpI0gZ2V0QnVja2V06L+U5Zue55qEIEtleSDmmK8gXCIgL1wiIOi/meenjeWcuuaZr1xuICAgICAgdlJlc3VsdCA9IHNDb2xsZWN0ZWRUeHQgfHwgJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZSZXN1bHQ7XG4gIH07IC8vIENvbnZlcnQgeG1sRG9jdW1lbnQgdG8gYSBzdHJpbmdcbiAgLy8gUmV0dXJucyBudWxsIG9uIGZhaWx1cmVcblxuXG4gIHRoaXMueG1sVG9TdHJpbmcgPSBmdW5jdGlvbiAoeG1sRG9jKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciB4bWxTdHJpbmcgPSB4bWxEb2MueG1sID8geG1sRG9jLnhtbCA6IG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoeG1sRG9jKTtcbiAgICAgIHJldHVybiB4bWxTdHJpbmc7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07IC8vIENvbnZlcnQgYSBzdHJpbmcgdG8gWE1MIE5vZGUgU3RydWN0dXJlXG4gIC8vIFJldHVybnMgbnVsbCBvbiBmYWlsdXJlXG5cblxuICB0aGlzLnN0cmluZ1RvWE1MID0gZnVuY3Rpb24gKHhtbFN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgeG1sRG9jID0gbnVsbDtcblxuICAgICAgaWYgKHdpbmRvdy5ET01QYXJzZXIpIHtcbiAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgeG1sRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG4gICAgICAgIHJldHVybiB4bWxEb2M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4bWxEb2MgPSBuZXcgQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxET01cIik7XG4gICAgICAgIHhtbERvYy5hc3luYyA9IGZhbHNlO1xuICAgICAgICB4bWxEb2MubG9hZFhNTCh4bWxTdHJpbmcpO1xuICAgICAgICByZXR1cm4geG1sRG9jO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdGhpcztcbn0uY2FsbCh7fSk7XG5cbnZhciB4bWwyanNvbiA9IGZ1bmN0aW9uIHhtbDJqc29uKHhtbFN0cmluZykge1xuICByZXR1cm4geG1sVG9KU09OLnBhcnNlU3RyaW5nKHhtbFN0cmluZyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHhtbDJqc29uOyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NyZWF0ZUNsYXNzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiAobW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cyksIF90eXBlb2Yob2JqKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogXCJTaGFsbG93IGZyZWV6ZXNcIiBhbiBvYmplY3QgdG8gcmVuZGVyIGl0IGltbXV0YWJsZS5cbiAqIFVzZXMgYE9iamVjdC5mcmVlemVgIGlmIGF2YWlsYWJsZSxcbiAqIG90aGVyd2lzZSB0aGUgaW1tdXRhYmlsaXR5IGlzIG9ubHkgaW4gdGhlIHR5cGUuXG4gKlxuICogSXMgdXNlZCB0byBjcmVhdGUgXCJlbnVtIGxpa2VcIiBvYmplY3RzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IG9iamVjdCB0aGUgb2JqZWN0IHRvIGZyZWV6ZVxuICogQHBhcmFtIHtQaWNrPE9iamVjdENvbnN0cnVjdG9yLCAnZnJlZXplJz4gPSBPYmplY3R9IG9jIGBPYmplY3RgIGJ5IGRlZmF1bHQsXG4gKiBcdFx0XHRcdGFsbG93cyB0byBpbmplY3QgY3VzdG9tIG9iamVjdCBjb25zdHJ1Y3RvciBmb3IgdGVzdHNcbiAqIEByZXR1cm5zIHtSZWFkb25seTxUPn1cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9mcmVlemVcbiAqL1xuZnVuY3Rpb24gZnJlZXplKG9iamVjdCwgb2MpIHtcblx0aWYgKG9jID09PSB1bmRlZmluZWQpIHtcblx0XHRvYyA9IE9iamVjdFxuXHR9XG5cdHJldHVybiBvYyAmJiB0eXBlb2Ygb2MuZnJlZXplID09PSAnZnVuY3Rpb24nID8gb2MuZnJlZXplKG9iamVjdCkgOiBvYmplY3Rcbn1cblxuLyoqXG4gKiBTaW5jZSB3ZSBjYW4gbm90IHJlbHkgb24gYE9iamVjdC5hc3NpZ25gIHdlIHByb3ZpZGUgYSBzaW1wbGlmaWVkIHZlcnNpb25cbiAqIHRoYXQgaXMgc3VmZmljaWVudCBmb3Igb3VyIG5lZWRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZH0gc291cmNlXG4gKlxuICogQHJldHVybnMge09iamVjdH0gdGFyZ2V0XG4gKiBAdGhyb3dzIFR5cGVFcnJvciBpZiB0YXJnZXQgaXMgbm90IGFuIG9iamVjdFxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxuICogQHNlZSBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi9tdWx0aXBhZ2UvZnVuZGFtZW50YWwtb2JqZWN0cy5odG1sI3NlYy1vYmplY3QuYXNzaWduXG4gKi9cbmZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkge1xuXHRpZiAodGFyZ2V0ID09PSBudWxsIHx8IHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcigndGFyZ2V0IGlzIG5vdCBhbiBvYmplY3QnKVxuXHR9XG5cdGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcblx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuXHRcdFx0dGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdGFyZ2V0XG59XG5cbi8qKlxuICogQWxsIG1pbWUgdHlwZXMgdGhhdCBhcmUgYWxsb3dlZCBhcyBpbnB1dCB0byBgRE9NUGFyc2VyLnBhcnNlRnJvbVN0cmluZ2BcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9ET01QYXJzZXIvcGFyc2VGcm9tU3RyaW5nI0FyZ3VtZW50MDIgTUROXG4gKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2R5bmFtaWMtbWFya3VwLWluc2VydGlvbi5odG1sI2RvbXBhcnNlcnN1cHBvcnRlZHR5cGUgV0hBVFdHIEhUTUwgU3BlY1xuICogQHNlZSBET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZ1xuICovXG52YXIgTUlNRV9UWVBFID0gZnJlZXplKHtcblx0LyoqXG5cdCAqIGB0ZXh0L2h0bWxgLCB0aGUgb25seSBtaW1lIHR5cGUgdGhhdCB0cmlnZ2VycyB0cmVhdGluZyBhbiBYTUwgZG9jdW1lbnQgYXMgSFRNTC5cblx0ICpcblx0ICogQHNlZSBET01QYXJzZXIuU3VwcG9ydGVkVHlwZS5pc0hUTUxcblx0ICogQHNlZSBodHRwczovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy90ZXh0L2h0bWwgSUFOQSBNaW1lVHlwZSByZWdpc3RyYXRpb25cblx0ICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IVE1MIFdpa2lwZWRpYVxuXHQgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9ET01QYXJzZXIvcGFyc2VGcm9tU3RyaW5nIE1ETlxuXHQgKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2R5bmFtaWMtbWFya3VwLWluc2VydGlvbi5odG1sI2RvbS1kb21wYXJzZXItcGFyc2Vmcm9tc3RyaW5nIFdIQVRXRyBIVE1MIFNwZWNcblx0ICovXG5cdEhUTUw6ICd0ZXh0L2h0bWwnLFxuXG5cdC8qKlxuXHQgKiBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIGEgbWltZSB0eXBlIGlmIGl0IGluZGljYXRlcyBhbiBIVE1MIGRvY3VtZW50XG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKlxuXHQgKiBAc2VlIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL3RleHQvaHRtbCBJQU5BIE1pbWVUeXBlIHJlZ2lzdHJhdGlvblxuXHQgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hUTUwgV2lraXBlZGlhXG5cdCAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RPTVBhcnNlci9wYXJzZUZyb21TdHJpbmcgTUROXG5cdCAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZHluYW1pYy1tYXJrdXAtaW5zZXJ0aW9uLmh0bWwjZG9tLWRvbXBhcnNlci1wYXJzZWZyb21zdHJpbmcgXHQgKi9cblx0aXNIVE1MOiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRyZXR1cm4gdmFsdWUgPT09IE1JTUVfVFlQRS5IVE1MXG5cdH0sXG5cblx0LyoqXG5cdCAqIGBhcHBsaWNhdGlvbi94bWxgLCB0aGUgc3RhbmRhcmQgbWltZSB0eXBlIGZvciBYTUwgZG9jdW1lbnRzLlxuXHQgKlxuXHQgKiBAc2VlIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL2FwcGxpY2F0aW9uL3htbCBJQU5BIE1pbWVUeXBlIHJlZ2lzdHJhdGlvblxuXHQgKiBAc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MzAzI3NlY3Rpb24tOS4xIFJGQyA3MzAzXG5cdCAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWE1MX2FuZF9NSU1FIFdpa2lwZWRpYVxuXHQgKi9cblx0WE1MX0FQUExJQ0FUSU9OOiAnYXBwbGljYXRpb24veG1sJyxcblxuXHQvKipcblx0ICogYHRleHQvaHRtbGAsIGFuIGFsaWFzIGZvciBgYXBwbGljYXRpb24veG1sYC5cblx0ICpcblx0ICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzMwMyNzZWN0aW9uLTkuMiBSRkMgNzMwM1xuXHQgKiBAc2VlIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL3RleHQveG1sIElBTkEgTWltZVR5cGUgcmVnaXN0cmF0aW9uXG5cdCAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWE1MX2FuZF9NSU1FIFdpa2lwZWRpYVxuXHQgKi9cblx0WE1MX1RFWFQ6ICd0ZXh0L3htbCcsXG5cblx0LyoqXG5cdCAqIGBhcHBsaWNhdGlvbi94aHRtbCt4bWxgLCBpbmRpY2F0ZXMgYW4gWE1MIGRvY3VtZW50IHRoYXQgaGFzIHRoZSBkZWZhdWx0IEhUTUwgbmFtZXNwYWNlLFxuXHQgKiBidXQgaXMgcGFyc2VkIGFzIGFuIFhNTCBkb2N1bWVudC5cblx0ICpcblx0ICogQHNlZSBodHRwczovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9hcHBsaWNhdGlvbi94aHRtbCt4bWwgSUFOQSBNaW1lVHlwZSByZWdpc3RyYXRpb25cblx0ICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1kb21pbXBsZW1lbnRhdGlvbi1jcmVhdGVkb2N1bWVudCBXSEFUV0cgRE9NIFNwZWNcblx0ICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9YSFRNTCBXaWtpcGVkaWFcblx0ICovXG5cdFhNTF9YSFRNTF9BUFBMSUNBVElPTjogJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsXG5cblx0LyoqXG5cdCAqIGBpbWFnZS9zdmcreG1sYCxcblx0ICpcblx0ICogQHNlZSBodHRwczovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9pbWFnZS9zdmcreG1sIElBTkEgTWltZVR5cGUgcmVnaXN0cmF0aW9uXG5cdCAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1NWRzExLyBXM0MgU1ZHIDEuMVxuXHQgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NjYWxhYmxlX1ZlY3Rvcl9HcmFwaGljcyBXaWtpcGVkaWFcblx0ICovXG5cdFhNTF9TVkdfSU1BR0U6ICdpbWFnZS9zdmcreG1sJyxcbn0pXG5cbi8qKlxuICogTmFtZXNwYWNlcyB0aGF0IGFyZSB1c2VkIGluIHRoaXMgY29kZSBiYXNlLlxuICpcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lc1xuICovXG52YXIgTkFNRVNQQUNFID0gZnJlZXplKHtcblx0LyoqXG5cdCAqIFRoZSBYSFRNTCBuYW1lc3BhY2UuXG5cdCAqXG5cdCAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFxuXHQgKi9cblx0SFRNTDogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLFxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYHVyaWAgZXF1YWxzIGBOQU1FU1BBQ0UuSFRNTGAuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbdXJpXVxuXHQgKlxuXHQgKiBAc2VlIE5BTUVTUEFDRS5IVE1MXG5cdCAqL1xuXHRpc0hUTUw6IGZ1bmN0aW9uICh1cmkpIHtcblx0XHRyZXR1cm4gdXJpID09PSBOQU1FU1BBQ0UuSFRNTFxuXHR9LFxuXG5cdC8qKlxuXHQgKiBUaGUgU1ZHIG5hbWVzcGFjZS5cblx0ICpcblx0ICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xuXHQgKi9cblx0U1ZHOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFxuXG5cdC8qKlxuXHQgKiBUaGUgYHhtbDpgIG5hbWVzcGFjZS5cblx0ICpcblx0ICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2Vcblx0ICovXG5cdFhNTDogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsXG5cblx0LyoqXG5cdCAqIFRoZSBgeG1sbnM6YCBuYW1lc3BhY2Vcblx0ICpcblx0ICogQHNlZSBodHRwczovL3d3dy53My5vcmcvMjAwMC94bWxucy9cblx0ICovXG5cdFhNTE5TOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8nLFxufSlcblxuZXhwb3J0cy5hc3NpZ24gPSBhc3NpZ247XG5leHBvcnRzLmZyZWV6ZSA9IGZyZWV6ZTtcbmV4cG9ydHMuTUlNRV9UWVBFID0gTUlNRV9UWVBFO1xuZXhwb3J0cy5OQU1FU1BBQ0UgPSBOQU1FU1BBQ0U7XG4iLCJ2YXIgY29udmVudGlvbnMgPSByZXF1aXJlKFwiLi9jb252ZW50aW9uc1wiKTtcbnZhciBkb20gPSByZXF1aXJlKCcuL2RvbScpXG52YXIgZW50aXRpZXMgPSByZXF1aXJlKCcuL2VudGl0aWVzJyk7XG52YXIgc2F4ID0gcmVxdWlyZSgnLi9zYXgnKTtcblxudmFyIERPTUltcGxlbWVudGF0aW9uID0gZG9tLkRPTUltcGxlbWVudGF0aW9uO1xuXG52YXIgTkFNRVNQQUNFID0gY29udmVudGlvbnMuTkFNRVNQQUNFO1xuXG52YXIgUGFyc2VFcnJvciA9IHNheC5QYXJzZUVycm9yO1xudmFyIFhNTFJlYWRlciA9IHNheC5YTUxSZWFkZXI7XG5cbi8qKlxuICogTm9ybWFsaXplcyBsaW5lIGVuZGluZyBhY2NvcmRpbmcgdG8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3htbDExLyNzZWMtbGluZS1lbmRzOlxuICpcbiAqID4gWE1MIHBhcnNlZCBlbnRpdGllcyBhcmUgb2Z0ZW4gc3RvcmVkIGluIGNvbXB1dGVyIGZpbGVzIHdoaWNoLFxuICogPiBmb3IgZWRpdGluZyBjb252ZW5pZW5jZSwgYXJlIG9yZ2FuaXplZCBpbnRvIGxpbmVzLlxuICogPiBUaGVzZSBsaW5lcyBhcmUgdHlwaWNhbGx5IHNlcGFyYXRlZCBieSBzb21lIGNvbWJpbmF0aW9uXG4gKiA+IG9mIHRoZSBjaGFyYWN0ZXJzIENBUlJJQUdFIFJFVFVSTiAoI3hEKSBhbmQgTElORSBGRUVEICgjeEEpLlxuICogPlxuICogPiBUbyBzaW1wbGlmeSB0aGUgdGFza3Mgb2YgYXBwbGljYXRpb25zLCB0aGUgWE1MIHByb2Nlc3NvciBtdXN0IGJlaGF2ZVxuICogPiBhcyBpZiBpdCBub3JtYWxpemVkIGFsbCBsaW5lIGJyZWFrcyBpbiBleHRlcm5hbCBwYXJzZWQgZW50aXRpZXMgKGluY2x1ZGluZyB0aGUgZG9jdW1lbnQgZW50aXR5KVxuICogPiBvbiBpbnB1dCwgYmVmb3JlIHBhcnNpbmcsIGJ5IHRyYW5zbGF0aW5nIGFsbCBvZiB0aGUgZm9sbG93aW5nIHRvIGEgc2luZ2xlICN4QSBjaGFyYWN0ZXI6XG4gKiA+XG4gKiA+IDEuIHRoZSB0d28tY2hhcmFjdGVyIHNlcXVlbmNlICN4RCAjeEFcbiAqID4gMi4gdGhlIHR3by1jaGFyYWN0ZXIgc2VxdWVuY2UgI3hEICN4ODVcbiAqID4gMy4gdGhlIHNpbmdsZSBjaGFyYWN0ZXIgI3g4NVxuICogPiA0LiB0aGUgc2luZ2xlIGNoYXJhY3RlciAjeDIwMjhcbiAqID4gNS4gYW55ICN4RCBjaGFyYWN0ZXIgdGhhdCBpcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgI3hBIG9yICN4ODUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVMaW5lRW5kaW5ncyhpbnB1dCkge1xuXHRyZXR1cm4gaW5wdXRcblx0XHQucmVwbGFjZSgvXFxyW1xcblxcdTAwODVdL2csICdcXG4nKVxuXHRcdC5yZXBsYWNlKC9bXFxyXFx1MDA4NVxcdTIwMjhdL2csICdcXG4nKVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIExvY2F0b3JcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY29sdW1uTnVtYmVyXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtsaW5lTnVtYmVyXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRE9NUGFyc2VyT3B0aW9uc1xuICogQHByb3BlcnR5IHtET01IYW5kbGVyfSBbZG9tQnVpbGRlcl1cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IFtlcnJvckhhbmRsZXJdXG4gKiBAcHJvcGVydHkgeyhzdHJpbmcpID0+IHN0cmluZ30gW25vcm1hbGl6ZUxpbmVFbmRpbmdzXSB1c2VkIHRvIHJlcGxhY2UgbGluZSBlbmRpbmdzIGJlZm9yZSBwYXJzaW5nXG4gKiBcdFx0XHRcdFx0XHRkZWZhdWx0cyB0byBgbm9ybWFsaXplTGluZUVuZGluZ3NgXG4gKiBAcHJvcGVydHkge0xvY2F0b3J9IFtsb2NhdG9yXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbeG1sbnNdXG4gKlxuICogQHNlZSBub3JtYWxpemVMaW5lRW5kaW5nc1xuICovXG5cbi8qKlxuICogVGhlIERPTVBhcnNlciBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gcGFyc2UgWE1MIG9yIEhUTUwgc291cmNlIGNvZGVcbiAqIGZyb20gYSBzdHJpbmcgaW50byBhIERPTSBgRG9jdW1lbnRgLlxuICpcbiAqIF94bWxkb20gaXMgZGlmZmVyZW50IGZyb20gdGhlIHNwZWMgaW4gdGhhdCBpdCBhbGxvd3MgYW4gYG9wdGlvbnNgIHBhcmFtZXRlcixcbiAqIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLl9cbiAqXG4gKiBAcGFyYW0ge0RPTVBhcnNlck9wdGlvbnN9IFtvcHRpb25zXVxuICogQGNvbnN0cnVjdG9yXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRE9NUGFyc2VyXG4gKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2R5bmFtaWMtbWFya3VwLWluc2VydGlvbi5odG1sI2RvbS1wYXJzaW5nLWFuZC1zZXJpYWxpemF0aW9uXG4gKi9cbmZ1bmN0aW9uIERPTVBhcnNlcihvcHRpb25zKXtcblx0dGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fHtsb2NhdG9yOnt9fTtcbn1cblxuRE9NUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmcgPSBmdW5jdGlvbihzb3VyY2UsbWltZVR5cGUpe1xuXHR2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblx0dmFyIHNheCA9ICBuZXcgWE1MUmVhZGVyKCk7XG5cdHZhciBkb21CdWlsZGVyID0gb3B0aW9ucy5kb21CdWlsZGVyIHx8IG5ldyBET01IYW5kbGVyKCk7Ly9jb250ZW50SGFuZGxlciBhbmQgTGV4aWNhbEhhbmRsZXJcblx0dmFyIGVycm9ySGFuZGxlciA9IG9wdGlvbnMuZXJyb3JIYW5kbGVyO1xuXHR2YXIgbG9jYXRvciA9IG9wdGlvbnMubG9jYXRvcjtcblx0dmFyIGRlZmF1bHROU01hcCA9IG9wdGlvbnMueG1sbnN8fHt9O1xuXHR2YXIgaXNIVE1MID0gL1xcL3g/aHRtbD8kLy50ZXN0KG1pbWVUeXBlKTsvL21pbWVUeXBlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignaHRtbCcpID4gLTE7XG4gIFx0dmFyIGVudGl0eU1hcCA9IGlzSFRNTCA/IGVudGl0aWVzLkhUTUxfRU5USVRJRVMgOiBlbnRpdGllcy5YTUxfRU5USVRJRVM7XG5cdGlmKGxvY2F0b3Ipe1xuXHRcdGRvbUJ1aWxkZXIuc2V0RG9jdW1lbnRMb2NhdG9yKGxvY2F0b3IpXG5cdH1cblxuXHRzYXguZXJyb3JIYW5kbGVyID0gYnVpbGRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyLGRvbUJ1aWxkZXIsbG9jYXRvcik7XG5cdHNheC5kb21CdWlsZGVyID0gb3B0aW9ucy5kb21CdWlsZGVyIHx8IGRvbUJ1aWxkZXI7XG5cdGlmKGlzSFRNTCl7XG5cdFx0ZGVmYXVsdE5TTWFwWycnXSA9IE5BTUVTUEFDRS5IVE1MO1xuXHR9XG5cdGRlZmF1bHROU01hcC54bWwgPSBkZWZhdWx0TlNNYXAueG1sIHx8IE5BTUVTUEFDRS5YTUw7XG5cdHZhciBub3JtYWxpemUgPSBvcHRpb25zLm5vcm1hbGl6ZUxpbmVFbmRpbmdzIHx8IG5vcm1hbGl6ZUxpbmVFbmRpbmdzO1xuXHRpZiAoc291cmNlICYmIHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XG5cdFx0c2F4LnBhcnNlKFxuXHRcdFx0bm9ybWFsaXplKHNvdXJjZSksXG5cdFx0XHRkZWZhdWx0TlNNYXAsXG5cdFx0XHRlbnRpdHlNYXBcblx0XHQpXG5cdH0gZWxzZSB7XG5cdFx0c2F4LmVycm9ySGFuZGxlci5lcnJvcignaW52YWxpZCBkb2Mgc291cmNlJylcblx0fVxuXHRyZXR1cm4gZG9tQnVpbGRlci5kb2M7XG59XG5mdW5jdGlvbiBidWlsZEVycm9ySGFuZGxlcihlcnJvckltcGwsZG9tQnVpbGRlcixsb2NhdG9yKXtcblx0aWYoIWVycm9ySW1wbCl7XG5cdFx0aWYoZG9tQnVpbGRlciBpbnN0YW5jZW9mIERPTUhhbmRsZXIpe1xuXHRcdFx0cmV0dXJuIGRvbUJ1aWxkZXI7XG5cdFx0fVxuXHRcdGVycm9ySW1wbCA9IGRvbUJ1aWxkZXIgO1xuXHR9XG5cdHZhciBlcnJvckhhbmRsZXIgPSB7fVxuXHR2YXIgaXNDYWxsYmFjayA9IGVycm9ySW1wbCBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuXHRsb2NhdG9yID0gbG9jYXRvcnx8e31cblx0ZnVuY3Rpb24gYnVpbGQoa2V5KXtcblx0XHR2YXIgZm4gPSBlcnJvckltcGxba2V5XTtcblx0XHRpZighZm4gJiYgaXNDYWxsYmFjayl7XG5cdFx0XHRmbiA9IGVycm9ySW1wbC5sZW5ndGggPT0gMj9mdW5jdGlvbihtc2cpe2Vycm9ySW1wbChrZXksbXNnKX06ZXJyb3JJbXBsO1xuXHRcdH1cblx0XHRlcnJvckhhbmRsZXJba2V5XSA9IGZuICYmIGZ1bmN0aW9uKG1zZyl7XG5cdFx0XHRmbignW3htbGRvbSAnK2tleSsnXVxcdCcrbXNnK19sb2NhdG9yKGxvY2F0b3IpKTtcblx0XHR9fHxmdW5jdGlvbigpe307XG5cdH1cblx0YnVpbGQoJ3dhcm5pbmcnKTtcblx0YnVpbGQoJ2Vycm9yJyk7XG5cdGJ1aWxkKCdmYXRhbEVycm9yJyk7XG5cdHJldHVybiBlcnJvckhhbmRsZXI7XG59XG5cbi8vY29uc29sZS5sb2coJyNcXG5cXG5cXG5cXG5cXG5cXG5cXG4jIyMjJylcbi8qKlxuICogK0NvbnRlbnRIYW5kbGVyK0Vycm9ySGFuZGxlclxuICogK0xleGljYWxIYW5kbGVyK0VudGl0eVJlc29sdmVyMlxuICogLURlY2xIYW5kbGVyLURUREhhbmRsZXJcbiAqXG4gKiBEZWZhdWx0SGFuZGxlcjpFbnRpdHlSZXNvbHZlciwgRFRESGFuZGxlciwgQ29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlclxuICogRGVmYXVsdEhhbmRsZXIyOkRlZmF1bHRIYW5kbGVyLExleGljYWxIYW5kbGVyLCBEZWNsSGFuZGxlciwgRW50aXR5UmVzb2x2ZXIyXG4gKiBAbGluayBodHRwOi8vd3d3LnNheHByb2plY3Qub3JnL2FwaWRvYy9vcmcveG1sL3NheC9oZWxwZXJzL0RlZmF1bHRIYW5kbGVyLmh0bWxcbiAqL1xuZnVuY3Rpb24gRE9NSGFuZGxlcigpIHtcbiAgICB0aGlzLmNkYXRhID0gZmFsc2U7XG59XG5mdW5jdGlvbiBwb3NpdGlvbihsb2NhdG9yLG5vZGUpe1xuXHRub2RlLmxpbmVOdW1iZXIgPSBsb2NhdG9yLmxpbmVOdW1iZXI7XG5cdG5vZGUuY29sdW1uTnVtYmVyID0gbG9jYXRvci5jb2x1bW5OdW1iZXI7XG59XG4vKipcbiAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnREb2N1bWVudFxuICogQGxpbmsgaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvQ29udGVudEhhbmRsZXIuaHRtbFxuICovXG5ET01IYW5kbGVyLnByb3RvdHlwZSA9IHtcblx0c3RhcnREb2N1bWVudCA6IGZ1bmN0aW9uKCkge1xuICAgIFx0dGhpcy5kb2MgPSBuZXcgRE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudChudWxsLCBudWxsLCBudWxsKTtcbiAgICBcdGlmICh0aGlzLmxvY2F0b3IpIHtcbiAgICAgICAgXHR0aGlzLmRvYy5kb2N1bWVudFVSSSA9IHRoaXMubG9jYXRvci5zeXN0ZW1JZDtcbiAgICBcdH1cblx0fSxcblx0c3RhcnRFbGVtZW50OmZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cnMpIHtcblx0XHR2YXIgZG9jID0gdGhpcy5kb2M7XG5cdCAgICB2YXIgZWwgPSBkb2MuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgcU5hbWV8fGxvY2FsTmFtZSk7XG5cdCAgICB2YXIgbGVuID0gYXR0cnMubGVuZ3RoO1xuXHQgICAgYXBwZW5kRWxlbWVudCh0aGlzLCBlbCk7XG5cdCAgICB0aGlzLmN1cnJlbnRFbGVtZW50ID0gZWw7XG5cblx0XHR0aGlzLmxvY2F0b3IgJiYgcG9zaXRpb24odGhpcy5sb2NhdG9yLGVsKVxuXHQgICAgZm9yICh2YXIgaSA9IDAgOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICB2YXIgbmFtZXNwYWNlVVJJID0gYXR0cnMuZ2V0VVJJKGkpO1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IGF0dHJzLmdldFZhbHVlKGkpO1xuXHQgICAgICAgIHZhciBxTmFtZSA9IGF0dHJzLmdldFFOYW1lKGkpO1xuXHRcdFx0dmFyIGF0dHIgPSBkb2MuY3JlYXRlQXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBxTmFtZSk7XG5cdFx0XHR0aGlzLmxvY2F0b3IgJiZwb3NpdGlvbihhdHRycy5nZXRMb2NhdG9yKGkpLGF0dHIpO1xuXHRcdFx0YXR0ci52YWx1ZSA9IGF0dHIubm9kZVZhbHVlID0gdmFsdWU7XG5cdFx0XHRlbC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpXG5cdCAgICB9XG5cdH0sXG5cdGVuZEVsZW1lbnQ6ZnVuY3Rpb24obmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lKSB7XG5cdFx0dmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50XG5cdFx0dmFyIHRhZ05hbWUgPSBjdXJyZW50LnRhZ05hbWU7XG5cdFx0dGhpcy5jdXJyZW50RWxlbWVudCA9IGN1cnJlbnQucGFyZW50Tm9kZTtcblx0fSxcblx0c3RhcnRQcmVmaXhNYXBwaW5nOmZ1bmN0aW9uKHByZWZpeCwgdXJpKSB7XG5cdH0sXG5cdGVuZFByZWZpeE1hcHBpbmc6ZnVuY3Rpb24ocHJlZml4KSB7XG5cdH0sXG5cdHByb2Nlc3NpbmdJbnN0cnVjdGlvbjpmdW5jdGlvbih0YXJnZXQsIGRhdGEpIHtcblx0ICAgIHZhciBpbnMgPSB0aGlzLmRvYy5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBkYXRhKTtcblx0ICAgIHRoaXMubG9jYXRvciAmJiBwb3NpdGlvbih0aGlzLmxvY2F0b3IsaW5zKVxuXHQgICAgYXBwZW5kRWxlbWVudCh0aGlzLCBpbnMpO1xuXHR9LFxuXHRpZ25vcmFibGVXaGl0ZXNwYWNlOmZ1bmN0aW9uKGNoLCBzdGFydCwgbGVuZ3RoKSB7XG5cdH0sXG5cdGNoYXJhY3RlcnM6ZnVuY3Rpb24oY2hhcnMsIHN0YXJ0LCBsZW5ndGgpIHtcblx0XHRjaGFycyA9IF90b1N0cmluZy5hcHBseSh0aGlzLGFyZ3VtZW50cylcblx0XHQvL2NvbnNvbGUubG9nKGNoYXJzKVxuXHRcdGlmKGNoYXJzKXtcblx0XHRcdGlmICh0aGlzLmNkYXRhKSB7XG5cdFx0XHRcdHZhciBjaGFyTm9kZSA9IHRoaXMuZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbihjaGFycyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgY2hhck5vZGUgPSB0aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZShjaGFycyk7XG5cdFx0XHR9XG5cdFx0XHRpZih0aGlzLmN1cnJlbnRFbGVtZW50KXtcblx0XHRcdFx0dGhpcy5jdXJyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjaGFyTm9kZSk7XG5cdFx0XHR9ZWxzZSBpZigvXlxccyokLy50ZXN0KGNoYXJzKSl7XG5cdFx0XHRcdHRoaXMuZG9jLmFwcGVuZENoaWxkKGNoYXJOb2RlKTtcblx0XHRcdFx0Ly9wcm9jZXNzIHhtbFxuXHRcdFx0fVxuXHRcdFx0dGhpcy5sb2NhdG9yICYmIHBvc2l0aW9uKHRoaXMubG9jYXRvcixjaGFyTm9kZSlcblx0XHR9XG5cdH0sXG5cdHNraXBwZWRFbnRpdHk6ZnVuY3Rpb24obmFtZSkge1xuXHR9LFxuXHRlbmREb2N1bWVudDpmdW5jdGlvbigpIHtcblx0XHR0aGlzLmRvYy5ub3JtYWxpemUoKTtcblx0fSxcblx0c2V0RG9jdW1lbnRMb2NhdG9yOmZ1bmN0aW9uIChsb2NhdG9yKSB7XG5cdCAgICBpZih0aGlzLmxvY2F0b3IgPSBsb2NhdG9yKXsvLyAmJiAhKCdsaW5lTnVtYmVyJyBpbiBsb2NhdG9yKSl7XG5cdCAgICBcdGxvY2F0b3IubGluZU51bWJlciA9IDA7XG5cdCAgICB9XG5cdH0sXG5cdC8vTGV4aWNhbEhhbmRsZXJcblx0Y29tbWVudDpmdW5jdGlvbihjaGFycywgc3RhcnQsIGxlbmd0aCkge1xuXHRcdGNoYXJzID0gX3RvU3RyaW5nLmFwcGx5KHRoaXMsYXJndW1lbnRzKVxuXHQgICAgdmFyIGNvbW0gPSB0aGlzLmRvYy5jcmVhdGVDb21tZW50KGNoYXJzKTtcblx0ICAgIHRoaXMubG9jYXRvciAmJiBwb3NpdGlvbih0aGlzLmxvY2F0b3IsY29tbSlcblx0ICAgIGFwcGVuZEVsZW1lbnQodGhpcywgY29tbSk7XG5cdH0sXG5cblx0c3RhcnRDREFUQTpmdW5jdGlvbigpIHtcblx0ICAgIC8vdXNlZCBpbiBjaGFyYWN0ZXJzKCkgbWV0aG9kc1xuXHQgICAgdGhpcy5jZGF0YSA9IHRydWU7XG5cdH0sXG5cdGVuZENEQVRBOmZ1bmN0aW9uKCkge1xuXHQgICAgdGhpcy5jZGF0YSA9IGZhbHNlO1xuXHR9LFxuXG5cdHN0YXJ0RFREOmZ1bmN0aW9uKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkge1xuXHRcdHZhciBpbXBsID0gdGhpcy5kb2MuaW1wbGVtZW50YXRpb247XG5cdCAgICBpZiAoaW1wbCAmJiBpbXBsLmNyZWF0ZURvY3VtZW50VHlwZSkge1xuXHQgICAgICAgIHZhciBkdCA9IGltcGwuY3JlYXRlRG9jdW1lbnRUeXBlKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7XG5cdCAgICAgICAgdGhpcy5sb2NhdG9yICYmIHBvc2l0aW9uKHRoaXMubG9jYXRvcixkdClcblx0ICAgICAgICBhcHBlbmRFbGVtZW50KHRoaXMsIGR0KTtcblx0XHRcdFx0XHR0aGlzLmRvYy5kb2N0eXBlID0gZHQ7XG5cdCAgICB9XG5cdH0sXG5cdC8qKlxuXHQgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlclxuXHQgKiBAbGluayBodHRwOi8vd3d3LnNheHByb2plY3Qub3JnL2FwaWRvYy9vcmcveG1sL3NheC9FcnJvckhhbmRsZXIuaHRtbFxuXHQgKi9cblx0d2FybmluZzpmdW5jdGlvbihlcnJvcikge1xuXHRcdGNvbnNvbGUud2FybignW3htbGRvbSB3YXJuaW5nXVxcdCcrZXJyb3IsX2xvY2F0b3IodGhpcy5sb2NhdG9yKSk7XG5cdH0sXG5cdGVycm9yOmZ1bmN0aW9uKGVycm9yKSB7XG5cdFx0Y29uc29sZS5lcnJvcignW3htbGRvbSBlcnJvcl1cXHQnK2Vycm9yLF9sb2NhdG9yKHRoaXMubG9jYXRvcikpO1xuXHR9LFxuXHRmYXRhbEVycm9yOmZ1bmN0aW9uKGVycm9yKSB7XG5cdFx0dGhyb3cgbmV3IFBhcnNlRXJyb3IoZXJyb3IsIHRoaXMubG9jYXRvcik7XG5cdH1cbn1cbmZ1bmN0aW9uIF9sb2NhdG9yKGwpe1xuXHRpZihsKXtcblx0XHRyZXR1cm4gJ1xcbkAnKyhsLnN5c3RlbUlkIHx8JycpKycjW2xpbmU6JytsLmxpbmVOdW1iZXIrJyxjb2w6JytsLmNvbHVtbk51bWJlcisnXSdcblx0fVxufVxuZnVuY3Rpb24gX3RvU3RyaW5nKGNoYXJzLHN0YXJ0LGxlbmd0aCl7XG5cdGlmKHR5cGVvZiBjaGFycyA9PSAnc3RyaW5nJyl7XG5cdFx0cmV0dXJuIGNoYXJzLnN1YnN0cihzdGFydCxsZW5ndGgpXG5cdH1lbHNley8vamF2YSBzYXggY29ubmVjdCB3aWR0aCB4bWxkb20gb24gcmhpbm8od2hhdCBhYm91dDogXCI/ICYmICEoY2hhcnMgaW5zdGFuY2VvZiBTdHJpbmcpXCIpXG5cdFx0aWYoY2hhcnMubGVuZ3RoID49IHN0YXJ0K2xlbmd0aCB8fCBzdGFydCl7XG5cdFx0XHRyZXR1cm4gbmV3IGphdmEubGFuZy5TdHJpbmcoY2hhcnMsc3RhcnQsbGVuZ3RoKSsnJztcblx0XHR9XG5cdFx0cmV0dXJuIGNoYXJzO1xuXHR9XG59XG5cbi8qXG4gKiBAbGluayBodHRwOi8vd3d3LnNheHByb2plY3Qub3JnL2FwaWRvYy9vcmcveG1sL3NheC9leHQvTGV4aWNhbEhhbmRsZXIuaHRtbFxuICogdXNlZCBtZXRob2Qgb2Ygb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOlxuICogICNjb21tZW50KGNoYXJzLCBzdGFydCwgbGVuZ3RoKVxuICogICNzdGFydENEQVRBKClcbiAqICAjZW5kQ0RBVEEoKVxuICogICNzdGFydERURChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpXG4gKlxuICpcbiAqIElHTk9SRUQgbWV0aG9kIG9mIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjpcbiAqICAjZW5kRFREKClcbiAqICAjc3RhcnRFbnRpdHkobmFtZSlcbiAqICAjZW5kRW50aXR5KG5hbWUpXG4gKlxuICpcbiAqIEBsaW5rIGh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvYXBpZG9jL29yZy94bWwvc2F4L2V4dC9EZWNsSGFuZGxlci5odG1sXG4gKiBJR05PUkVEIG1ldGhvZCBvZiBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXJcbiAqIFx0I2F0dHJpYnV0ZURlY2woZU5hbWUsIGFOYW1lLCB0eXBlLCBtb2RlLCB2YWx1ZSlcbiAqICAjZWxlbWVudERlY2wobmFtZSwgbW9kZWwpXG4gKiAgI2V4dGVybmFsRW50aXR5RGVjbChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpXG4gKiAgI2ludGVybmFsRW50aXR5RGVjbChuYW1lLCB2YWx1ZSlcbiAqIEBsaW5rIGh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvYXBpZG9jL29yZy94bWwvc2F4L2V4dC9FbnRpdHlSZXNvbHZlcjIuaHRtbFxuICogSUdOT1JFRCBtZXRob2Qgb2Ygb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIyXG4gKiAgI3Jlc29sdmVFbnRpdHkoU3RyaW5nIG5hbWUsU3RyaW5nIHB1YmxpY0lkLFN0cmluZyBiYXNlVVJJLFN0cmluZyBzeXN0ZW1JZClcbiAqICAjcmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpXG4gKiAgI2dldEV4dGVybmFsU3Vic2V0KG5hbWUsIGJhc2VVUkkpXG4gKiBAbGluayBodHRwOi8vd3d3LnNheHByb2plY3Qub3JnL2FwaWRvYy9vcmcveG1sL3NheC9EVERIYW5kbGVyLmh0bWxcbiAqIElHTk9SRUQgbWV0aG9kIG9mIG9yZy54bWwuc2F4LkRUREhhbmRsZXJcbiAqICAjbm90YXRpb25EZWNsKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkge307XG4gKiAgI3VucGFyc2VkRW50aXR5RGVjbChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG5vdGF0aW9uTmFtZSkge307XG4gKi9cblwiZW5kRFRELHN0YXJ0RW50aXR5LGVuZEVudGl0eSxhdHRyaWJ1dGVEZWNsLGVsZW1lbnREZWNsLGV4dGVybmFsRW50aXR5RGVjbCxpbnRlcm5hbEVudGl0eURlY2wscmVzb2x2ZUVudGl0eSxnZXRFeHRlcm5hbFN1YnNldCxub3RhdGlvbkRlY2wsdW5wYXJzZWRFbnRpdHlEZWNsXCIucmVwbGFjZSgvXFx3Ky9nLGZ1bmN0aW9uKGtleSl7XG5cdERPTUhhbmRsZXIucHJvdG90eXBlW2tleV0gPSBmdW5jdGlvbigpe3JldHVybiBudWxsfVxufSlcblxuLyogUHJpdmF0ZSBzdGF0aWMgaGVscGVycyB0cmVhdGVkIGJlbG93IGFzIHByaXZhdGUgaW5zdGFuY2UgbWV0aG9kcywgc28gZG9uJ3QgbmVlZCB0byBhZGQgdGhlc2UgdG8gdGhlIHB1YmxpYyBBUEk7IHdlIG1pZ2h0IHVzZSBhIFJlbGF0b3IgdG8gYWxzbyBnZXQgcmlkIG9mIG5vbi1zdGFuZGFyZCBwdWJsaWMgcHJvcGVydGllcyAqL1xuZnVuY3Rpb24gYXBwZW5kRWxlbWVudCAoaGFuZGVyLG5vZGUpIHtcbiAgICBpZiAoIWhhbmRlci5jdXJyZW50RWxlbWVudCkge1xuICAgICAgICBoYW5kZXIuZG9jLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGhhbmRlci5jdXJyZW50RWxlbWVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICB9XG59Ly9hcHBlbmRDaGlsZCBhbmQgc2V0QXR0cmlidXRlTlMgYXJlIHByZWZvcm1hbmNlIGtleVxuXG5leHBvcnRzLl9fRE9NSGFuZGxlciA9IERPTUhhbmRsZXI7XG5leHBvcnRzLm5vcm1hbGl6ZUxpbmVFbmRpbmdzID0gbm9ybWFsaXplTGluZUVuZGluZ3M7XG5leHBvcnRzLkRPTVBhcnNlciA9IERPTVBhcnNlcjtcbiIsInZhciBjb252ZW50aW9ucyA9IHJlcXVpcmUoXCIuL2NvbnZlbnRpb25zXCIpO1xuXG52YXIgTkFNRVNQQUNFID0gY29udmVudGlvbnMuTkFNRVNQQUNFO1xuXG4vKipcbiAqIEEgcHJlcmVxdWlzaXRlIGZvciBgW10uZmlsdGVyYCwgdG8gZHJvcCBlbGVtZW50cyB0aGF0IGFyZSBlbXB0eVxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gbm90RW1wdHlTdHJpbmcgKGlucHV0KSB7XG5cdHJldHVybiBpbnB1dCAhPT0gJydcbn1cbi8qKlxuICogQHNlZSBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jc3BsaXQtb24tYXNjaWktd2hpdGVzcGFjZVxuICogQHNlZSBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktd2hpdGVzcGFjZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFxuICogQHJldHVybnMge3N0cmluZ1tdfSAoY2FuIGJlIGVtcHR5KVxuICovXG5mdW5jdGlvbiBzcGxpdE9uQVNDSUlXaGl0ZXNwYWNlKGlucHV0KSB7XG5cdC8vIFUrMDAwOSBUQUIsIFUrMDAwQSBMRiwgVSswMDBDIEZGLCBVKzAwMEQgQ1IsIFUrMDAyMCBTUEFDRVxuXHRyZXR1cm4gaW5wdXQgPyBpbnB1dC5zcGxpdCgvW1xcdFxcblxcZlxcciBdKy8pLmZpbHRlcihub3RFbXB0eVN0cmluZykgOiBbXVxufVxuXG4vKipcbiAqIEFkZHMgZWxlbWVudCBhcyBhIGtleSB0byBjdXJyZW50IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQuXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgdW5kZWZpbmVkPn0gY3VycmVudFxuICogQHBhcmFtIHtzdHJpbmd9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgdW5kZWZpbmVkPn1cbiAqL1xuZnVuY3Rpb24gb3JkZXJlZFNldFJlZHVjZXIgKGN1cnJlbnQsIGVsZW1lbnQpIHtcblx0aWYgKCFjdXJyZW50Lmhhc093blByb3BlcnR5KGVsZW1lbnQpKSB7XG5cdFx0Y3VycmVudFtlbGVtZW50XSA9IHRydWU7XG5cdH1cblx0cmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jb3JkZXJlZC1zZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5mdW5jdGlvbiB0b09yZGVyZWRTZXQoaW5wdXQpIHtcblx0aWYgKCFpbnB1dCkgcmV0dXJuIFtdO1xuXHR2YXIgbGlzdCA9IHNwbGl0T25BU0NJSVdoaXRlc3BhY2UoaW5wdXQpO1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobGlzdC5yZWR1Y2Uob3JkZXJlZFNldFJlZHVjZXIsIHt9KSlcbn1cblxuLyoqXG4gKiBVc2VzIGBsaXN0LmluZGV4T2ZgIHRvIGltcGxlbWVudCBzb21ldGhpbmcgbGlrZSBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCxcbiAqIHdoaWNoIHdlIGNhbiBub3QgcmVseSBvbiBiZWluZyBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHthbnlbXX0gbGlzdFxuICogQHJldHVybnMge2Z1bmN0aW9uKGFueSk6IGJvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXMgKGxpc3QpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHRyZXR1cm4gbGlzdCAmJiBsaXN0LmluZGV4T2YoZWxlbWVudCkgIT09IC0xO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNvcHkoc3JjLGRlc3Qpe1xuXHRmb3IodmFyIHAgaW4gc3JjKXtcblx0XHRkZXN0W3BdID0gc3JjW3BdO1xuXHR9XG59XG5cbi8qKlxuXlxcdytcXC5wcm90b3R5cGVcXC4oW19cXHddKylcXHMqPVxccyooKD86LipcXHtcXHMqP1tcXHJcXG5dW1xcc1xcU10qP159KXxcXFMuKj8oPz1bO1xcclxcbl0pKTs/XG5eXFx3K1xcLnByb3RvdHlwZVxcLihbX1xcd10rKVxccyo9XFxzKihcXFMuKj8oPz1bO1xcclxcbl0pKTs/XG4gKi9cbmZ1bmN0aW9uIF9leHRlbmRzKENsYXNzLFN1cGVyKXtcblx0dmFyIHB0ID0gQ2xhc3MucHJvdG90eXBlO1xuXHRpZighKHB0IGluc3RhbmNlb2YgU3VwZXIpKXtcblx0XHRmdW5jdGlvbiB0KCl7fTtcblx0XHR0LnByb3RvdHlwZSA9IFN1cGVyLnByb3RvdHlwZTtcblx0XHR0ID0gbmV3IHQoKTtcblx0XHRjb3B5KHB0LHQpO1xuXHRcdENsYXNzLnByb3RvdHlwZSA9IHB0ID0gdDtcblx0fVxuXHRpZihwdC5jb25zdHJ1Y3RvciAhPSBDbGFzcyl7XG5cdFx0aWYodHlwZW9mIENsYXNzICE9ICdmdW5jdGlvbicpe1xuXHRcdFx0Y29uc29sZS5lcnJvcihcInVua25vd24gQ2xhc3M6XCIrQ2xhc3MpXG5cdFx0fVxuXHRcdHB0LmNvbnN0cnVjdG9yID0gQ2xhc3Ncblx0fVxufVxuXG4vLyBOb2RlIFR5cGVzXG52YXIgTm9kZVR5cGUgPSB7fVxudmFyIEVMRU1FTlRfTk9ERSAgICAgICAgICAgICAgICA9IE5vZGVUeXBlLkVMRU1FTlRfTk9ERSAgICAgICAgICAgICAgICA9IDE7XG52YXIgQVRUUklCVVRFX05PREUgICAgICAgICAgICAgID0gTm9kZVR5cGUuQVRUUklCVVRFX05PREUgICAgICAgICAgICAgID0gMjtcbnZhciBURVhUX05PREUgICAgICAgICAgICAgICAgICAgPSBOb2RlVHlwZS5URVhUX05PREUgICAgICAgICAgICAgICAgICAgPSAzO1xudmFyIENEQVRBX1NFQ1RJT05fTk9ERSAgICAgICAgICA9IE5vZGVUeXBlLkNEQVRBX1NFQ1RJT05fTk9ERSAgICAgICAgICA9IDQ7XG52YXIgRU5USVRZX1JFRkVSRU5DRV9OT0RFICAgICAgID0gTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFICAgICAgID0gNTtcbnZhciBFTlRJVFlfTk9ERSAgICAgICAgICAgICAgICAgPSBOb2RlVHlwZS5FTlRJVFlfTk9ERSAgICAgICAgICAgICAgICAgPSA2O1xudmFyIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA9IE5vZGVUeXBlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA9IDc7XG52YXIgQ09NTUVOVF9OT0RFICAgICAgICAgICAgICAgID0gTm9kZVR5cGUuQ09NTUVOVF9OT0RFICAgICAgICAgICAgICAgID0gODtcbnZhciBET0NVTUVOVF9OT0RFICAgICAgICAgICAgICAgPSBOb2RlVHlwZS5ET0NVTUVOVF9OT0RFICAgICAgICAgICAgICAgPSA5O1xudmFyIERPQ1VNRU5UX1RZUEVfTk9ERSAgICAgICAgICA9IE5vZGVUeXBlLkRPQ1VNRU5UX1RZUEVfTk9ERSAgICAgICAgICA9IDEwO1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICA9IE5vZGVUeXBlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICA9IDExO1xudmFyIE5PVEFUSU9OX05PREUgICAgICAgICAgICAgICA9IE5vZGVUeXBlLk5PVEFUSU9OX05PREUgICAgICAgICAgICAgICA9IDEyO1xuXG4vLyBFeGNlcHRpb25Db2RlXG52YXIgRXhjZXB0aW9uQ29kZSA9IHt9XG52YXIgRXhjZXB0aW9uTWVzc2FnZSA9IHt9O1xudmFyIElOREVYX1NJWkVfRVJSICAgICAgICAgICAgICA9IEV4Y2VwdGlvbkNvZGUuSU5ERVhfU0laRV9FUlIgICAgICAgICAgICAgID0gKChFeGNlcHRpb25NZXNzYWdlWzFdPVwiSW5kZXggc2l6ZSBlcnJvclwiKSwxKTtcbnZhciBET01TVFJJTkdfU0laRV9FUlIgICAgICAgICAgPSBFeGNlcHRpb25Db2RlLkRPTVNUUklOR19TSVpFX0VSUiAgICAgICAgICA9ICgoRXhjZXB0aW9uTWVzc2FnZVsyXT1cIkRPTVN0cmluZyBzaXplIGVycm9yXCIpLDIpO1xudmFyIEhJRVJBUkNIWV9SRVFVRVNUX0VSUiAgICAgICA9IEV4Y2VwdGlvbkNvZGUuSElFUkFSQ0hZX1JFUVVFU1RfRVJSICAgICAgID0gKChFeGNlcHRpb25NZXNzYWdlWzNdPVwiSGllcmFyY2h5IHJlcXVlc3QgZXJyb3JcIiksMyk7XG52YXIgV1JPTkdfRE9DVU1FTlRfRVJSICAgICAgICAgID0gRXhjZXB0aW9uQ29kZS5XUk9OR19ET0NVTUVOVF9FUlIgICAgICAgICAgPSAoKEV4Y2VwdGlvbk1lc3NhZ2VbNF09XCJXcm9uZyBkb2N1bWVudFwiKSw0KTtcbnZhciBJTlZBTElEX0NIQVJBQ1RFUl9FUlIgICAgICAgPSBFeGNlcHRpb25Db2RlLklOVkFMSURfQ0hBUkFDVEVSX0VSUiAgICAgICA9ICgoRXhjZXB0aW9uTWVzc2FnZVs1XT1cIkludmFsaWQgY2hhcmFjdGVyXCIpLDUpO1xudmFyIE5PX0RBVEFfQUxMT1dFRF9FUlIgICAgICAgICA9IEV4Y2VwdGlvbkNvZGUuTk9fREFUQV9BTExPV0VEX0VSUiAgICAgICAgID0gKChFeGNlcHRpb25NZXNzYWdlWzZdPVwiTm8gZGF0YSBhbGxvd2VkXCIpLDYpO1xudmFyIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiA9IEV4Y2VwdGlvbkNvZGUuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSID0gKChFeGNlcHRpb25NZXNzYWdlWzddPVwiTm8gbW9kaWZpY2F0aW9uIGFsbG93ZWRcIiksNyk7XG52YXIgTk9UX0ZPVU5EX0VSUiAgICAgICAgICAgICAgID0gRXhjZXB0aW9uQ29kZS5OT1RfRk9VTkRfRVJSICAgICAgICAgICAgICAgPSAoKEV4Y2VwdGlvbk1lc3NhZ2VbOF09XCJOb3QgZm91bmRcIiksOCk7XG52YXIgTk9UX1NVUFBPUlRFRF9FUlIgICAgICAgICAgID0gRXhjZXB0aW9uQ29kZS5OT1RfU1VQUE9SVEVEX0VSUiAgICAgICAgICAgPSAoKEV4Y2VwdGlvbk1lc3NhZ2VbOV09XCJOb3Qgc3VwcG9ydGVkXCIpLDkpO1xudmFyIElOVVNFX0FUVFJJQlVURV9FUlIgICAgICAgICA9IEV4Y2VwdGlvbkNvZGUuSU5VU0VfQVRUUklCVVRFX0VSUiAgICAgICAgID0gKChFeGNlcHRpb25NZXNzYWdlWzEwXT1cIkF0dHJpYnV0ZSBpbiB1c2VcIiksMTApO1xuLy9sZXZlbDJcbnZhciBJTlZBTElEX1NUQVRFX0VSUiAgICAgICAgXHQ9IEV4Y2VwdGlvbkNvZGUuSU5WQUxJRF9TVEFURV9FUlIgICAgICAgIFx0PSAoKEV4Y2VwdGlvbk1lc3NhZ2VbMTFdPVwiSW52YWxpZCBzdGF0ZVwiKSwxMSk7XG52YXIgU1lOVEFYX0VSUiAgICAgICAgICAgICAgIFx0PSBFeGNlcHRpb25Db2RlLlNZTlRBWF9FUlIgICAgICAgICAgICAgICBcdD0gKChFeGNlcHRpb25NZXNzYWdlWzEyXT1cIlN5bnRheCBlcnJvclwiKSwxMik7XG52YXIgSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSIFx0PSBFeGNlcHRpb25Db2RlLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiBcdD0gKChFeGNlcHRpb25NZXNzYWdlWzEzXT1cIkludmFsaWQgbW9kaWZpY2F0aW9uXCIpLDEzKTtcbnZhciBOQU1FU1BBQ0VfRVJSICAgICAgICAgICAgXHQ9IEV4Y2VwdGlvbkNvZGUuTkFNRVNQQUNFX0VSUiAgICAgICAgICAgXHQ9ICgoRXhjZXB0aW9uTWVzc2FnZVsxNF09XCJJbnZhbGlkIG5hbWVzcGFjZVwiKSwxNCk7XG52YXIgSU5WQUxJRF9BQ0NFU1NfRVJSICAgICAgIFx0PSBFeGNlcHRpb25Db2RlLklOVkFMSURfQUNDRVNTX0VSUiAgICAgIFx0PSAoKEV4Y2VwdGlvbk1lc3NhZ2VbMTVdPVwiSW52YWxpZCBhY2Nlc3NcIiksMTUpO1xuXG4vKipcbiAqIERPTSBMZXZlbCAyXG4gKiBPYmplY3QgRE9NRXhjZXB0aW9uXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLUNvcmUtMjAwMDExMTMvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1ET00tTGV2ZWwtMS9lY21hLXNjcmlwdC1sYW5ndWFnZS1iaW5kaW5nLmh0bWxcbiAqL1xuZnVuY3Rpb24gRE9NRXhjZXB0aW9uKGNvZGUsIG1lc3NhZ2UpIHtcblx0aWYobWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yKXtcblx0XHR2YXIgZXJyb3IgPSBtZXNzYWdlO1xuXHR9ZWxzZXtcblx0XHRlcnJvciA9IHRoaXM7XG5cdFx0RXJyb3IuY2FsbCh0aGlzLCBFeGNlcHRpb25NZXNzYWdlW2NvZGVdKTtcblx0XHR0aGlzLm1lc3NhZ2UgPSBFeGNlcHRpb25NZXNzYWdlW2NvZGVdO1xuXHRcdGlmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBET01FeGNlcHRpb24pO1xuXHR9XG5cdGVycm9yLmNvZGUgPSBjb2RlO1xuXHRpZihtZXNzYWdlKSB0aGlzLm1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2UgKyBcIjogXCIgKyBtZXNzYWdlO1xuXHRyZXR1cm4gZXJyb3I7XG59O1xuRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZTtcbmNvcHkoRXhjZXB0aW9uQ29kZSxET01FeGNlcHRpb24pXG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1Db3JlLTIwMDAxMTEzL2NvcmUuaHRtbCNJRC01MzYyOTcxNzdcbiAqIFRoZSBOb2RlTGlzdCBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIGFic3RyYWN0aW9uIG9mIGFuIG9yZGVyZWQgY29sbGVjdGlvbiBvZiBub2Rlcywgd2l0aG91dCBkZWZpbmluZyBvciBjb25zdHJhaW5pbmcgaG93IHRoaXMgY29sbGVjdGlvbiBpcyBpbXBsZW1lbnRlZC4gTm9kZUxpc3Qgb2JqZWN0cyBpbiB0aGUgRE9NIGFyZSBsaXZlLlxuICogVGhlIGl0ZW1zIGluIHRoZSBOb2RlTGlzdCBhcmUgYWNjZXNzaWJsZSB2aWEgYW4gaW50ZWdyYWwgaW5kZXgsIHN0YXJ0aW5nIGZyb20gMC5cbiAqL1xuZnVuY3Rpb24gTm9kZUxpc3QoKSB7XG59O1xuTm9kZUxpc3QucHJvdG90eXBlID0ge1xuXHQvKipcblx0ICogVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgbGlzdC4gVGhlIHJhbmdlIG9mIHZhbGlkIGNoaWxkIG5vZGUgaW5kaWNlcyBpcyAwIHRvIGxlbmd0aC0xIGluY2x1c2l2ZS5cblx0ICogQHN0YW5kYXJkIGxldmVsMVxuXHQgKi9cblx0bGVuZ3RoOjAsIFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgaW5kZXh0aCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uLiBJZiBpbmRleCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgbGlzdCwgdGhpcyByZXR1cm5zIG51bGwuXG5cdCAqIEBzdGFuZGFyZCBsZXZlbDFcblx0ICogQHBhcmFtIGluZGV4ICB1bnNpZ25lZCBsb25nIFxuXHQgKiAgIEluZGV4IGludG8gdGhlIGNvbGxlY3Rpb24uXG5cdCAqIEByZXR1cm4gTm9kZVxuXHQgKiBcdFRoZSBub2RlIGF0IHRoZSBpbmRleHRoIHBvc2l0aW9uIGluIHRoZSBOb2RlTGlzdCwgb3IgbnVsbCBpZiB0aGF0IGlzIG5vdCBhIHZhbGlkIGluZGV4LiBcblx0ICovXG5cdGl0ZW06IGZ1bmN0aW9uKGluZGV4KSB7XG5cdFx0cmV0dXJuIHRoaXNbaW5kZXhdIHx8IG51bGw7XG5cdH0sXG5cdHRvU3RyaW5nOmZ1bmN0aW9uKGlzSFRNTCxub2RlRmlsdGVyKXtcblx0XHRmb3IodmFyIGJ1ZiA9IFtdLCBpID0gMDtpPHRoaXMubGVuZ3RoO2krKyl7XG5cdFx0XHRzZXJpYWxpemVUb1N0cmluZyh0aGlzW2ldLGJ1Zixpc0hUTUwsbm9kZUZpbHRlcik7XG5cdFx0fVxuXHRcdHJldHVybiBidWYuam9pbignJyk7XG5cdH1cbn07XG5cbmZ1bmN0aW9uIExpdmVOb2RlTGlzdChub2RlLHJlZnJlc2gpe1xuXHR0aGlzLl9ub2RlID0gbm9kZTtcblx0dGhpcy5fcmVmcmVzaCA9IHJlZnJlc2hcblx0X3VwZGF0ZUxpdmVMaXN0KHRoaXMpO1xufVxuZnVuY3Rpb24gX3VwZGF0ZUxpdmVMaXN0KGxpc3Qpe1xuXHR2YXIgaW5jID0gbGlzdC5fbm9kZS5faW5jIHx8IGxpc3QuX25vZGUub3duZXJEb2N1bWVudC5faW5jO1xuXHRpZihsaXN0Ll9pbmMgIT0gaW5jKXtcblx0XHR2YXIgbHMgPSBsaXN0Ll9yZWZyZXNoKGxpc3QuX25vZGUpO1xuXHRcdC8vY29uc29sZS5sb2cobHMubGVuZ3RoKVxuXHRcdF9fc2V0X18obGlzdCwnbGVuZ3RoJyxscy5sZW5ndGgpO1xuXHRcdGNvcHkobHMsbGlzdCk7XG5cdFx0bGlzdC5faW5jID0gaW5jO1xuXHR9XG59XG5MaXZlTm9kZUxpc3QucHJvdG90eXBlLml0ZW0gPSBmdW5jdGlvbihpKXtcblx0X3VwZGF0ZUxpdmVMaXN0KHRoaXMpO1xuXHRyZXR1cm4gdGhpc1tpXTtcbn1cblxuX2V4dGVuZHMoTGl2ZU5vZGVMaXN0LE5vZGVMaXN0KTtcblxuLyoqXG4gKiBPYmplY3RzIGltcGxlbWVudGluZyB0aGUgTmFtZWROb2RlTWFwIGludGVyZmFjZSBhcmUgdXNlZFxuICogdG8gcmVwcmVzZW50IGNvbGxlY3Rpb25zIG9mIG5vZGVzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGJ5IG5hbWUuXG4gKiBOb3RlIHRoYXQgTmFtZWROb2RlTWFwIGRvZXMgbm90IGluaGVyaXQgZnJvbSBOb2RlTGlzdDtcbiAqIE5hbWVkTm9kZU1hcHMgYXJlIG5vdCBtYWludGFpbmVkIGluIGFueSBwYXJ0aWN1bGFyIG9yZGVyLlxuICogT2JqZWN0cyBjb250YWluZWQgaW4gYW4gb2JqZWN0IGltcGxlbWVudGluZyBOYW1lZE5vZGVNYXAgbWF5IGFsc28gYmUgYWNjZXNzZWQgYnkgYW4gb3JkaW5hbCBpbmRleCxcbiAqIGJ1dCB0aGlzIGlzIHNpbXBseSB0byBhbGxvdyBjb252ZW5pZW50IGVudW1lcmF0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhIE5hbWVkTm9kZU1hcCxcbiAqIGFuZCBkb2VzIG5vdCBpbXBseSB0aGF0IHRoZSBET00gc3BlY2lmaWVzIGFuIG9yZGVyIHRvIHRoZXNlIE5vZGVzLlxuICogTmFtZWROb2RlTWFwIG9iamVjdHMgaW4gdGhlIERPTSBhcmUgbGl2ZS5cbiAqIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb3IgRG9jdW1lbnRUeXBlIGVudGl0aWVzIFxuICovXG5mdW5jdGlvbiBOYW1lZE5vZGVNYXAoKSB7XG59O1xuXG5mdW5jdGlvbiBfZmluZE5vZGVJbmRleChsaXN0LG5vZGUpe1xuXHR2YXIgaSA9IGxpc3QubGVuZ3RoO1xuXHR3aGlsZShpLS0pe1xuXHRcdGlmKGxpc3RbaV0gPT09IG5vZGUpe3JldHVybiBpfVxuXHR9XG59XG5cbmZ1bmN0aW9uIF9hZGROYW1lZE5vZGUoZWwsbGlzdCxuZXdBdHRyLG9sZEF0dHIpe1xuXHRpZihvbGRBdHRyKXtcblx0XHRsaXN0W19maW5kTm9kZUluZGV4KGxpc3Qsb2xkQXR0cildID0gbmV3QXR0cjtcblx0fWVsc2V7XG5cdFx0bGlzdFtsaXN0Lmxlbmd0aCsrXSA9IG5ld0F0dHI7XG5cdH1cblx0aWYoZWwpe1xuXHRcdG5ld0F0dHIub3duZXJFbGVtZW50ID0gZWw7XG5cdFx0dmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7XG5cdFx0aWYoZG9jKXtcblx0XHRcdG9sZEF0dHIgJiYgX29uUmVtb3ZlQXR0cmlidXRlKGRvYyxlbCxvbGRBdHRyKTtcblx0XHRcdF9vbkFkZEF0dHJpYnV0ZShkb2MsZWwsbmV3QXR0cik7XG5cdFx0fVxuXHR9XG59XG5mdW5jdGlvbiBfcmVtb3ZlTmFtZWROb2RlKGVsLGxpc3QsYXR0cil7XG5cdC8vY29uc29sZS5sb2coJ3JlbW92ZSBhdHRyOicrYXR0cilcblx0dmFyIGkgPSBfZmluZE5vZGVJbmRleChsaXN0LGF0dHIpO1xuXHRpZihpPj0wKXtcblx0XHR2YXIgbGFzdEluZGV4ID0gbGlzdC5sZW5ndGgtMVxuXHRcdHdoaWxlKGk8bGFzdEluZGV4KXtcblx0XHRcdGxpc3RbaV0gPSBsaXN0WysraV1cblx0XHR9XG5cdFx0bGlzdC5sZW5ndGggPSBsYXN0SW5kZXg7XG5cdFx0aWYoZWwpe1xuXHRcdFx0dmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHRpZihkb2Mpe1xuXHRcdFx0XHRfb25SZW1vdmVBdHRyaWJ1dGUoZG9jLGVsLGF0dHIpO1xuXHRcdFx0XHRhdHRyLm93bmVyRWxlbWVudCA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9ZWxzZXtcblx0XHR0aHJvdyBET01FeGNlcHRpb24oTk9UX0ZPVU5EX0VSUixuZXcgRXJyb3IoZWwudGFnTmFtZSsnQCcrYXR0cikpXG5cdH1cbn1cbk5hbWVkTm9kZU1hcC5wcm90b3R5cGUgPSB7XG5cdGxlbmd0aDowLFxuXHRpdGVtOk5vZGVMaXN0LnByb3RvdHlwZS5pdGVtLFxuXHRnZXROYW1lZEl0ZW06IGZ1bmN0aW9uKGtleSkge1xuLy9cdFx0aWYoa2V5LmluZGV4T2YoJzonKT4wIHx8IGtleSA9PSAneG1sbnMnKXtcbi8vXHRcdFx0cmV0dXJuIG51bGw7XG4vL1x0XHR9XG5cdFx0Ly9jb25zb2xlLmxvZygpXG5cdFx0dmFyIGkgPSB0aGlzLmxlbmd0aDtcblx0XHR3aGlsZShpLS0pe1xuXHRcdFx0dmFyIGF0dHIgPSB0aGlzW2ldO1xuXHRcdFx0Ly9jb25zb2xlLmxvZyhhdHRyLm5vZGVOYW1lLGtleSlcblx0XHRcdGlmKGF0dHIubm9kZU5hbWUgPT0ga2V5KXtcblx0XHRcdFx0cmV0dXJuIGF0dHI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRzZXROYW1lZEl0ZW06IGZ1bmN0aW9uKGF0dHIpIHtcblx0XHR2YXIgZWwgPSBhdHRyLm93bmVyRWxlbWVudDtcblx0XHRpZihlbCAmJiBlbCE9dGhpcy5fb3duZXJFbGVtZW50KXtcblx0XHRcdHRocm93IG5ldyBET01FeGNlcHRpb24oSU5VU0VfQVRUUklCVVRFX0VSUik7XG5cdFx0fVxuXHRcdHZhciBvbGRBdHRyID0gdGhpcy5nZXROYW1lZEl0ZW0oYXR0ci5ub2RlTmFtZSk7XG5cdFx0X2FkZE5hbWVkTm9kZSh0aGlzLl9vd25lckVsZW1lbnQsdGhpcyxhdHRyLG9sZEF0dHIpO1xuXHRcdHJldHVybiBvbGRBdHRyO1xuXHR9LFxuXHQvKiByZXR1cm5zIE5vZGUgKi9cblx0c2V0TmFtZWRJdGVtTlM6IGZ1bmN0aW9uKGF0dHIpIHsvLyByYWlzZXM6IFdST05HX0RPQ1VNRU5UX0VSUixOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsSU5VU0VfQVRUUklCVVRFX0VSUlxuXHRcdHZhciBlbCA9IGF0dHIub3duZXJFbGVtZW50LCBvbGRBdHRyO1xuXHRcdGlmKGVsICYmIGVsIT10aGlzLl9vd25lckVsZW1lbnQpe1xuXHRcdFx0dGhyb3cgbmV3IERPTUV4Y2VwdGlvbihJTlVTRV9BVFRSSUJVVEVfRVJSKTtcblx0XHR9XG5cdFx0b2xkQXR0ciA9IHRoaXMuZ2V0TmFtZWRJdGVtTlMoYXR0ci5uYW1lc3BhY2VVUkksYXR0ci5sb2NhbE5hbWUpO1xuXHRcdF9hZGROYW1lZE5vZGUodGhpcy5fb3duZXJFbGVtZW50LHRoaXMsYXR0cixvbGRBdHRyKTtcblx0XHRyZXR1cm4gb2xkQXR0cjtcblx0fSxcblxuXHQvKiByZXR1cm5zIE5vZGUgKi9cblx0cmVtb3ZlTmFtZWRJdGVtOiBmdW5jdGlvbihrZXkpIHtcblx0XHR2YXIgYXR0ciA9IHRoaXMuZ2V0TmFtZWRJdGVtKGtleSk7XG5cdFx0X3JlbW92ZU5hbWVkTm9kZSh0aGlzLl9vd25lckVsZW1lbnQsdGhpcyxhdHRyKTtcblx0XHRyZXR1cm4gYXR0cjtcblx0XHRcblx0XHRcblx0fSwvLyByYWlzZXM6IE5PVF9GT1VORF9FUlIsTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSXG5cdFxuXHQvL2ZvciBsZXZlbDJcblx0cmVtb3ZlTmFtZWRJdGVtTlM6ZnVuY3Rpb24obmFtZXNwYWNlVVJJLGxvY2FsTmFtZSl7XG5cdFx0dmFyIGF0dHIgPSB0aGlzLmdldE5hbWVkSXRlbU5TKG5hbWVzcGFjZVVSSSxsb2NhbE5hbWUpO1xuXHRcdF9yZW1vdmVOYW1lZE5vZGUodGhpcy5fb3duZXJFbGVtZW50LHRoaXMsYXR0cik7XG5cdFx0cmV0dXJuIGF0dHI7XG5cdH0sXG5cdGdldE5hbWVkSXRlbU5TOiBmdW5jdGlvbihuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSkge1xuXHRcdHZhciBpID0gdGhpcy5sZW5ndGg7XG5cdFx0d2hpbGUoaS0tKXtcblx0XHRcdHZhciBub2RlID0gdGhpc1tpXTtcblx0XHRcdGlmKG5vZGUubG9jYWxOYW1lID09IGxvY2FsTmFtZSAmJiBub2RlLm5hbWVzcGFjZVVSSSA9PSBuYW1lc3BhY2VVUkkpe1xuXHRcdFx0XHRyZXR1cm4gbm9kZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cbn07XG5cbi8qKlxuICogVGhlIERPTUltcGxlbWVudGF0aW9uIGludGVyZmFjZSByZXByZXNlbnRzIGFuIG9iamVjdCBwcm92aWRpbmcgbWV0aG9kc1xuICogd2hpY2ggYXJlIG5vdCBkZXBlbmRlbnQgb24gYW55IHBhcnRpY3VsYXIgZG9jdW1lbnQuXG4gKiBTdWNoIGFuIG9iamVjdCBpcyByZXR1cm5lZCBieSB0aGUgYERvY3VtZW50LmltcGxlbWVudGF0aW9uYCBwcm9wZXJ0eS5cbiAqXG4gKiBfX1RoZSBpbmRpdmlkdWFsIG1ldGhvZHMgZGVzY3JpYmUgdGhlIGRpZmZlcmVuY2VzIGNvbXBhcmVkIHRvIHRoZSBzcGVjcy5fX1xuICpcbiAqIEBjb25zdHJ1Y3RvclxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RPTUltcGxlbWVudGF0aW9uIE1ETlxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvUkVDLURPTS1MZXZlbC0xL2xldmVsLW9uZS1jb3JlLmh0bWwjSUQtMTAyMTYxNDkwIERPTSBMZXZlbCAxIENvcmUgKEluaXRpYWwpXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUuaHRtbCNJRC0xMDIxNjE0OTAgRE9NIExldmVsIDIgQ29yZVxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtQ29yZS9jb3JlLmh0bWwjSUQtMTAyMTYxNDkwIERPTSBMZXZlbCAzIENvcmVcbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb21pbXBsZW1lbnRhdGlvbiBET00gTGl2aW5nIFN0YW5kYXJkXG4gKi9cbmZ1bmN0aW9uIERPTUltcGxlbWVudGF0aW9uKCkge1xufVxuXG5ET01JbXBsZW1lbnRhdGlvbi5wcm90b3R5cGUgPSB7XG5cdC8qKlxuXHQgKiBUaGUgRE9NSW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgpIG1ldGhvZCByZXR1cm5zIGEgQm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgYSBnaXZlbiBmZWF0dXJlIGlzIHN1cHBvcnRlZC5cblx0ICogVGhlIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgZmFpcmx5IGRpdmVyZ2VkIGluIHdoYXQga2luZCBvZiBmZWF0dXJlcyB3ZXJlIHJlcG9ydGVkLlxuXHQgKiBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNwZWMgc2V0dGxlZCB0byBmb3JjZSB0aGlzIG1ldGhvZCB0byBhbHdheXMgcmV0dXJuIHRydWUsIHdoZXJlIHRoZSBmdW5jdGlvbmFsaXR5IHdhcyBhY2N1cmF0ZSBhbmQgaW4gdXNlLlxuXHQgKlxuXHQgKiBAZGVwcmVjYXRlZCBJdCBpcyBkZXByZWNhdGVkIGFuZCBtb2Rlcm4gYnJvd3NlcnMgcmV0dXJuIHRydWUgaW4gYWxsIGNhc2VzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZmVhdHVyZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3ZlcnNpb25dXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBhbHdheXMgdHJ1ZVxuXHQgKlxuXHQgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9ET01JbXBsZW1lbnRhdGlvbi9oYXNGZWF0dXJlIE1ETlxuXHQgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9SRUMtRE9NLUxldmVsLTEvbGV2ZWwtb25lLWNvcmUuaHRtbCNJRC01Q0VEOTRENyBET00gTGV2ZWwgMSBDb3JlXG5cdCAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZG9taW1wbGVtZW50YXRpb24taGFzZmVhdHVyZSBET00gTGl2aW5nIFN0YW5kYXJkXG5cdCAqL1xuXHRoYXNGZWF0dXJlOiBmdW5jdGlvbihmZWF0dXJlLCB2ZXJzaW9uKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gWE1MIERvY3VtZW50IG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2l0aCBpdHMgZG9jdW1lbnQgZWxlbWVudC5cblx0ICpcblx0ICogX19JdCBiZWhhdmVzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgbGl2aW5nIHN0YW5kYXJkX186XG5cdCAqIC0gVGhlcmUgaXMgbm8gaW50ZXJmYWNlL2NsYXNzIGBYTUxEb2N1bWVudGAsIGl0IHJldHVybnMgYSBgRG9jdW1lbnRgIGluc3RhbmNlLlxuXHQgKiAtIGBjb250ZW50VHlwZWAsIGBlbmNvZGluZ2AsIGBtb2RlYCwgYG9yaWdpbmAsIGB1cmxgIGZpZWxkcyBhcmUgY3VycmVudGx5IG5vdCBkZWNsYXJlZC5cblx0ICogLSB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCB2YWxpZGF0aW5nIG5hbWVzIG9yIHF1YWxpZmllZCBuYW1lc1xuXHQgKiAgICh3aGVuIHBhcnNpbmcgWE1MIHN0cmluZ3MsIHRoZSBTQVggcGFyc2VyIHRha2VzIGNhcmUgb2YgdGhhdClcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbmFtZXNwYWNlVVJJXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG5cdCAqIEBwYXJhbSB7RG9jdW1lbnRUeXBlPW51bGx9IGRvY3R5cGVcblx0ICogQHJldHVybnMge0RvY3VtZW50fVxuXHQgKlxuXHQgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9ET01JbXBsZW1lbnRhdGlvbi9jcmVhdGVEb2N1bWVudCBNRE5cblx0ICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlLmh0bWwjTGV2ZWwtMi1Db3JlLURPTS1jcmVhdGVEb2N1bWVudCBET00gTGV2ZWwgMiBDb3JlIChpbml0aWFsKVxuXHQgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWRvbWltcGxlbWVudGF0aW9uLWNyZWF0ZWRvY3VtZW50ICBET00gTGV2ZWwgMiBDb3JlXG5cdCAqXG5cdCAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyN2YWxpZGF0ZS1hbmQtZXh0cmFjdCBET006IFZhbGlkYXRlIGFuZCBleHRyYWN0XG5cdCAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3htbC8jTlQtTmFtZVN0YXJ0Q2hhciBYTUwgU3BlYzogTmFtZXNcblx0ICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIveG1sLW5hbWVzLyNucy1xdWFsbmFtZXMgWE1MIE5hbWVzcGFjZXM6IFF1YWxpZmllZCBuYW1lc1xuXHQgKi9cblx0Y3JlYXRlRG9jdW1lbnQ6IGZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgIHF1YWxpZmllZE5hbWUsIGRvY3R5cGUpe1xuXHRcdHZhciBkb2MgPSBuZXcgRG9jdW1lbnQoKTtcblx0XHRkb2MuaW1wbGVtZW50YXRpb24gPSB0aGlzO1xuXHRcdGRvYy5jaGlsZE5vZGVzID0gbmV3IE5vZGVMaXN0KCk7XG5cdFx0ZG9jLmRvY3R5cGUgPSBkb2N0eXBlIHx8IG51bGw7XG5cdFx0aWYgKGRvY3R5cGUpe1xuXHRcdFx0ZG9jLmFwcGVuZENoaWxkKGRvY3R5cGUpO1xuXHRcdH1cblx0XHRpZiAocXVhbGlmaWVkTmFtZSl7XG5cdFx0XHR2YXIgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKTtcblx0XHRcdGRvYy5hcHBlbmRDaGlsZChyb290KTtcblx0XHR9XG5cdFx0cmV0dXJuIGRvYztcblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgYSBkb2N0eXBlLCB3aXRoIHRoZSBnaXZlbiBgcXVhbGlmaWVkTmFtZWAsIGBwdWJsaWNJZGAsIGFuZCBgc3lzdGVtSWRgLlxuXHQgKlxuXHQgKiBfX1RoaXMgYmVoYXZpb3IgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gdGhlIGluIHRoZSBzcGVjc19fOlxuXHQgKiAtIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHZhbGlkYXRpbmcgbmFtZXMgb3IgcXVhbGlmaWVkIG5hbWVzXG5cdCAqICAgKHdoZW4gcGFyc2luZyBYTUwgc3RyaW5ncywgdGhlIFNBWCBwYXJzZXIgdGFrZXMgY2FyZSBvZiB0aGF0KVxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3B1YmxpY0lkXVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3N5c3RlbUlkXVxuXHQgKiBAcmV0dXJucyB7RG9jdW1lbnRUeXBlfSB3aGljaCBjYW4gZWl0aGVyIGJlIHVzZWQgd2l0aCBgRE9NSW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnRgIHVwb24gZG9jdW1lbnQgY3JlYXRpb25cblx0ICogXHRcdFx0XHQgIG9yIGNhbiBiZSBwdXQgaW50byB0aGUgZG9jdW1lbnQgdmlhIG1ldGhvZHMgbGlrZSBgTm9kZS5pbnNlcnRCZWZvcmUoKWAgb3IgYE5vZGUucmVwbGFjZUNoaWxkKClgXG5cdCAqXG5cdCAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RPTUltcGxlbWVudGF0aW9uL2NyZWF0ZURvY3VtZW50VHlwZSBNRE5cblx0ICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlLmh0bWwjTGV2ZWwtMi1Db3JlLURPTS1jcmVhdGVEb2NUeXBlIERPTSBMZXZlbCAyIENvcmVcblx0ICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1kb21pbXBsZW1lbnRhdGlvbi1jcmVhdGVkb2N1bWVudHR5cGUgRE9NIExpdmluZyBTdGFuZGFyZFxuXHQgKlxuXHQgKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jdmFsaWRhdGUtYW5kLWV4dHJhY3QgRE9NOiBWYWxpZGF0ZSBhbmQgZXh0cmFjdFxuXHQgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi94bWwvI05ULU5hbWVTdGFydENoYXIgWE1MIFNwZWM6IE5hbWVzXG5cdCAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3htbC1uYW1lcy8jbnMtcXVhbG5hbWVzIFhNTCBOYW1lc3BhY2VzOiBRdWFsaWZpZWQgbmFtZXNcblx0ICovXG5cdGNyZWF0ZURvY3VtZW50VHlwZTogZnVuY3Rpb24ocXVhbGlmaWVkTmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKXtcblx0XHR2YXIgbm9kZSA9IG5ldyBEb2N1bWVudFR5cGUoKTtcblx0XHRub2RlLm5hbWUgPSBxdWFsaWZpZWROYW1lO1xuXHRcdG5vZGUubm9kZU5hbWUgPSBxdWFsaWZpZWROYW1lO1xuXHRcdG5vZGUucHVibGljSWQgPSBwdWJsaWNJZCB8fCAnJztcblx0XHRub2RlLnN5c3RlbUlkID0gc3lzdGVtSWQgfHwgJyc7XG5cblx0XHRyZXR1cm4gbm9kZTtcblx0fVxufTtcblxuXG4vKipcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItQ29yZS0yMDAwMTExMy9jb3JlLmh0bWwjSUQtMTk1MDY0MTI0N1xuICovXG5cbmZ1bmN0aW9uIE5vZGUoKSB7XG59O1xuXG5Ob2RlLnByb3RvdHlwZSA9IHtcblx0Zmlyc3RDaGlsZCA6IG51bGwsXG5cdGxhc3RDaGlsZCA6IG51bGwsXG5cdHByZXZpb3VzU2libGluZyA6IG51bGwsXG5cdG5leHRTaWJsaW5nIDogbnVsbCxcblx0YXR0cmlidXRlcyA6IG51bGwsXG5cdHBhcmVudE5vZGUgOiBudWxsLFxuXHRjaGlsZE5vZGVzIDogbnVsbCxcblx0b3duZXJEb2N1bWVudCA6IG51bGwsXG5cdG5vZGVWYWx1ZSA6IG51bGwsXG5cdG5hbWVzcGFjZVVSSSA6IG51bGwsXG5cdHByZWZpeCA6IG51bGwsXG5cdGxvY2FsTmFtZSA6IG51bGwsXG5cdC8vIE1vZGlmaWVkIGluIERPTSBMZXZlbCAyOlxuXHRpbnNlcnRCZWZvcmU6ZnVuY3Rpb24obmV3Q2hpbGQsIHJlZkNoaWxkKXsvL3JhaXNlcyBcblx0XHRyZXR1cm4gX2luc2VydEJlZm9yZSh0aGlzLG5ld0NoaWxkLHJlZkNoaWxkKTtcblx0fSxcblx0cmVwbGFjZUNoaWxkOmZ1bmN0aW9uKG5ld0NoaWxkLCBvbGRDaGlsZCl7Ly9yYWlzZXMgXG5cdFx0dGhpcy5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsb2xkQ2hpbGQpO1xuXHRcdGlmKG9sZENoaWxkKXtcblx0XHRcdHRoaXMucmVtb3ZlQ2hpbGQob2xkQ2hpbGQpO1xuXHRcdH1cblx0fSxcblx0cmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24ob2xkQ2hpbGQpe1xuXHRcdHJldHVybiBfcmVtb3ZlQ2hpbGQodGhpcyxvbGRDaGlsZCk7XG5cdH0sXG5cdGFwcGVuZENoaWxkOmZ1bmN0aW9uKG5ld0NoaWxkKXtcblx0XHRyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsbnVsbCk7XG5cdH0sXG5cdGhhc0NoaWxkTm9kZXM6ZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5maXJzdENoaWxkICE9IG51bGw7XG5cdH0sXG5cdGNsb25lTm9kZTpmdW5jdGlvbihkZWVwKXtcblx0XHRyZXR1cm4gY2xvbmVOb2RlKHRoaXMub3duZXJEb2N1bWVudHx8dGhpcyx0aGlzLGRlZXApO1xuXHR9LFxuXHQvLyBNb2RpZmllZCBpbiBET00gTGV2ZWwgMjpcblx0bm9ybWFsaXplOmZ1bmN0aW9uKCl7XG5cdFx0dmFyIGNoaWxkID0gdGhpcy5maXJzdENoaWxkO1xuXHRcdHdoaWxlKGNoaWxkKXtcblx0XHRcdHZhciBuZXh0ID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0XHRpZihuZXh0ICYmIG5leHQubm9kZVR5cGUgPT0gVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlID09IFRFWFRfTk9ERSl7XG5cdFx0XHRcdHRoaXMucmVtb3ZlQ2hpbGQobmV4dCk7XG5cdFx0XHRcdGNoaWxkLmFwcGVuZERhdGEobmV4dC5kYXRhKTtcblx0XHRcdH1lbHNle1xuXHRcdFx0XHRjaGlsZC5ub3JtYWxpemUoKTtcblx0XHRcdFx0Y2hpbGQgPSBuZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcbiAgXHQvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuXHRpc1N1cHBvcnRlZDpmdW5jdGlvbihmZWF0dXJlLCB2ZXJzaW9uKXtcblx0XHRyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoZmVhdHVyZSx2ZXJzaW9uKTtcblx0fSxcbiAgICAvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuICAgIGhhc0F0dHJpYnV0ZXM6ZnVuY3Rpb24oKXtcbiAgICBcdHJldHVybiB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoPjA7XG4gICAgfSxcblx0LyoqXG5cdCAqIExvb2sgdXAgdGhlIHByZWZpeCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBuYW1lc3BhY2UgVVJJLCBzdGFydGluZyBmcm9tIHRoaXMgbm9kZS5cblx0ICogKipUaGUgZGVmYXVsdCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGFyZSBpZ25vcmVkIGJ5IHRoaXMgbWV0aG9kLioqXG5cdCAqIFNlZSBOYW1lc3BhY2UgUHJlZml4IExvb2t1cCBmb3IgZGV0YWlscyBvbiB0aGUgYWxnb3JpdGhtIHVzZWQgYnkgdGhpcyBtZXRob2QuXG5cdCAqXG5cdCAqIF9Ob3RlOiBUaGUgaW1wbGVtZW50YXRpb24gc2VlbXMgdG8gYmUgaW5jb21wbGV0ZSB3aGVuIGNvbXBhcmVkIHRvIHRoZSBhbGdvcml0aG0gZGVzY3JpYmVkIGluIHRoZSBzcGVjcy5fXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gbmFtZXNwYWNlVVJJXG5cdCAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuXHQgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1Db3JlL2NvcmUuaHRtbCNOb2RlMy1sb29rdXBOYW1lc3BhY2VQcmVmaXhcblx0ICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtQ29yZS9uYW1lc3BhY2VzLWFsZ29yaXRobXMuaHRtbCNsb29rdXBOYW1lc3BhY2VQcmVmaXhBbGdvXG5cdCAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tbm9kZS1sb29rdXBwcmVmaXhcblx0ICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20veG1sZG9tL3htbGRvbS9pc3N1ZXMvMzIyXG5cdCAqL1xuICAgIGxvb2t1cFByZWZpeDpmdW5jdGlvbihuYW1lc3BhY2VVUkkpe1xuICAgIFx0dmFyIGVsID0gdGhpcztcbiAgICBcdHdoaWxlKGVsKXtcbiAgICBcdFx0dmFyIG1hcCA9IGVsLl9uc01hcDtcbiAgICBcdFx0Ly9jb25zb2xlLmRpcihtYXApXG4gICAgXHRcdGlmKG1hcCl7XG4gICAgXHRcdFx0Zm9yKHZhciBuIGluIG1hcCl7XG4gICAgXHRcdFx0XHRpZihtYXBbbl0gPT0gbmFtZXNwYWNlVVJJKXtcbiAgICBcdFx0XHRcdFx0cmV0dXJuIG47XG4gICAgXHRcdFx0XHR9XG4gICAgXHRcdFx0fVxuICAgIFx0XHR9XG4gICAgXHRcdGVsID0gZWwubm9kZVR5cGUgPT0gQVRUUklCVVRFX05PREU/ZWwub3duZXJEb2N1bWVudCA6IGVsLnBhcmVudE5vZGU7XG4gICAgXHR9XG4gICAgXHRyZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIC8vIEludHJvZHVjZWQgaW4gRE9NIExldmVsIDM6XG4gICAgbG9va3VwTmFtZXNwYWNlVVJJOmZ1bmN0aW9uKHByZWZpeCl7XG4gICAgXHR2YXIgZWwgPSB0aGlzO1xuICAgIFx0d2hpbGUoZWwpe1xuICAgIFx0XHR2YXIgbWFwID0gZWwuX25zTWFwO1xuICAgIFx0XHQvL2NvbnNvbGUuZGlyKG1hcClcbiAgICBcdFx0aWYobWFwKXtcbiAgICBcdFx0XHRpZihwcmVmaXggaW4gbWFwKXtcbiAgICBcdFx0XHRcdHJldHVybiBtYXBbcHJlZml4XSA7XG4gICAgXHRcdFx0fVxuICAgIFx0XHR9XG4gICAgXHRcdGVsID0gZWwubm9kZVR5cGUgPT0gQVRUUklCVVRFX05PREU/ZWwub3duZXJEb2N1bWVudCA6IGVsLnBhcmVudE5vZGU7XG4gICAgXHR9XG4gICAgXHRyZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIC8vIEludHJvZHVjZWQgaW4gRE9NIExldmVsIDM6XG4gICAgaXNEZWZhdWx0TmFtZXNwYWNlOmZ1bmN0aW9uKG5hbWVzcGFjZVVSSSl7XG4gICAgXHR2YXIgcHJlZml4ID0gdGhpcy5sb29rdXBQcmVmaXgobmFtZXNwYWNlVVJJKTtcbiAgICBcdHJldHVybiBwcmVmaXggPT0gbnVsbDtcbiAgICB9XG59O1xuXG5cbmZ1bmN0aW9uIF94bWxFbmNvZGVyKGMpe1xuXHRyZXR1cm4gYyA9PSAnPCcgJiYgJyZsdDsnIHx8XG4gICAgICAgICBjID09ICc+JyAmJiAnJmd0OycgfHxcbiAgICAgICAgIGMgPT0gJyYnICYmICcmYW1wOycgfHxcbiAgICAgICAgIGMgPT0gJ1wiJyAmJiAnJnF1b3Q7JyB8fFxuICAgICAgICAgJyYjJytjLmNoYXJDb2RlQXQoKSsnOydcbn1cblxuXG5jb3B5KE5vZGVUeXBlLE5vZGUpO1xuY29weShOb2RlVHlwZSxOb2RlLnByb3RvdHlwZSk7XG5cbi8qKlxuICogQHBhcmFtIGNhbGxiYWNrIHJldHVybiB0cnVlIGZvciBjb250aW51ZSxmYWxzZSBmb3IgYnJlYWtcbiAqIEByZXR1cm4gYm9vbGVhbiB0cnVlOiBicmVhayB2aXNpdDtcbiAqL1xuZnVuY3Rpb24gX3Zpc2l0Tm9kZShub2RlLGNhbGxiYWNrKXtcblx0aWYoY2FsbGJhY2sobm9kZSkpe1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdGlmKG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQpe1xuXHRcdGRve1xuXHRcdFx0aWYoX3Zpc2l0Tm9kZShub2RlLGNhbGxiYWNrKSl7cmV0dXJuIHRydWV9XG4gICAgICAgIH13aGlsZShub2RlPW5vZGUubmV4dFNpYmxpbmcpXG4gICAgfVxufVxuXG5cblxuZnVuY3Rpb24gRG9jdW1lbnQoKXtcbn1cblxuZnVuY3Rpb24gX29uQWRkQXR0cmlidXRlKGRvYyxlbCxuZXdBdHRyKXtcblx0ZG9jICYmIGRvYy5faW5jKys7XG5cdHZhciBucyA9IG5ld0F0dHIubmFtZXNwYWNlVVJJIDtcblx0aWYobnMgPT09IE5BTUVTUEFDRS5YTUxOUyl7XG5cdFx0Ly91cGRhdGUgbmFtZXNwYWNlXG5cdFx0ZWwuX25zTWFwW25ld0F0dHIucHJlZml4P25ld0F0dHIubG9jYWxOYW1lOicnXSA9IG5ld0F0dHIudmFsdWVcblx0fVxufVxuXG5mdW5jdGlvbiBfb25SZW1vdmVBdHRyaWJ1dGUoZG9jLGVsLG5ld0F0dHIscmVtb3ZlKXtcblx0ZG9jICYmIGRvYy5faW5jKys7XG5cdHZhciBucyA9IG5ld0F0dHIubmFtZXNwYWNlVVJJIDtcblx0aWYobnMgPT09IE5BTUVTUEFDRS5YTUxOUyl7XG5cdFx0Ly91cGRhdGUgbmFtZXNwYWNlXG5cdFx0ZGVsZXRlIGVsLl9uc01hcFtuZXdBdHRyLnByZWZpeD9uZXdBdHRyLmxvY2FsTmFtZTonJ11cblx0fVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgYGVsLmNoaWxkTm9kZXNgLCB1cGRhdGluZyB0aGUgaW5kZXhlZCBpdGVtcyBhbmQgaXQncyBgbGVuZ3RoYC5cbiAqIFBhc3NpbmcgYG5ld0NoaWxkYCBtZWFucyBpdCB3aWxsIGJlIGFwcGVuZGVkLlxuICogT3RoZXJ3aXNlIGl0J3MgYXNzdW1lZCB0aGF0IGFuIGl0ZW0gaGFzIGJlZW4gcmVtb3ZlZCxcbiAqIGFuZCBgZWwuZmlyc3ROb2RlYCBhbmQgaXQncyBgLm5leHRTaWJsaW5nYCBhcmUgdXNlZFxuICogdG8gd2FsayB0aGUgY3VycmVudCBsaXN0IG9mIGNoaWxkIG5vZGVzLlxuICpcbiAqIEBwYXJhbSB7RG9jdW1lbnR9IGRvY1xuICogQHBhcmFtIHtOb2RlfSBlbFxuICogQHBhcmFtIHtOb2RlfSBbbmV3Q2hpbGRdXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfb25VcGRhdGVDaGlsZCAoZG9jLCBlbCwgbmV3Q2hpbGQpIHtcblx0aWYoZG9jICYmIGRvYy5faW5jKXtcblx0XHRkb2MuX2luYysrO1xuXHRcdC8vdXBkYXRlIGNoaWxkTm9kZXNcblx0XHR2YXIgY3MgPSBlbC5jaGlsZE5vZGVzO1xuXHRcdGlmIChuZXdDaGlsZCkge1xuXHRcdFx0Y3NbY3MubGVuZ3RoKytdID0gbmV3Q2hpbGQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBjaGlsZCA9IGVsLmZpcnN0Q2hpbGQ7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHR3aGlsZSAoY2hpbGQpIHtcblx0XHRcdFx0Y3NbaSsrXSA9IGNoaWxkO1xuXHRcdFx0XHRjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nO1xuXHRcdFx0fVxuXHRcdFx0Y3MubGVuZ3RoID0gaTtcblx0XHRcdGRlbGV0ZSBjc1tjcy5sZW5ndGhdO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gYHBhcmVudE5vZGVgIGFuZCBgY2hpbGRgXG4gKiBhbmQgYW55IGV4aXN0aW5nIGBjaGlsZC5wcmV2aW91c1NpYmxpbmdgIG9yIGBjaGlsZC5uZXh0U2libGluZ2AuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20veG1sZG9tL3htbGRvbS9pc3N1ZXMvMTM1XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS94bWxkb20veG1sZG9tL2lzc3Vlcy8xNDVcbiAqXG4gKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAqIEByZXR1cm5zIHtOb2RlfSB0aGUgY2hpbGQgdGhhdCB3YXMgcmVtb3ZlZC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9yZW1vdmVDaGlsZCAocGFyZW50Tm9kZSwgY2hpbGQpIHtcblx0dmFyIHByZXZpb3VzID0gY2hpbGQucHJldmlvdXNTaWJsaW5nO1xuXHR2YXIgbmV4dCA9IGNoaWxkLm5leHRTaWJsaW5nO1xuXHRpZiAocHJldmlvdXMpIHtcblx0XHRwcmV2aW91cy5uZXh0U2libGluZyA9IG5leHQ7XG5cdH0gZWxzZSB7XG5cdFx0cGFyZW50Tm9kZS5maXJzdENoaWxkID0gbmV4dDtcblx0fVxuXHRpZiAobmV4dCkge1xuXHRcdG5leHQucHJldmlvdXNTaWJsaW5nID0gcHJldmlvdXM7XG5cdH0gZWxzZSB7XG5cdFx0cGFyZW50Tm9kZS5sYXN0Q2hpbGQgPSBwcmV2aW91cztcblx0fVxuXHRjaGlsZC5wYXJlbnROb2RlID0gbnVsbDtcblx0Y2hpbGQucHJldmlvdXNTaWJsaW5nID0gbnVsbDtcblx0Y2hpbGQubmV4dFNpYmxpbmcgPSBudWxsO1xuXHRfb25VcGRhdGVDaGlsZChwYXJlbnROb2RlLm93bmVyRG9jdW1lbnQsIHBhcmVudE5vZGUpO1xuXHRyZXR1cm4gY2hpbGQ7XG59XG4vKipcbiAqIHByZWZvcm1hbmNlIGtleShyZWZDaGlsZCA9PSBudWxsKVxuICovXG5mdW5jdGlvbiBfaW5zZXJ0QmVmb3JlKHBhcmVudE5vZGUsbmV3Q2hpbGQsbmV4dENoaWxkKXtcblx0dmFyIGNwID0gbmV3Q2hpbGQucGFyZW50Tm9kZTtcblx0aWYoY3Ape1xuXHRcdGNwLnJlbW92ZUNoaWxkKG5ld0NoaWxkKTsvL3JlbW92ZSBhbmQgdXBkYXRlXG5cdH1cblx0aWYobmV3Q2hpbGQubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe1xuXHRcdHZhciBuZXdGaXJzdCA9IG5ld0NoaWxkLmZpcnN0Q2hpbGQ7XG5cdFx0aWYgKG5ld0ZpcnN0ID09IG51bGwpIHtcblx0XHRcdHJldHVybiBuZXdDaGlsZDtcblx0XHR9XG5cdFx0dmFyIG5ld0xhc3QgPSBuZXdDaGlsZC5sYXN0Q2hpbGQ7XG5cdH1lbHNle1xuXHRcdG5ld0ZpcnN0ID0gbmV3TGFzdCA9IG5ld0NoaWxkO1xuXHR9XG5cdHZhciBwcmUgPSBuZXh0Q2hpbGQgPyBuZXh0Q2hpbGQucHJldmlvdXNTaWJsaW5nIDogcGFyZW50Tm9kZS5sYXN0Q2hpbGQ7XG5cblx0bmV3Rmlyc3QucHJldmlvdXNTaWJsaW5nID0gcHJlO1xuXHRuZXdMYXN0Lm5leHRTaWJsaW5nID0gbmV4dENoaWxkO1xuXHRcblx0XG5cdGlmKHByZSl7XG5cdFx0cHJlLm5leHRTaWJsaW5nID0gbmV3Rmlyc3Q7XG5cdH1lbHNle1xuXHRcdHBhcmVudE5vZGUuZmlyc3RDaGlsZCA9IG5ld0ZpcnN0O1xuXHR9XG5cdGlmKG5leHRDaGlsZCA9PSBudWxsKXtcblx0XHRwYXJlbnROb2RlLmxhc3RDaGlsZCA9IG5ld0xhc3Q7XG5cdH1lbHNle1xuXHRcdG5leHRDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSBuZXdMYXN0O1xuXHR9XG5cdGRve1xuXHRcdG5ld0ZpcnN0LnBhcmVudE5vZGUgPSBwYXJlbnROb2RlO1xuXHR9d2hpbGUobmV3Rmlyc3QgIT09IG5ld0xhc3QgJiYgKG5ld0ZpcnN0PSBuZXdGaXJzdC5uZXh0U2libGluZykpXG5cdF9vblVwZGF0ZUNoaWxkKHBhcmVudE5vZGUub3duZXJEb2N1bWVudHx8cGFyZW50Tm9kZSxwYXJlbnROb2RlKTtcblx0Ly9jb25zb2xlLmxvZyhwYXJlbnROb2RlLmxhc3RDaGlsZC5uZXh0U2libGluZyA9PSBudWxsKVxuXHRpZiAobmV3Q2hpbGQubm9kZVR5cGUgPT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkge1xuXHRcdG5ld0NoaWxkLmZpcnN0Q2hpbGQgPSBuZXdDaGlsZC5sYXN0Q2hpbGQgPSBudWxsO1xuXHR9XG5cdHJldHVybiBuZXdDaGlsZDtcbn1cblxuLyoqXG4gKiBBcHBlbmRzIGBuZXdDaGlsZGAgdG8gYHBhcmVudE5vZGVgLlxuICogSWYgYG5ld0NoaWxkYCBpcyBhbHJlYWR5IGNvbm5lY3RlZCB0byBhIGBwYXJlbnROb2RlYCBpdCBpcyBmaXJzdCByZW1vdmVkIGZyb20gaXQuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20veG1sZG9tL3htbGRvbS9pc3N1ZXMvMTM1XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS94bWxkb20veG1sZG9tL2lzc3Vlcy8xNDVcbiAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICogQHBhcmFtIHtOb2RlfSBuZXdDaGlsZFxuICogQHJldHVybnMge05vZGV9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfYXBwZW5kU2luZ2xlQ2hpbGQgKHBhcmVudE5vZGUsIG5ld0NoaWxkKSB7XG5cdGlmIChuZXdDaGlsZC5wYXJlbnROb2RlKSB7XG5cdFx0bmV3Q2hpbGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuZXdDaGlsZCk7XG5cdH1cblx0bmV3Q2hpbGQucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XG5cdG5ld0NoaWxkLnByZXZpb3VzU2libGluZyA9IHBhcmVudE5vZGUubGFzdENoaWxkO1xuXHRuZXdDaGlsZC5uZXh0U2libGluZyA9IG51bGw7XG5cdGlmIChuZXdDaGlsZC5wcmV2aW91c1NpYmxpbmcpIHtcblx0XHRuZXdDaGlsZC5wcmV2aW91c1NpYmxpbmcubmV4dFNpYmxpbmcgPSBuZXdDaGlsZDtcblx0fSBlbHNlIHtcblx0XHRwYXJlbnROb2RlLmZpcnN0Q2hpbGQgPSBuZXdDaGlsZDtcblx0fVxuXHRwYXJlbnROb2RlLmxhc3RDaGlsZCA9IG5ld0NoaWxkO1xuXHRfb25VcGRhdGVDaGlsZChwYXJlbnROb2RlLm93bmVyRG9jdW1lbnQsIHBhcmVudE5vZGUsIG5ld0NoaWxkKTtcblx0cmV0dXJuIG5ld0NoaWxkO1xufVxuXG5Eb2N1bWVudC5wcm90b3R5cGUgPSB7XG5cdC8vaW1wbGVtZW50YXRpb24gOiBudWxsLFxuXHRub2RlTmFtZSA6ICAnI2RvY3VtZW50Jyxcblx0bm9kZVR5cGUgOiAgRE9DVU1FTlRfTk9ERSxcblx0LyoqXG5cdCAqIFRoZSBEb2N1bWVudFR5cGUgbm9kZSBvZiB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEByZWFkb25seVxuXHQgKiBAdHlwZSBEb2N1bWVudFR5cGVcblx0ICovXG5cdGRvY3R5cGUgOiAgbnVsbCxcblx0ZG9jdW1lbnRFbGVtZW50IDogIG51bGwsXG5cdF9pbmMgOiAxLFxuXG5cdGluc2VydEJlZm9yZSA6ICBmdW5jdGlvbihuZXdDaGlsZCwgcmVmQ2hpbGQpey8vcmFpc2VzXG5cdFx0aWYobmV3Q2hpbGQubm9kZVR5cGUgPT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSl7XG5cdFx0XHR2YXIgY2hpbGQgPSBuZXdDaGlsZC5maXJzdENoaWxkO1xuXHRcdFx0d2hpbGUoY2hpbGQpe1xuXHRcdFx0XHR2YXIgbmV4dCA9IGNoaWxkLm5leHRTaWJsaW5nO1xuXHRcdFx0XHR0aGlzLmluc2VydEJlZm9yZShjaGlsZCxyZWZDaGlsZCk7XG5cdFx0XHRcdGNoaWxkID0gbmV4dDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBuZXdDaGlsZDtcblx0XHR9XG5cdFx0aWYodGhpcy5kb2N1bWVudEVsZW1lbnQgPT0gbnVsbCAmJiBuZXdDaGlsZC5ub2RlVHlwZSA9PSBFTEVNRU5UX05PREUpe1xuXHRcdFx0dGhpcy5kb2N1bWVudEVsZW1lbnQgPSBuZXdDaGlsZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gX2luc2VydEJlZm9yZSh0aGlzLG5ld0NoaWxkLHJlZkNoaWxkKSwobmV3Q2hpbGQub3duZXJEb2N1bWVudCA9IHRoaXMpLG5ld0NoaWxkO1xuXHR9LFxuXHRyZW1vdmVDaGlsZCA6ICBmdW5jdGlvbihvbGRDaGlsZCl7XG5cdFx0aWYodGhpcy5kb2N1bWVudEVsZW1lbnQgPT0gb2xkQ2hpbGQpe1xuXHRcdFx0dGhpcy5kb2N1bWVudEVsZW1lbnQgPSBudWxsO1xuXHRcdH1cblx0XHRyZXR1cm4gX3JlbW92ZUNoaWxkKHRoaXMsb2xkQ2hpbGQpO1xuXHR9LFxuXHQvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuXHRpbXBvcnROb2RlIDogZnVuY3Rpb24oaW1wb3J0ZWROb2RlLGRlZXApe1xuXHRcdHJldHVybiBpbXBvcnROb2RlKHRoaXMsaW1wb3J0ZWROb2RlLGRlZXApO1xuXHR9LFxuXHQvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuXHRnZXRFbGVtZW50QnlJZCA6XHRmdW5jdGlvbihpZCl7XG5cdFx0dmFyIHJ0diA9IG51bGw7XG5cdFx0X3Zpc2l0Tm9kZSh0aGlzLmRvY3VtZW50RWxlbWVudCxmdW5jdGlvbihub2RlKXtcblx0XHRcdGlmKG5vZGUubm9kZVR5cGUgPT0gRUxFTUVOVF9OT0RFKXtcblx0XHRcdFx0aWYobm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJykgPT0gaWQpe1xuXHRcdFx0XHRcdHJ0diA9IG5vZGU7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KVxuXHRcdHJldHVybiBydHY7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRoZSBgZ2V0RWxlbWVudHNCeUNsYXNzTmFtZWAgbWV0aG9kIG9mIGBEb2N1bWVudGAgaW50ZXJmYWNlIHJldHVybnMgYW4gYXJyYXktbGlrZSBvYmplY3Rcblx0ICogb2YgYWxsIGNoaWxkIGVsZW1lbnRzIHdoaWNoIGhhdmUgKiphbGwqKiBvZiB0aGUgZ2l2ZW4gY2xhc3MgbmFtZShzKS5cblx0ICpcblx0ICogUmV0dXJucyBhbiBlbXB0eSBsaXN0IGlmIGBjbGFzc2VOYW1lc2AgaXMgYW4gZW1wdHkgc3RyaW5nIG9yIG9ubHkgY29udGFpbnMgSFRNTCB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzLlxuXHQgKlxuXHQgKlxuXHQgKiBXYXJuaW5nOiBUaGlzIGlzIGEgbGl2ZSBMaXZlTm9kZUxpc3QuXG5cdCAqIENoYW5nZXMgaW4gdGhlIERPTSB3aWxsIHJlZmxlY3QgaW4gdGhlIGFycmF5IGFzIHRoZSBjaGFuZ2VzIG9jY3VyLlxuXHQgKiBJZiBhbiBlbGVtZW50IHNlbGVjdGVkIGJ5IHRoaXMgYXJyYXkgbm8gbG9uZ2VyIHF1YWxpZmllcyBmb3IgdGhlIHNlbGVjdG9yLFxuXHQgKiBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVtb3ZlZC4gQmUgYXdhcmUgb2YgdGhpcyBmb3IgaXRlcmF0aW9uIHB1cnBvc2VzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lcyBpcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNsYXNzIG5hbWUocykgdG8gbWF0Y2g7IG11bHRpcGxlIGNsYXNzIG5hbWVzIGFyZSBzZXBhcmF0ZWQgYnkgKEFTQ0lJLSl3aGl0ZXNwYWNlXG5cdCAqXG5cdCAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L2dldEVsZW1lbnRzQnlDbGFzc05hbWVcblx0ICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZ2V0ZWxlbWVudHNieWNsYXNzbmFtZVxuXHQgKi9cblx0Z2V0RWxlbWVudHNCeUNsYXNzTmFtZTogZnVuY3Rpb24oY2xhc3NOYW1lcykge1xuXHRcdHZhciBjbGFzc05hbWVzU2V0ID0gdG9PcmRlcmVkU2V0KGNsYXNzTmFtZXMpXG5cdFx0cmV0dXJuIG5ldyBMaXZlTm9kZUxpc3QodGhpcywgZnVuY3Rpb24oYmFzZSkge1xuXHRcdFx0dmFyIGxzID0gW107XG5cdFx0XHRpZiAoY2xhc3NOYW1lc1NldC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdF92aXNpdE5vZGUoYmFzZS5kb2N1bWVudEVsZW1lbnQsIGZ1bmN0aW9uKG5vZGUpIHtcblx0XHRcdFx0XHRpZihub2RlICE9PSBiYXNlICYmIG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuXHRcdFx0XHRcdFx0dmFyIG5vZGVDbGFzc05hbWVzID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJylcblx0XHRcdFx0XHRcdC8vIGNhbiBiZSBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgZG9lcyBub3QgZXhpc3Rcblx0XHRcdFx0XHRcdGlmIChub2RlQ2xhc3NOYW1lcykge1xuXHRcdFx0XHRcdFx0XHQvLyBiZWZvcmUgc3BsaXR0aW5nIGFuZCBpdGVyYXRpbmcganVzdCBjb21wYXJlIHRoZW0gZm9yIHRoZSBtb3N0IGNvbW1vbiBjYXNlXG5cdFx0XHRcdFx0XHRcdHZhciBtYXRjaGVzID0gY2xhc3NOYW1lcyA9PT0gbm9kZUNsYXNzTmFtZXM7XG5cdFx0XHRcdFx0XHRcdGlmICghbWF0Y2hlcykge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBub2RlQ2xhc3NOYW1lc1NldCA9IHRvT3JkZXJlZFNldChub2RlQ2xhc3NOYW1lcylcblx0XHRcdFx0XHRcdFx0XHRtYXRjaGVzID0gY2xhc3NOYW1lc1NldC5ldmVyeShhcnJheUluY2x1ZGVzKG5vZGVDbGFzc05hbWVzU2V0KSlcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZihtYXRjaGVzKSB7XG5cdFx0XHRcdFx0XHRcdFx0bHMucHVzaChub2RlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbHM7XG5cdFx0fSk7XG5cdH0sXG5cblx0Ly9kb2N1bWVudCBmYWN0b3J5IG1ldGhvZDpcblx0Y3JlYXRlRWxlbWVudCA6XHRmdW5jdGlvbih0YWdOYW1lKXtcblx0XHR2YXIgbm9kZSA9IG5ldyBFbGVtZW50KCk7XG5cdFx0bm9kZS5vd25lckRvY3VtZW50ID0gdGhpcztcblx0XHRub2RlLm5vZGVOYW1lID0gdGFnTmFtZTtcblx0XHRub2RlLnRhZ05hbWUgPSB0YWdOYW1lO1xuXHRcdG5vZGUubG9jYWxOYW1lID0gdGFnTmFtZTtcblx0XHRub2RlLmNoaWxkTm9kZXMgPSBuZXcgTm9kZUxpc3QoKTtcblx0XHR2YXIgYXR0cnNcdD0gbm9kZS5hdHRyaWJ1dGVzID0gbmV3IE5hbWVkTm9kZU1hcCgpO1xuXHRcdGF0dHJzLl9vd25lckVsZW1lbnQgPSBub2RlO1xuXHRcdHJldHVybiBub2RlO1xuXHR9LFxuXHRjcmVhdGVEb2N1bWVudEZyYWdtZW50IDpcdGZ1bmN0aW9uKCl7XG5cdFx0dmFyIG5vZGUgPSBuZXcgRG9jdW1lbnRGcmFnbWVudCgpO1xuXHRcdG5vZGUub3duZXJEb2N1bWVudCA9IHRoaXM7XG5cdFx0bm9kZS5jaGlsZE5vZGVzID0gbmV3IE5vZGVMaXN0KCk7XG5cdFx0cmV0dXJuIG5vZGU7XG5cdH0sXG5cdGNyZWF0ZVRleHROb2RlIDpcdGZ1bmN0aW9uKGRhdGEpe1xuXHRcdHZhciBub2RlID0gbmV3IFRleHQoKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnQgPSB0aGlzO1xuXHRcdG5vZGUuYXBwZW5kRGF0YShkYXRhKVxuXHRcdHJldHVybiBub2RlO1xuXHR9LFxuXHRjcmVhdGVDb21tZW50IDpcdGZ1bmN0aW9uKGRhdGEpe1xuXHRcdHZhciBub2RlID0gbmV3IENvbW1lbnQoKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnQgPSB0aGlzO1xuXHRcdG5vZGUuYXBwZW5kRGF0YShkYXRhKVxuXHRcdHJldHVybiBub2RlO1xuXHR9LFxuXHRjcmVhdGVDREFUQVNlY3Rpb24gOlx0ZnVuY3Rpb24oZGF0YSl7XG5cdFx0dmFyIG5vZGUgPSBuZXcgQ0RBVEFTZWN0aW9uKCk7XG5cdFx0bm9kZS5vd25lckRvY3VtZW50ID0gdGhpcztcblx0XHRub2RlLmFwcGVuZERhdGEoZGF0YSlcblx0XHRyZXR1cm4gbm9kZTtcblx0fSxcblx0Y3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uIDpcdGZ1bmN0aW9uKHRhcmdldCxkYXRhKXtcblx0XHR2YXIgbm9kZSA9IG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnQgPSB0aGlzO1xuXHRcdG5vZGUudGFnTmFtZSA9IG5vZGUudGFyZ2V0ID0gdGFyZ2V0O1xuXHRcdG5vZGUubm9kZVZhbHVlPSBub2RlLmRhdGEgPSBkYXRhO1xuXHRcdHJldHVybiBub2RlO1xuXHR9LFxuXHRjcmVhdGVBdHRyaWJ1dGUgOlx0ZnVuY3Rpb24obmFtZSl7XG5cdFx0dmFyIG5vZGUgPSBuZXcgQXR0cigpO1xuXHRcdG5vZGUub3duZXJEb2N1bWVudFx0PSB0aGlzO1xuXHRcdG5vZGUubmFtZSA9IG5hbWU7XG5cdFx0bm9kZS5ub2RlTmFtZVx0PSBuYW1lO1xuXHRcdG5vZGUubG9jYWxOYW1lID0gbmFtZTtcblx0XHRub2RlLnNwZWNpZmllZCA9IHRydWU7XG5cdFx0cmV0dXJuIG5vZGU7XG5cdH0sXG5cdGNyZWF0ZUVudGl0eVJlZmVyZW5jZSA6XHRmdW5jdGlvbihuYW1lKXtcblx0XHR2YXIgbm9kZSA9IG5ldyBFbnRpdHlSZWZlcmVuY2UoKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnRcdD0gdGhpcztcblx0XHRub2RlLm5vZGVOYW1lXHQ9IG5hbWU7XG5cdFx0cmV0dXJuIG5vZGU7XG5cdH0sXG5cdC8vIEludHJvZHVjZWQgaW4gRE9NIExldmVsIDI6XG5cdGNyZWF0ZUVsZW1lbnROUyA6XHRmdW5jdGlvbihuYW1lc3BhY2VVUkkscXVhbGlmaWVkTmFtZSl7XG5cdFx0dmFyIG5vZGUgPSBuZXcgRWxlbWVudCgpO1xuXHRcdHZhciBwbCA9IHF1YWxpZmllZE5hbWUuc3BsaXQoJzonKTtcblx0XHR2YXIgYXR0cnNcdD0gbm9kZS5hdHRyaWJ1dGVzID0gbmV3IE5hbWVkTm9kZU1hcCgpO1xuXHRcdG5vZGUuY2hpbGROb2RlcyA9IG5ldyBOb2RlTGlzdCgpO1xuXHRcdG5vZGUub3duZXJEb2N1bWVudCA9IHRoaXM7XG5cdFx0bm9kZS5ub2RlTmFtZSA9IHF1YWxpZmllZE5hbWU7XG5cdFx0bm9kZS50YWdOYW1lID0gcXVhbGlmaWVkTmFtZTtcblx0XHRub2RlLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTtcblx0XHRpZihwbC5sZW5ndGggPT0gMil7XG5cdFx0XHRub2RlLnByZWZpeCA9IHBsWzBdO1xuXHRcdFx0bm9kZS5sb2NhbE5hbWUgPSBwbFsxXTtcblx0XHR9ZWxzZXtcblx0XHRcdC8vZWwucHJlZml4ID0gbnVsbDtcblx0XHRcdG5vZGUubG9jYWxOYW1lID0gcXVhbGlmaWVkTmFtZTtcblx0XHR9XG5cdFx0YXR0cnMuX293bmVyRWxlbWVudCA9IG5vZGU7XG5cdFx0cmV0dXJuIG5vZGU7XG5cdH0sXG5cdC8vIEludHJvZHVjZWQgaW4gRE9NIExldmVsIDI6XG5cdGNyZWF0ZUF0dHJpYnV0ZU5TIDpcdGZ1bmN0aW9uKG5hbWVzcGFjZVVSSSxxdWFsaWZpZWROYW1lKXtcblx0XHR2YXIgbm9kZSA9IG5ldyBBdHRyKCk7XG5cdFx0dmFyIHBsID0gcXVhbGlmaWVkTmFtZS5zcGxpdCgnOicpO1xuXHRcdG5vZGUub3duZXJEb2N1bWVudCA9IHRoaXM7XG5cdFx0bm9kZS5ub2RlTmFtZSA9IHF1YWxpZmllZE5hbWU7XG5cdFx0bm9kZS5uYW1lID0gcXVhbGlmaWVkTmFtZTtcblx0XHRub2RlLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTtcblx0XHRub2RlLnNwZWNpZmllZCA9IHRydWU7XG5cdFx0aWYocGwubGVuZ3RoID09IDIpe1xuXHRcdFx0bm9kZS5wcmVmaXggPSBwbFswXTtcblx0XHRcdG5vZGUubG9jYWxOYW1lID0gcGxbMV07XG5cdFx0fWVsc2V7XG5cdFx0XHQvL2VsLnByZWZpeCA9IG51bGw7XG5cdFx0XHRub2RlLmxvY2FsTmFtZSA9IHF1YWxpZmllZE5hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBub2RlO1xuXHR9XG59O1xuX2V4dGVuZHMoRG9jdW1lbnQsTm9kZSk7XG5cblxuZnVuY3Rpb24gRWxlbWVudCgpIHtcblx0dGhpcy5fbnNNYXAgPSB7fTtcbn07XG5FbGVtZW50LnByb3RvdHlwZSA9IHtcblx0bm9kZVR5cGUgOiBFTEVNRU5UX05PREUsXG5cdGhhc0F0dHJpYnV0ZSA6IGZ1bmN0aW9uKG5hbWUpe1xuXHRcdHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkhPW51bGw7XG5cdH0sXG5cdGdldEF0dHJpYnV0ZSA6IGZ1bmN0aW9uKG5hbWUpe1xuXHRcdHZhciBhdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpO1xuXHRcdHJldHVybiBhdHRyICYmIGF0dHIudmFsdWUgfHwgJyc7XG5cdH0sXG5cdGdldEF0dHJpYnV0ZU5vZGUgOiBmdW5jdGlvbihuYW1lKXtcblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShuYW1lKTtcblx0fSxcblx0c2V0QXR0cmlidXRlIDogZnVuY3Rpb24obmFtZSwgdmFsdWUpe1xuXHRcdHZhciBhdHRyID0gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShuYW1lKTtcblx0XHRhdHRyLnZhbHVlID0gYXR0ci5ub2RlVmFsdWUgPSBcIlwiICsgdmFsdWU7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpXG5cdH0sXG5cdHJlbW92ZUF0dHJpYnV0ZSA6IGZ1bmN0aW9uKG5hbWUpe1xuXHRcdHZhciBhdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpXG5cdFx0YXR0ciAmJiB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7XG5cdH0sXG5cdFxuXHQvL2ZvdXIgcmVhbCBvcGVhcnRpb24gbWV0aG9kXG5cdGFwcGVuZENoaWxkOmZ1bmN0aW9uKG5ld0NoaWxkKXtcblx0XHRpZihuZXdDaGlsZC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSl7XG5cdFx0XHRyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsbnVsbCk7XG5cdFx0fWVsc2V7XG5cdFx0XHRyZXR1cm4gX2FwcGVuZFNpbmdsZUNoaWxkKHRoaXMsbmV3Q2hpbGQpO1xuXHRcdH1cblx0fSxcblx0c2V0QXR0cmlidXRlTm9kZSA6IGZ1bmN0aW9uKG5ld0F0dHIpe1xuXHRcdHJldHVybiB0aGlzLmF0dHJpYnV0ZXMuc2V0TmFtZWRJdGVtKG5ld0F0dHIpO1xuXHR9LFxuXHRzZXRBdHRyaWJ1dGVOb2RlTlMgOiBmdW5jdGlvbihuZXdBdHRyKXtcblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLnNldE5hbWVkSXRlbU5TKG5ld0F0dHIpO1xuXHR9LFxuXHRyZW1vdmVBdHRyaWJ1dGVOb2RlIDogZnVuY3Rpb24ob2xkQXR0cil7XG5cdFx0Ly9jb25zb2xlLmxvZyh0aGlzID09IG9sZEF0dHIub3duZXJFbGVtZW50KVxuXHRcdHJldHVybiB0aGlzLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG9sZEF0dHIubm9kZU5hbWUpO1xuXHR9LFxuXHQvL2dldCByZWFsIGF0dHJpYnV0ZSBuYW1lLGFuZCByZW1vdmUgaXQgYnkgcmVtb3ZlQXR0cmlidXRlTm9kZVxuXHRyZW1vdmVBdHRyaWJ1dGVOUyA6IGZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKXtcblx0XHR2YXIgb2xkID0gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpO1xuXHRcdG9sZCAmJiB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5vZGUob2xkKTtcblx0fSxcblx0XG5cdGhhc0F0dHJpYnV0ZU5TIDogZnVuY3Rpb24obmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpe1xuXHRcdHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU5vZGVOUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSkhPW51bGw7XG5cdH0sXG5cdGdldEF0dHJpYnV0ZU5TIDogZnVuY3Rpb24obmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpe1xuXHRcdHZhciBhdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpO1xuXHRcdHJldHVybiBhdHRyICYmIGF0dHIudmFsdWUgfHwgJyc7XG5cdH0sXG5cdHNldEF0dHJpYnV0ZU5TIDogZnVuY3Rpb24obmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lLCB2YWx1ZSl7XG5cdFx0dmFyIGF0dHIgPSB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKTtcblx0XHRhdHRyLnZhbHVlID0gYXR0ci5ub2RlVmFsdWUgPSBcIlwiICsgdmFsdWU7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpXG5cdH0sXG5cdGdldEF0dHJpYnV0ZU5vZGVOUyA6IGZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKXtcblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTtcblx0fSxcblx0XG5cdGdldEVsZW1lbnRzQnlUYWdOYW1lIDogZnVuY3Rpb24odGFnTmFtZSl7XG5cdFx0cmV0dXJuIG5ldyBMaXZlTm9kZUxpc3QodGhpcyxmdW5jdGlvbihiYXNlKXtcblx0XHRcdHZhciBscyA9IFtdO1xuXHRcdFx0X3Zpc2l0Tm9kZShiYXNlLGZ1bmN0aW9uKG5vZGUpe1xuXHRcdFx0XHRpZihub2RlICE9PSBiYXNlICYmIG5vZGUubm9kZVR5cGUgPT0gRUxFTUVOVF9OT0RFICYmICh0YWdOYW1lID09PSAnKicgfHwgbm9kZS50YWdOYW1lID09IHRhZ05hbWUpKXtcblx0XHRcdFx0XHRscy5wdXNoKG5vZGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBscztcblx0XHR9KTtcblx0fSxcblx0Z2V0RWxlbWVudHNCeVRhZ05hbWVOUyA6IGZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKXtcblx0XHRyZXR1cm4gbmV3IExpdmVOb2RlTGlzdCh0aGlzLGZ1bmN0aW9uKGJhc2Upe1xuXHRcdFx0dmFyIGxzID0gW107XG5cdFx0XHRfdmlzaXROb2RlKGJhc2UsZnVuY3Rpb24obm9kZSl7XG5cdFx0XHRcdGlmKG5vZGUgIT09IGJhc2UgJiYgbm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIChuYW1lc3BhY2VVUkkgPT09ICcqJyB8fCBub2RlLm5hbWVzcGFjZVVSSSA9PT0gbmFtZXNwYWNlVVJJKSAmJiAobG9jYWxOYW1lID09PSAnKicgfHwgbm9kZS5sb2NhbE5hbWUgPT0gbG9jYWxOYW1lKSl7XG5cdFx0XHRcdFx0bHMucHVzaChub2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gbHM7XG5cdFx0XHRcblx0XHR9KTtcblx0fVxufTtcbkRvY3VtZW50LnByb3RvdHlwZS5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IEVsZW1lbnQucHJvdG90eXBlLmdldEVsZW1lbnRzQnlUYWdOYW1lO1xuRG9jdW1lbnQucHJvdG90eXBlLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMgPSBFbGVtZW50LnByb3RvdHlwZS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TO1xuXG5cbl9leHRlbmRzKEVsZW1lbnQsTm9kZSk7XG5mdW5jdGlvbiBBdHRyKCkge1xufTtcbkF0dHIucHJvdG90eXBlLm5vZGVUeXBlID0gQVRUUklCVVRFX05PREU7XG5fZXh0ZW5kcyhBdHRyLE5vZGUpO1xuXG5cbmZ1bmN0aW9uIENoYXJhY3RlckRhdGEoKSB7XG59O1xuQ2hhcmFjdGVyRGF0YS5wcm90b3R5cGUgPSB7XG5cdGRhdGEgOiAnJyxcblx0c3Vic3RyaW5nRGF0YSA6IGZ1bmN0aW9uKG9mZnNldCwgY291bnQpIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCtjb3VudCk7XG5cdH0sXG5cdGFwcGVuZERhdGE6IGZ1bmN0aW9uKHRleHQpIHtcblx0XHR0ZXh0ID0gdGhpcy5kYXRhK3RleHQ7XG5cdFx0dGhpcy5ub2RlVmFsdWUgPSB0aGlzLmRhdGEgPSB0ZXh0O1xuXHRcdHRoaXMubGVuZ3RoID0gdGV4dC5sZW5ndGg7XG5cdH0sXG5cdGluc2VydERhdGE6IGZ1bmN0aW9uKG9mZnNldCx0ZXh0KSB7XG5cdFx0dGhpcy5yZXBsYWNlRGF0YShvZmZzZXQsMCx0ZXh0KTtcblx0XG5cdH0sXG5cdGFwcGVuZENoaWxkOmZ1bmN0aW9uKG5ld0NoaWxkKXtcblx0XHR0aHJvdyBuZXcgRXJyb3IoRXhjZXB0aW9uTWVzc2FnZVtISUVSQVJDSFlfUkVRVUVTVF9FUlJdKVxuXHR9LFxuXHRkZWxldGVEYXRhOiBmdW5jdGlvbihvZmZzZXQsIGNvdW50KSB7XG5cdFx0dGhpcy5yZXBsYWNlRGF0YShvZmZzZXQsY291bnQsXCJcIik7XG5cdH0sXG5cdHJlcGxhY2VEYXRhOiBmdW5jdGlvbihvZmZzZXQsIGNvdW50LCB0ZXh0KSB7XG5cdFx0dmFyIHN0YXJ0ID0gdGhpcy5kYXRhLnN1YnN0cmluZygwLG9mZnNldCk7XG5cdFx0dmFyIGVuZCA9IHRoaXMuZGF0YS5zdWJzdHJpbmcob2Zmc2V0K2NvdW50KTtcblx0XHR0ZXh0ID0gc3RhcnQgKyB0ZXh0ICsgZW5kO1xuXHRcdHRoaXMubm9kZVZhbHVlID0gdGhpcy5kYXRhID0gdGV4dDtcblx0XHR0aGlzLmxlbmd0aCA9IHRleHQubGVuZ3RoO1xuXHR9XG59XG5fZXh0ZW5kcyhDaGFyYWN0ZXJEYXRhLE5vZGUpO1xuZnVuY3Rpb24gVGV4dCgpIHtcbn07XG5UZXh0LnByb3RvdHlwZSA9IHtcblx0bm9kZU5hbWUgOiBcIiN0ZXh0XCIsXG5cdG5vZGVUeXBlIDogVEVYVF9OT0RFLFxuXHRzcGxpdFRleHQgOiBmdW5jdGlvbihvZmZzZXQpIHtcblx0XHR2YXIgdGV4dCA9IHRoaXMuZGF0YTtcblx0XHR2YXIgbmV3VGV4dCA9IHRleHQuc3Vic3RyaW5nKG9mZnNldCk7XG5cdFx0dGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIG9mZnNldCk7XG5cdFx0dGhpcy5kYXRhID0gdGhpcy5ub2RlVmFsdWUgPSB0ZXh0O1xuXHRcdHRoaXMubGVuZ3RoID0gdGV4dC5sZW5ndGg7XG5cdFx0dmFyIG5ld05vZGUgPSB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3VGV4dCk7XG5cdFx0aWYodGhpcy5wYXJlbnROb2RlKXtcblx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgdGhpcy5uZXh0U2libGluZyk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXdOb2RlO1xuXHR9XG59XG5fZXh0ZW5kcyhUZXh0LENoYXJhY3RlckRhdGEpO1xuZnVuY3Rpb24gQ29tbWVudCgpIHtcbn07XG5Db21tZW50LnByb3RvdHlwZSA9IHtcblx0bm9kZU5hbWUgOiBcIiNjb21tZW50XCIsXG5cdG5vZGVUeXBlIDogQ09NTUVOVF9OT0RFXG59XG5fZXh0ZW5kcyhDb21tZW50LENoYXJhY3RlckRhdGEpO1xuXG5mdW5jdGlvbiBDREFUQVNlY3Rpb24oKSB7XG59O1xuQ0RBVEFTZWN0aW9uLnByb3RvdHlwZSA9IHtcblx0bm9kZU5hbWUgOiBcIiNjZGF0YS1zZWN0aW9uXCIsXG5cdG5vZGVUeXBlIDogQ0RBVEFfU0VDVElPTl9OT0RFXG59XG5fZXh0ZW5kcyhDREFUQVNlY3Rpb24sQ2hhcmFjdGVyRGF0YSk7XG5cblxuZnVuY3Rpb24gRG9jdW1lbnRUeXBlKCkge1xufTtcbkRvY3VtZW50VHlwZS5wcm90b3R5cGUubm9kZVR5cGUgPSBET0NVTUVOVF9UWVBFX05PREU7XG5fZXh0ZW5kcyhEb2N1bWVudFR5cGUsTm9kZSk7XG5cbmZ1bmN0aW9uIE5vdGF0aW9uKCkge1xufTtcbk5vdGF0aW9uLnByb3RvdHlwZS5ub2RlVHlwZSA9IE5PVEFUSU9OX05PREU7XG5fZXh0ZW5kcyhOb3RhdGlvbixOb2RlKTtcblxuZnVuY3Rpb24gRW50aXR5KCkge1xufTtcbkVudGl0eS5wcm90b3R5cGUubm9kZVR5cGUgPSBFTlRJVFlfTk9ERTtcbl9leHRlbmRzKEVudGl0eSxOb2RlKTtcblxuZnVuY3Rpb24gRW50aXR5UmVmZXJlbmNlKCkge1xufTtcbkVudGl0eVJlZmVyZW5jZS5wcm90b3R5cGUubm9kZVR5cGUgPSBFTlRJVFlfUkVGRVJFTkNFX05PREU7XG5fZXh0ZW5kcyhFbnRpdHlSZWZlcmVuY2UsTm9kZSk7XG5cbmZ1bmN0aW9uIERvY3VtZW50RnJhZ21lbnQoKSB7XG59O1xuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUubm9kZU5hbWUgPVx0XCIjZG9jdW1lbnQtZnJhZ21lbnRcIjtcbkRvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLm5vZGVUeXBlID1cdERPQ1VNRU5UX0ZSQUdNRU5UX05PREU7XG5fZXh0ZW5kcyhEb2N1bWVudEZyYWdtZW50LE5vZGUpO1xuXG5cbmZ1bmN0aW9uIFByb2Nlc3NpbmdJbnN0cnVjdGlvbigpIHtcbn1cblByb2Nlc3NpbmdJbnN0cnVjdGlvbi5wcm90b3R5cGUubm9kZVR5cGUgPSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU7XG5fZXh0ZW5kcyhQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24sTm9kZSk7XG5mdW5jdGlvbiBYTUxTZXJpYWxpemVyKCl7fVxuWE1MU2VyaWFsaXplci5wcm90b3R5cGUuc2VyaWFsaXplVG9TdHJpbmcgPSBmdW5jdGlvbihub2RlLGlzSHRtbCxub2RlRmlsdGVyKXtcblx0cmV0dXJuIG5vZGVTZXJpYWxpemVUb1N0cmluZy5jYWxsKG5vZGUsaXNIdG1sLG5vZGVGaWx0ZXIpO1xufVxuTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBub2RlU2VyaWFsaXplVG9TdHJpbmc7XG5mdW5jdGlvbiBub2RlU2VyaWFsaXplVG9TdHJpbmcoaXNIdG1sLG5vZGVGaWx0ZXIpe1xuXHR2YXIgYnVmID0gW107XG5cdHZhciByZWZOb2RlID0gdGhpcy5ub2RlVHlwZSA9PSA5ICYmIHRoaXMuZG9jdW1lbnRFbGVtZW50IHx8IHRoaXM7XG5cdHZhciBwcmVmaXggPSByZWZOb2RlLnByZWZpeDtcblx0dmFyIHVyaSA9IHJlZk5vZGUubmFtZXNwYWNlVVJJO1xuXHRcblx0aWYodXJpICYmIHByZWZpeCA9PSBudWxsKXtcblx0XHQvL2NvbnNvbGUubG9nKHByZWZpeClcblx0XHR2YXIgcHJlZml4ID0gcmVmTm9kZS5sb29rdXBQcmVmaXgodXJpKTtcblx0XHRpZihwcmVmaXggPT0gbnVsbCl7XG5cdFx0XHQvL2lzSFRNTCA9IHRydWU7XG5cdFx0XHR2YXIgdmlzaWJsZU5hbWVzcGFjZXM9W1xuXHRcdFx0e25hbWVzcGFjZTp1cmkscHJlZml4Om51bGx9XG5cdFx0XHQvL3tuYW1lc3BhY2U6dXJpLHByZWZpeDonJ31cblx0XHRcdF1cblx0XHR9XG5cdH1cblx0c2VyaWFsaXplVG9TdHJpbmcodGhpcyxidWYsaXNIdG1sLG5vZGVGaWx0ZXIsdmlzaWJsZU5hbWVzcGFjZXMpO1xuXHQvL2NvbnNvbGUubG9nKCcjIyMnLHRoaXMubm9kZVR5cGUsdXJpLHByZWZpeCxidWYuam9pbignJykpXG5cdHJldHVybiBidWYuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIG5lZWROYW1lc3BhY2VEZWZpbmUobm9kZSwgaXNIVE1MLCB2aXNpYmxlTmFtZXNwYWNlcykge1xuXHR2YXIgcHJlZml4ID0gbm9kZS5wcmVmaXggfHwgJyc7XG5cdHZhciB1cmkgPSBub2RlLm5hbWVzcGFjZVVSSTtcblx0Ly8gQWNjb3JkaW5nIHRvIFtOYW1lc3BhY2VzIGluIFhNTCAxLjBdKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzLyNucy11c2luZykgLFxuXHQvLyBhbmQgbW9yZSBzcGVjaWZpY2FsbHkgaHR0cHM6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvI25zYy1Ob1ByZWZpeFVuZGVjbCA6XG5cdC8vID4gSW4gYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gZm9yIGEgcHJlZml4IFsuLi5dLCB0aGUgYXR0cmlidXRlIHZhbHVlIE1VU1QgTk9UIGJlIGVtcHR5LlxuXHQvLyBpbiBhIHNpbWlsYXIgbWFubmVyIFtOYW1lc3BhY2VzIGluIFhNTCAxLjFdKGh0dHBzOi8vd3d3LnczLm9yZy9UUi94bWwtbmFtZXMxMS8jbnMtdXNpbmcpXG5cdC8vIGFuZCBtb3JlIHNwZWNpZmljYWxseSBodHRwczovL3d3dy53My5vcmcvVFIveG1sLW5hbWVzMTEvI25zYy1OU0RlY2xhcmVkIDpcblx0Ly8gPiBbLi4uXSBGdXJ0aGVybW9yZSwgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBbLi4uXSBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcuXG5cdC8vIHNvIHNlcmlhbGl6aW5nIGVtcHR5IG5hbWVzcGFjZSB2YWx1ZSBsaWtlIHhtbG5zOmRzPVwiXCIgd291bGQgcHJvZHVjZSBhbiBpbnZhbGlkIFhNTCBkb2N1bWVudC5cblx0aWYgKCF1cmkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHByZWZpeCA9PT0gXCJ4bWxcIiAmJiB1cmkgPT09IE5BTUVTUEFDRS5YTUwgfHwgdXJpID09PSBOQU1FU1BBQ0UuWE1MTlMpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0XG5cdHZhciBpID0gdmlzaWJsZU5hbWVzcGFjZXMubGVuZ3RoIFxuXHR3aGlsZSAoaS0tKSB7XG5cdFx0dmFyIG5zID0gdmlzaWJsZU5hbWVzcGFjZXNbaV07XG5cdFx0Ly8gZ2V0IG5hbWVzcGFjZSBwcmVmaXhcblx0XHRpZiAobnMucHJlZml4ID09PSBwcmVmaXgpIHtcblx0XHRcdHJldHVybiBucy5uYW1lc3BhY2UgIT09IHVyaTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRydWU7XG59XG4vKipcbiAqIFdlbGwtZm9ybWVkIGNvbnN0cmFpbnQ6IE5vIDwgaW4gQXR0cmlidXRlIFZhbHVlc1xuICogPiBUaGUgcmVwbGFjZW1lbnQgdGV4dCBvZiBhbnkgZW50aXR5IHJlZmVycmVkIHRvIGRpcmVjdGx5IG9yIGluZGlyZWN0bHlcbiAqID4gaW4gYW4gYXR0cmlidXRlIHZhbHVlIG11c3Qgbm90IGNvbnRhaW4gYSA8LlxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIveG1sMTEvI0NsZWFuQXR0clZhbHNcbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3htbDExLyNOVC1BdHRWYWx1ZVxuICpcbiAqIExpdGVyYWwgd2hpdGVzcGFjZSBvdGhlciB0aGFuIHNwYWNlIHRoYXQgYXBwZWFyIGluIGF0dHJpYnV0ZSB2YWx1ZXNcbiAqIGFyZSBzZXJpYWxpemVkIGFzIHRoZWlyIGVudGl0eSByZWZlcmVuY2VzLCBzbyB0aGV5IHdpbGwgYmUgcHJlc2VydmVkLlxuICogKEluIGNvbnRyYXN0IHRvIHdoaXRlc3BhY2UgbGl0ZXJhbHMgaW4gdGhlIGlucHV0IHdoaWNoIGFyZSBub3JtYWxpemVkIHRvIHNwYWNlcylcbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3htbDExLyNBVk5vcm1hbGl6ZVxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRE9NLVBhcnNpbmcvI3NlcmlhbGl6aW5nLWFuLWVsZW1lbnQtcy1hdHRyaWJ1dGVzXG4gKi9cbmZ1bmN0aW9uIGFkZFNlcmlhbGl6ZWRBdHRyaWJ1dGUoYnVmLCBxdWFsaWZpZWROYW1lLCB2YWx1ZSkge1xuXHRidWYucHVzaCgnICcsIHF1YWxpZmllZE5hbWUsICc9XCInLCB2YWx1ZS5yZXBsYWNlKC9bPD4mXCJcXHRcXG5cXHJdL2csIF94bWxFbmNvZGVyKSwgJ1wiJylcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplVG9TdHJpbmcobm9kZSxidWYsaXNIVE1MLG5vZGVGaWx0ZXIsdmlzaWJsZU5hbWVzcGFjZXMpe1xuXHRpZiAoIXZpc2libGVOYW1lc3BhY2VzKSB7XG5cdFx0dmlzaWJsZU5hbWVzcGFjZXMgPSBbXTtcblx0fVxuXG5cdGlmKG5vZGVGaWx0ZXIpe1xuXHRcdG5vZGUgPSBub2RlRmlsdGVyKG5vZGUpO1xuXHRcdGlmKG5vZGUpe1xuXHRcdFx0aWYodHlwZW9mIG5vZGUgPT0gJ3N0cmluZycpe1xuXHRcdFx0XHRidWYucHVzaChub2RlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1lbHNle1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvL2J1Zi5zb3J0LmFwcGx5KGF0dHJzLCBhdHRyaWJ1dGVTb3J0ZXIpO1xuXHR9XG5cblx0c3dpdGNoKG5vZGUubm9kZVR5cGUpe1xuXHRjYXNlIEVMRU1FTlRfTk9ERTpcblx0XHR2YXIgYXR0cnMgPSBub2RlLmF0dHJpYnV0ZXM7XG5cdFx0dmFyIGxlbiA9IGF0dHJzLmxlbmd0aDtcblx0XHR2YXIgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG5cdFx0dmFyIG5vZGVOYW1lID0gbm9kZS50YWdOYW1lO1xuXHRcdFxuXHRcdGlzSFRNTCA9IE5BTUVTUEFDRS5pc0hUTUwobm9kZS5uYW1lc3BhY2VVUkkpIHx8IGlzSFRNTFxuXG5cdFx0dmFyIHByZWZpeGVkTm9kZU5hbWUgPSBub2RlTmFtZVxuXHRcdGlmICghaXNIVE1MICYmICFub2RlLnByZWZpeCAmJiBub2RlLm5hbWVzcGFjZVVSSSkge1xuXHRcdFx0dmFyIGRlZmF1bHROU1xuXHRcdFx0Ly8gbG9va3VwIGN1cnJlbnQgZGVmYXVsdCBucyBmcm9tIGB4bWxuc2AgYXR0cmlidXRlXG5cdFx0XHRmb3IgKHZhciBhaSA9IDA7IGFpIDwgYXR0cnMubGVuZ3RoOyBhaSsrKSB7XG5cdFx0XHRcdGlmIChhdHRycy5pdGVtKGFpKS5uYW1lID09PSAneG1sbnMnKSB7XG5cdFx0XHRcdFx0ZGVmYXVsdE5TID0gYXR0cnMuaXRlbShhaSkudmFsdWVcblx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWRlZmF1bHROUykge1xuXHRcdFx0XHQvLyBsb29rdXAgY3VycmVudCBkZWZhdWx0IG5zIGluIHZpc2libGVOYW1lc3BhY2VzXG5cdFx0XHRcdGZvciAodmFyIG5zaSA9IHZpc2libGVOYW1lc3BhY2VzLmxlbmd0aCAtIDE7IG5zaSA+PSAwOyBuc2ktLSkge1xuXHRcdFx0XHRcdHZhciBuYW1lc3BhY2UgPSB2aXNpYmxlTmFtZXNwYWNlc1tuc2ldXG5cdFx0XHRcdFx0aWYgKG5hbWVzcGFjZS5wcmVmaXggPT09ICcnICYmIG5hbWVzcGFjZS5uYW1lc3BhY2UgPT09IG5vZGUubmFtZXNwYWNlVVJJKSB7XG5cdFx0XHRcdFx0XHRkZWZhdWx0TlMgPSBuYW1lc3BhY2UubmFtZXNwYWNlXG5cdFx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGRlZmF1bHROUyAhPT0gbm9kZS5uYW1lc3BhY2VVUkkpIHtcblx0XHRcdFx0Zm9yICh2YXIgbnNpID0gdmlzaWJsZU5hbWVzcGFjZXMubGVuZ3RoIC0gMTsgbnNpID49IDA7IG5zaS0tKSB7XG5cdFx0XHRcdFx0dmFyIG5hbWVzcGFjZSA9IHZpc2libGVOYW1lc3BhY2VzW25zaV1cblx0XHRcdFx0XHRpZiAobmFtZXNwYWNlLm5hbWVzcGFjZSA9PT0gbm9kZS5uYW1lc3BhY2VVUkkpIHtcblx0XHRcdFx0XHRcdGlmIChuYW1lc3BhY2UucHJlZml4KSB7XG5cdFx0XHRcdFx0XHRcdHByZWZpeGVkTm9kZU5hbWUgPSBuYW1lc3BhY2UucHJlZml4ICsgJzonICsgbm9kZU5hbWVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YnVmLnB1c2goJzwnLCBwcmVmaXhlZE5vZGVOYW1lKTtcblxuXHRcdGZvcih2YXIgaT0wO2k8bGVuO2krKyl7XG5cdFx0XHQvLyBhZGQgbmFtZXNwYWNlcyBmb3IgYXR0cmlidXRlc1xuXHRcdFx0dmFyIGF0dHIgPSBhdHRycy5pdGVtKGkpO1xuXHRcdFx0aWYgKGF0dHIucHJlZml4ID09ICd4bWxucycpIHtcblx0XHRcdFx0dmlzaWJsZU5hbWVzcGFjZXMucHVzaCh7IHByZWZpeDogYXR0ci5sb2NhbE5hbWUsIG5hbWVzcGFjZTogYXR0ci52YWx1ZSB9KTtcblx0XHRcdH1lbHNlIGlmKGF0dHIubm9kZU5hbWUgPT0gJ3htbG5zJyl7XG5cdFx0XHRcdHZpc2libGVOYW1lc3BhY2VzLnB1c2goeyBwcmVmaXg6ICcnLCBuYW1lc3BhY2U6IGF0dHIudmFsdWUgfSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yKHZhciBpPTA7aTxsZW47aSsrKXtcblx0XHRcdHZhciBhdHRyID0gYXR0cnMuaXRlbShpKTtcblx0XHRcdGlmIChuZWVkTmFtZXNwYWNlRGVmaW5lKGF0dHIsaXNIVE1MLCB2aXNpYmxlTmFtZXNwYWNlcykpIHtcblx0XHRcdFx0dmFyIHByZWZpeCA9IGF0dHIucHJlZml4fHwnJztcblx0XHRcdFx0dmFyIHVyaSA9IGF0dHIubmFtZXNwYWNlVVJJO1xuXHRcdFx0XHRhZGRTZXJpYWxpemVkQXR0cmlidXRlKGJ1ZiwgcHJlZml4ID8gJ3htbG5zOicgKyBwcmVmaXggOiBcInhtbG5zXCIsIHVyaSk7XG5cdFx0XHRcdHZpc2libGVOYW1lc3BhY2VzLnB1c2goeyBwcmVmaXg6IHByZWZpeCwgbmFtZXNwYWNlOnVyaSB9KTtcblx0XHRcdH1cblx0XHRcdHNlcmlhbGl6ZVRvU3RyaW5nKGF0dHIsYnVmLGlzSFRNTCxub2RlRmlsdGVyLHZpc2libGVOYW1lc3BhY2VzKTtcblx0XHR9XG5cblx0XHQvLyBhZGQgbmFtZXNwYWNlIGZvciBjdXJyZW50IG5vZGVcdFx0XG5cdFx0aWYgKG5vZGVOYW1lID09PSBwcmVmaXhlZE5vZGVOYW1lICYmIG5lZWROYW1lc3BhY2VEZWZpbmUobm9kZSwgaXNIVE1MLCB2aXNpYmxlTmFtZXNwYWNlcykpIHtcblx0XHRcdHZhciBwcmVmaXggPSBub2RlLnByZWZpeHx8Jyc7XG5cdFx0XHR2YXIgdXJpID0gbm9kZS5uYW1lc3BhY2VVUkk7XG5cdFx0XHRhZGRTZXJpYWxpemVkQXR0cmlidXRlKGJ1ZiwgcHJlZml4ID8gJ3htbG5zOicgKyBwcmVmaXggOiBcInhtbG5zXCIsIHVyaSk7XG5cdFx0XHR2aXNpYmxlTmFtZXNwYWNlcy5wdXNoKHsgcHJlZml4OiBwcmVmaXgsIG5hbWVzcGFjZTp1cmkgfSk7XG5cdFx0fVxuXHRcdFxuXHRcdGlmKGNoaWxkIHx8IGlzSFRNTCAmJiAhL14oPzptZXRhfGxpbmt8aW1nfGJyfGhyfGlucHV0KSQvaS50ZXN0KG5vZGVOYW1lKSl7XG5cdFx0XHRidWYucHVzaCgnPicpO1xuXHRcdFx0Ly9pZiBpcyBjZGF0YSBjaGlsZCBub2RlXG5cdFx0XHRpZihpc0hUTUwgJiYgL15zY3JpcHQkL2kudGVzdChub2RlTmFtZSkpe1xuXHRcdFx0XHR3aGlsZShjaGlsZCl7XG5cdFx0XHRcdFx0aWYoY2hpbGQuZGF0YSl7XG5cdFx0XHRcdFx0XHRidWYucHVzaChjaGlsZC5kYXRhKTtcblx0XHRcdFx0XHR9ZWxzZXtcblx0XHRcdFx0XHRcdHNlcmlhbGl6ZVRvU3RyaW5nKGNoaWxkLCBidWYsIGlzSFRNTCwgbm9kZUZpbHRlciwgdmlzaWJsZU5hbWVzcGFjZXMuc2xpY2UoKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1lbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHdoaWxlKGNoaWxkKXtcblx0XHRcdFx0XHRzZXJpYWxpemVUb1N0cmluZyhjaGlsZCwgYnVmLCBpc0hUTUwsIG5vZGVGaWx0ZXIsIHZpc2libGVOYW1lc3BhY2VzLnNsaWNlKCkpO1xuXHRcdFx0XHRcdGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGJ1Zi5wdXNoKCc8LycscHJlZml4ZWROb2RlTmFtZSwnPicpO1xuXHRcdH1lbHNle1xuXHRcdFx0YnVmLnB1c2goJy8+Jyk7XG5cdFx0fVxuXHRcdC8vIHJlbW92ZSBhZGRlZCB2aXNpYmxlIG5hbWVzcGFjZXNcblx0XHQvL3Zpc2libGVOYW1lc3BhY2VzLmxlbmd0aCA9IHN0YXJ0VmlzaWJsZU5hbWVzcGFjZXM7XG5cdFx0cmV0dXJuO1xuXHRjYXNlIERPQ1VNRU5UX05PREU6XG5cdGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcblx0XHR2YXIgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG5cdFx0d2hpbGUoY2hpbGQpe1xuXHRcdFx0c2VyaWFsaXplVG9TdHJpbmcoY2hpbGQsIGJ1ZiwgaXNIVE1MLCBub2RlRmlsdGVyLCB2aXNpYmxlTmFtZXNwYWNlcy5zbGljZSgpKTtcblx0XHRcdGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0fVxuXHRcdHJldHVybjtcblx0Y2FzZSBBVFRSSUJVVEVfTk9ERTpcblx0XHRyZXR1cm4gYWRkU2VyaWFsaXplZEF0dHJpYnV0ZShidWYsIG5vZGUubmFtZSwgbm9kZS52YWx1ZSk7XG5cdGNhc2UgVEVYVF9OT0RFOlxuXHRcdC8qKlxuXHRcdCAqIFRoZSBhbXBlcnNhbmQgY2hhcmFjdGVyICgmKSBhbmQgdGhlIGxlZnQgYW5nbGUgYnJhY2tldCAoPCkgbXVzdCBub3QgYXBwZWFyIGluIHRoZWlyIGxpdGVyYWwgZm9ybSxcblx0XHQgKiBleGNlcHQgd2hlbiB1c2VkIGFzIG1hcmt1cCBkZWxpbWl0ZXJzLCBvciB3aXRoaW4gYSBjb21tZW50LCBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIG9yIGEgQ0RBVEEgc2VjdGlvbi5cblx0XHQgKiBJZiB0aGV5IGFyZSBuZWVkZWQgZWxzZXdoZXJlLCB0aGV5IG11c3QgYmUgZXNjYXBlZCB1c2luZyBlaXRoZXIgbnVtZXJpYyBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBvciB0aGUgc3RyaW5nc1xuXHRcdCAqIGAmYW1wO2AgYW5kIGAmbHQ7YCByZXNwZWN0aXZlbHkuXG5cdFx0ICogVGhlIHJpZ2h0IGFuZ2xlIGJyYWNrZXQgKD4pIG1heSBiZSByZXByZXNlbnRlZCB1c2luZyB0aGUgc3RyaW5nIFwiICZndDsgXCIsIGFuZCBtdXN0LCBmb3IgY29tcGF0aWJpbGl0eSxcblx0XHQgKiBiZSBlc2NhcGVkIHVzaW5nIGVpdGhlciBgJmd0O2Agb3IgYSBjaGFyYWN0ZXIgcmVmZXJlbmNlIHdoZW4gaXQgYXBwZWFycyBpbiB0aGUgc3RyaW5nIGBdXT5gIGluIGNvbnRlbnQsXG5cdFx0ICogd2hlbiB0aGF0IHN0cmluZyBpcyBub3QgbWFya2luZyB0aGUgZW5kIG9mIGEgQ0RBVEEgc2VjdGlvbi5cblx0XHQgKlxuXHRcdCAqIEluIHRoZSBjb250ZW50IG9mIGVsZW1lbnRzLCBjaGFyYWN0ZXIgZGF0YSBpcyBhbnkgc3RyaW5nIG9mIGNoYXJhY3RlcnNcblx0XHQgKiB3aGljaCBkb2VzIG5vdCBjb250YWluIHRoZSBzdGFydC1kZWxpbWl0ZXIgb2YgYW55IG1hcmt1cFxuXHRcdCAqIGFuZCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBDREFUQS1zZWN0aW9uLWNsb3NlIGRlbGltaXRlciwgYF1dPmAuXG5cdFx0ICpcblx0XHQgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi94bWwvI05ULUNoYXJEYXRhXG5cdFx0ICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRE9NLVBhcnNpbmcvI3htbC1zZXJpYWxpemluZy1hLXRleHQtbm9kZVxuXHRcdCAqL1xuXHRcdHJldHVybiBidWYucHVzaChub2RlLmRhdGFcblx0XHRcdC5yZXBsYWNlKC9bPCY+XS9nLF94bWxFbmNvZGVyKVxuXHRcdCk7XG5cdGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOlxuXHRcdHJldHVybiBidWYucHVzaCggJzwhW0NEQVRBWycsbm9kZS5kYXRhLCddXT4nKTtcblx0Y2FzZSBDT01NRU5UX05PREU6XG5cdFx0cmV0dXJuIGJ1Zi5wdXNoKCBcIjwhLS1cIixub2RlLmRhdGEsXCItLT5cIik7XG5cdGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOlxuXHRcdHZhciBwdWJpZCA9IG5vZGUucHVibGljSWQ7XG5cdFx0dmFyIHN5c2lkID0gbm9kZS5zeXN0ZW1JZDtcblx0XHRidWYucHVzaCgnPCFET0NUWVBFICcsbm9kZS5uYW1lKTtcblx0XHRpZihwdWJpZCl7XG5cdFx0XHRidWYucHVzaCgnIFBVQkxJQyAnLCBwdWJpZCk7XG5cdFx0XHRpZiAoc3lzaWQgJiYgc3lzaWQhPScuJykge1xuXHRcdFx0XHRidWYucHVzaCgnICcsIHN5c2lkKTtcblx0XHRcdH1cblx0XHRcdGJ1Zi5wdXNoKCc+Jyk7XG5cdFx0fWVsc2UgaWYoc3lzaWQgJiYgc3lzaWQhPScuJyl7XG5cdFx0XHRidWYucHVzaCgnIFNZU1RFTSAnLCBzeXNpZCwgJz4nKTtcblx0XHR9ZWxzZXtcblx0XHRcdHZhciBzdWIgPSBub2RlLmludGVybmFsU3Vic2V0O1xuXHRcdFx0aWYoc3ViKXtcblx0XHRcdFx0YnVmLnB1c2goXCIgW1wiLHN1YixcIl1cIik7XG5cdFx0XHR9XG5cdFx0XHRidWYucHVzaChcIj5cIik7XG5cdFx0fVxuXHRcdHJldHVybjtcblx0Y2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6XG5cdFx0cmV0dXJuIGJ1Zi5wdXNoKCBcIjw/XCIsbm9kZS50YXJnZXQsXCIgXCIsbm9kZS5kYXRhLFwiPz5cIik7XG5cdGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOlxuXHRcdHJldHVybiBidWYucHVzaCggJyYnLG5vZGUubm9kZU5hbWUsJzsnKTtcblx0Ly9jYXNlIEVOVElUWV9OT0RFOlxuXHQvL2Nhc2UgTk9UQVRJT05fTk9ERTpcblx0ZGVmYXVsdDpcblx0XHRidWYucHVzaCgnPz8nLG5vZGUubm9kZU5hbWUpO1xuXHR9XG59XG5mdW5jdGlvbiBpbXBvcnROb2RlKGRvYyxub2RlLGRlZXApe1xuXHR2YXIgbm9kZTI7XG5cdHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuXHRjYXNlIEVMRU1FTlRfTk9ERTpcblx0XHRub2RlMiA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcblx0XHRub2RlMi5vd25lckRvY3VtZW50ID0gZG9jO1xuXHRcdC8vdmFyIGF0dHJzID0gbm9kZTIuYXR0cmlidXRlcztcblx0XHQvL3ZhciBsZW4gPSBhdHRycy5sZW5ndGg7XG5cdFx0Ly9mb3IodmFyIGk9MDtpPGxlbjtpKyspe1xuXHRcdFx0Ly9ub2RlMi5zZXRBdHRyaWJ1dGVOb2RlTlMoaW1wb3J0Tm9kZShkb2MsYXR0cnMuaXRlbShpKSxkZWVwKSk7XG5cdFx0Ly99XG5cdGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcblx0XHRicmVhaztcblx0Y2FzZSBBVFRSSUJVVEVfTk9ERTpcblx0XHRkZWVwID0gdHJ1ZTtcblx0XHRicmVhaztcblx0Ly9jYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERTpcblx0Ly9jYXNlIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTpcblx0Ly8vL2Nhc2UgVEVYVF9OT0RFOlxuXHQvL2Nhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOlxuXHQvL2Nhc2UgQ09NTUVOVF9OT0RFOlxuXHQvL1x0ZGVlcCA9IGZhbHNlO1xuXHQvL1x0YnJlYWs7XG5cdC8vY2FzZSBET0NVTUVOVF9OT0RFOlxuXHQvL2Nhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOlxuXHQvL2Nhbm5vdCBiZSBpbXBvcnRlZC5cblx0Ly9jYXNlIEVOVElUWV9OT0RFOlxuXHQvL2Nhc2UgTk9UQVRJT05fTk9ERe+8mlxuXHQvL2NhbiBub3QgaGl0IGluIGxldmVsM1xuXHQvL2RlZmF1bHQ6dGhyb3cgZTtcblx0fVxuXHRpZighbm9kZTIpe1xuXHRcdG5vZGUyID0gbm9kZS5jbG9uZU5vZGUoZmFsc2UpOy8vZmFsc2Vcblx0fVxuXHRub2RlMi5vd25lckRvY3VtZW50ID0gZG9jO1xuXHRub2RlMi5wYXJlbnROb2RlID0gbnVsbDtcblx0aWYoZGVlcCl7XG5cdFx0dmFyIGNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXHRcdHdoaWxlKGNoaWxkKXtcblx0XHRcdG5vZGUyLmFwcGVuZENoaWxkKGltcG9ydE5vZGUoZG9jLGNoaWxkLGRlZXApKTtcblx0XHRcdGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBub2RlMjtcbn1cbi8vXG4vL3ZhciBfcmVsYXRpb25NYXAgPSB7Zmlyc3RDaGlsZDoxLGxhc3RDaGlsZDoxLHByZXZpb3VzU2libGluZzoxLG5leHRTaWJsaW5nOjEsXG4vL1x0XHRcdFx0XHRhdHRyaWJ1dGVzOjEsY2hpbGROb2RlczoxLHBhcmVudE5vZGU6MSxkb2N1bWVudEVsZW1lbnQ6MSxkb2N0eXBlLH07XG5mdW5jdGlvbiBjbG9uZU5vZGUoZG9jLG5vZGUsZGVlcCl7XG5cdHZhciBub2RlMiA9IG5ldyBub2RlLmNvbnN0cnVjdG9yKCk7XG5cdGZvcih2YXIgbiBpbiBub2RlKXtcblx0XHR2YXIgdiA9IG5vZGVbbl07XG5cdFx0aWYodHlwZW9mIHYgIT0gJ29iamVjdCcgKXtcblx0XHRcdGlmKHYgIT0gbm9kZTJbbl0pe1xuXHRcdFx0XHRub2RlMltuXSA9IHY7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGlmKG5vZGUuY2hpbGROb2Rlcyl7XG5cdFx0bm9kZTIuY2hpbGROb2RlcyA9IG5ldyBOb2RlTGlzdCgpO1xuXHR9XG5cdG5vZGUyLm93bmVyRG9jdW1lbnQgPSBkb2M7XG5cdHN3aXRjaCAobm9kZTIubm9kZVR5cGUpIHtcblx0Y2FzZSBFTEVNRU5UX05PREU6XG5cdFx0dmFyIGF0dHJzXHQ9IG5vZGUuYXR0cmlidXRlcztcblx0XHR2YXIgYXR0cnMyXHQ9IG5vZGUyLmF0dHJpYnV0ZXMgPSBuZXcgTmFtZWROb2RlTWFwKCk7XG5cdFx0dmFyIGxlbiA9IGF0dHJzLmxlbmd0aFxuXHRcdGF0dHJzMi5fb3duZXJFbGVtZW50ID0gbm9kZTI7XG5cdFx0Zm9yKHZhciBpPTA7aTxsZW47aSsrKXtcblx0XHRcdG5vZGUyLnNldEF0dHJpYnV0ZU5vZGUoY2xvbmVOb2RlKGRvYyxhdHRycy5pdGVtKGkpLHRydWUpKTtcblx0XHR9XG5cdFx0YnJlYWs7O1xuXHRjYXNlIEFUVFJJQlVURV9OT0RFOlxuXHRcdGRlZXAgPSB0cnVlO1xuXHR9XG5cdGlmKGRlZXApe1xuXHRcdHZhciBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblx0XHR3aGlsZShjaGlsZCl7XG5cdFx0XHRub2RlMi5hcHBlbmRDaGlsZChjbG9uZU5vZGUoZG9jLGNoaWxkLGRlZXApKTtcblx0XHRcdGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBub2RlMjtcbn1cblxuZnVuY3Rpb24gX19zZXRfXyhvYmplY3Qsa2V5LHZhbHVlKXtcblx0b2JqZWN0W2tleV0gPSB2YWx1ZVxufVxuLy9kbyBkeW5hbWljXG50cnl7XG5cdGlmKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSl7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KExpdmVOb2RlTGlzdC5wcm90b3R5cGUsJ2xlbmd0aCcse1xuXHRcdFx0Z2V0OmZ1bmN0aW9uKCl7XG5cdFx0XHRcdF91cGRhdGVMaXZlTGlzdCh0aGlzKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuJCRsZW5ndGg7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoTm9kZS5wcm90b3R5cGUsJ3RleHRDb250ZW50Jyx7XG5cdFx0XHRnZXQ6ZnVuY3Rpb24oKXtcblx0XHRcdFx0cmV0dXJuIGdldFRleHRDb250ZW50KHRoaXMpO1xuXHRcdFx0fSxcblxuXHRcdFx0c2V0OmZ1bmN0aW9uKGRhdGEpe1xuXHRcdFx0XHRzd2l0Y2godGhpcy5ub2RlVHlwZSl7XG5cdFx0XHRcdGNhc2UgRUxFTUVOVF9OT0RFOlxuXHRcdFx0XHRjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6XG5cdFx0XHRcdFx0d2hpbGUodGhpcy5maXJzdENoaWxkKXtcblx0XHRcdFx0XHRcdHRoaXMucmVtb3ZlQ2hpbGQodGhpcy5maXJzdENoaWxkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoZGF0YSB8fCBTdHJpbmcoZGF0YSkpe1xuXHRcdFx0XHRcdFx0dGhpcy5hcHBlbmRDaGlsZCh0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGF0YSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHRoaXMuZGF0YSA9IGRhdGE7XG5cdFx0XHRcdFx0dGhpcy52YWx1ZSA9IGRhdGE7XG5cdFx0XHRcdFx0dGhpcy5ub2RlVmFsdWUgPSBkYXRhO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSlcblx0XHRcblx0XHRmdW5jdGlvbiBnZXRUZXh0Q29udGVudChub2RlKXtcblx0XHRcdHN3aXRjaChub2RlLm5vZGVUeXBlKXtcblx0XHRcdGNhc2UgRUxFTUVOVF9OT0RFOlxuXHRcdFx0Y2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOlxuXHRcdFx0XHR2YXIgYnVmID0gW107XG5cdFx0XHRcdG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG5cdFx0XHRcdHdoaWxlKG5vZGUpe1xuXHRcdFx0XHRcdGlmKG5vZGUubm9kZVR5cGUhPT03ICYmIG5vZGUubm9kZVR5cGUgIT09OCl7XG5cdFx0XHRcdFx0XHRidWYucHVzaChnZXRUZXh0Q29udGVudChub2RlKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBidWYuam9pbignJyk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gbm9kZS5ub2RlVmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0X19zZXRfXyA9IGZ1bmN0aW9uKG9iamVjdCxrZXksdmFsdWUpe1xuXHRcdFx0Ly9jb25zb2xlLmxvZyh2YWx1ZSlcblx0XHRcdG9iamVjdFsnJCQnK2tleV0gPSB2YWx1ZVxuXHRcdH1cblx0fVxufWNhdGNoKGUpey8vaWU4XG59XG5cbi8vaWYodHlwZW9mIHJlcXVpcmUgPT0gJ2Z1bmN0aW9uJyl7XG5cdGV4cG9ydHMuRG9jdW1lbnRUeXBlID0gRG9jdW1lbnRUeXBlO1xuXHRleHBvcnRzLkRPTUV4Y2VwdGlvbiA9IERPTUV4Y2VwdGlvbjtcblx0ZXhwb3J0cy5ET01JbXBsZW1lbnRhdGlvbiA9IERPTUltcGxlbWVudGF0aW9uO1xuXHRleHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuXHRleHBvcnRzLk5vZGUgPSBOb2RlO1xuXHRleHBvcnRzLk5vZGVMaXN0ID0gTm9kZUxpc3Q7XG5cdGV4cG9ydHMuWE1MU2VyaWFsaXplciA9IFhNTFNlcmlhbGl6ZXI7XG4vL31cbiIsInZhciBmcmVlemUgPSByZXF1aXJlKCcuL2NvbnZlbnRpb25zJykuZnJlZXplO1xuXG4vKipcbiAqIFRoZSBlbnRpdGllcyB0aGF0IGFyZSBwcmVkZWZpbmVkIGluIGV2ZXJ5IFhNTCBkb2N1bWVudC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDA2L1JFQy14bWwxMS0yMDA2MDgxNi8jc2VjLXByZWRlZmluZWQtZW50IFczQyBYTUwgMS4xXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDA4L1JFQy14bWwtMjAwODExMjYvI3NlYy1wcmVkZWZpbmVkLWVudCBXM0MgWE1MIDEuMFxuICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX1hNTF9hbmRfSFRNTF9jaGFyYWN0ZXJfZW50aXR5X3JlZmVyZW5jZXMjUHJlZGVmaW5lZF9lbnRpdGllc19pbl9YTUwgV2lraXBlZGlhXG4gKi9cbmV4cG9ydHMuWE1MX0VOVElUSUVTID0gZnJlZXplKHthbXA6JyYnLCBhcG9zOlwiJ1wiLCBndDonPicsIGx0Oic8JywgcXVvdDonXCInfSlcblxuLyoqXG4gKiBBIG1hcCBvZiBjdXJyZW50bHkgMjQxIGVudGl0aWVzIHRoYXQgYXJlIGRldGVjdGVkIGluIGFuIEhUTUwgZG9jdW1lbnQuXG4gKiBUaGV5IGNvbnRhaW4gYWxsIGVudHJpZXMgZnJvbSBgWE1MX0VOVElUSUVTYC5cbiAqXG4gKiBAc2VlIFhNTF9FTlRJVElFU1xuICogQHNlZSBET01QYXJzZXIucGFyc2VGcm9tU3RyaW5nXG4gKiBAc2VlIERPTUltcGxlbWVudGF0aW9uLnByb3RvdHlwZS5jcmVhdGVIVE1MRG9jdW1lbnRcbiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jbmFtZWQtY2hhcmFjdGVyLXJlZmVyZW5jZXMgV0hBVFdHIEhUTUwoNSkgU3BlY1xuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIveG1sLWVudGl0eS1uYW1lcy8gVzNDIFhNTCBFbnRpdHkgTmFtZXNcbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw0L3NnbWwvZW50aXRpZXMuaHRtbCBXM0MgSFRNTDQvU0dNTFxuICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX1hNTF9hbmRfSFRNTF9jaGFyYWN0ZXJfZW50aXR5X3JlZmVyZW5jZXMjQ2hhcmFjdGVyX2VudGl0eV9yZWZlcmVuY2VzX2luX0hUTUwgV2lraXBlZGlhIChIVE1MKVxuICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX1hNTF9hbmRfSFRNTF9jaGFyYWN0ZXJfZW50aXR5X3JlZmVyZW5jZXMjRW50aXRpZXNfcmVwcmVzZW50aW5nX3NwZWNpYWxfY2hhcmFjdGVyc19pbl9YSFRNTCBXaWtwZWRpYSAoWEhUTUwpXG4gKi9cbmV4cG9ydHMuSFRNTF9FTlRJVElFUyA9IGZyZWV6ZSh7XG4gICAgICAgbHQ6ICc8JyxcbiAgICAgICBndDogJz4nLFxuICAgICAgIGFtcDogJyYnLFxuICAgICAgIHF1b3Q6ICdcIicsXG4gICAgICAgYXBvczogXCInXCIsXG4gICAgICAgQWdyYXZlOiBcIsOAXCIsXG4gICAgICAgQWFjdXRlOiBcIsOBXCIsXG4gICAgICAgQWNpcmM6IFwiw4JcIixcbiAgICAgICBBdGlsZGU6IFwiw4NcIixcbiAgICAgICBBdW1sOiBcIsOEXCIsXG4gICAgICAgQXJpbmc6IFwiw4VcIixcbiAgICAgICBBRWxpZzogXCLDhlwiLFxuICAgICAgIENjZWRpbDogXCLDh1wiLFxuICAgICAgIEVncmF2ZTogXCLDiFwiLFxuICAgICAgIEVhY3V0ZTogXCLDiVwiLFxuICAgICAgIEVjaXJjOiBcIsOKXCIsXG4gICAgICAgRXVtbDogXCLDi1wiLFxuICAgICAgIElncmF2ZTogXCLDjFwiLFxuICAgICAgIElhY3V0ZTogXCLDjVwiLFxuICAgICAgIEljaXJjOiBcIsOOXCIsXG4gICAgICAgSXVtbDogXCLDj1wiLFxuICAgICAgIEVUSDogXCLDkFwiLFxuICAgICAgIE50aWxkZTogXCLDkVwiLFxuICAgICAgIE9ncmF2ZTogXCLDklwiLFxuICAgICAgIE9hY3V0ZTogXCLDk1wiLFxuICAgICAgIE9jaXJjOiBcIsOUXCIsXG4gICAgICAgT3RpbGRlOiBcIsOVXCIsXG4gICAgICAgT3VtbDogXCLDllwiLFxuICAgICAgIE9zbGFzaDogXCLDmFwiLFxuICAgICAgIFVncmF2ZTogXCLDmVwiLFxuICAgICAgIFVhY3V0ZTogXCLDmlwiLFxuICAgICAgIFVjaXJjOiBcIsObXCIsXG4gICAgICAgVXVtbDogXCLDnFwiLFxuICAgICAgIFlhY3V0ZTogXCLDnVwiLFxuICAgICAgIFRIT1JOOiBcIsOeXCIsXG4gICAgICAgc3psaWc6IFwiw59cIixcbiAgICAgICBhZ3JhdmU6IFwiw6BcIixcbiAgICAgICBhYWN1dGU6IFwiw6FcIixcbiAgICAgICBhY2lyYzogXCLDolwiLFxuICAgICAgIGF0aWxkZTogXCLDo1wiLFxuICAgICAgIGF1bWw6IFwiw6RcIixcbiAgICAgICBhcmluZzogXCLDpVwiLFxuICAgICAgIGFlbGlnOiBcIsOmXCIsXG4gICAgICAgY2NlZGlsOiBcIsOnXCIsXG4gICAgICAgZWdyYXZlOiBcIsOoXCIsXG4gICAgICAgZWFjdXRlOiBcIsOpXCIsXG4gICAgICAgZWNpcmM6IFwiw6pcIixcbiAgICAgICBldW1sOiBcIsOrXCIsXG4gICAgICAgaWdyYXZlOiBcIsOsXCIsXG4gICAgICAgaWFjdXRlOiBcIsOtXCIsXG4gICAgICAgaWNpcmM6IFwiw65cIixcbiAgICAgICBpdW1sOiBcIsOvXCIsXG4gICAgICAgZXRoOiBcIsOwXCIsXG4gICAgICAgbnRpbGRlOiBcIsOxXCIsXG4gICAgICAgb2dyYXZlOiBcIsOyXCIsXG4gICAgICAgb2FjdXRlOiBcIsOzXCIsXG4gICAgICAgb2NpcmM6IFwiw7RcIixcbiAgICAgICBvdGlsZGU6IFwiw7VcIixcbiAgICAgICBvdW1sOiBcIsO2XCIsXG4gICAgICAgb3NsYXNoOiBcIsO4XCIsXG4gICAgICAgdWdyYXZlOiBcIsO5XCIsXG4gICAgICAgdWFjdXRlOiBcIsO6XCIsXG4gICAgICAgdWNpcmM6IFwiw7tcIixcbiAgICAgICB1dW1sOiBcIsO8XCIsXG4gICAgICAgeWFjdXRlOiBcIsO9XCIsXG4gICAgICAgdGhvcm46IFwiw75cIixcbiAgICAgICB5dW1sOiBcIsO/XCIsXG4gICAgICAgbmJzcDogXCJcXHUwMGEwXCIsXG4gICAgICAgaWV4Y2w6IFwiwqFcIixcbiAgICAgICBjZW50OiBcIsKiXCIsXG4gICAgICAgcG91bmQ6IFwiwqNcIixcbiAgICAgICBjdXJyZW46IFwiwqRcIixcbiAgICAgICB5ZW46IFwiwqVcIixcbiAgICAgICBicnZiYXI6IFwiwqZcIixcbiAgICAgICBzZWN0OiBcIsKnXCIsXG4gICAgICAgdW1sOiBcIsKoXCIsXG4gICAgICAgY29weTogXCLCqVwiLFxuICAgICAgIG9yZGY6IFwiwqpcIixcbiAgICAgICBsYXF1bzogXCLCq1wiLFxuICAgICAgIG5vdDogXCLCrFwiLFxuICAgICAgIHNoeTogXCLCrcKtXCIsXG4gICAgICAgcmVnOiBcIsKuXCIsXG4gICAgICAgbWFjcjogXCLCr1wiLFxuICAgICAgIGRlZzogXCLCsFwiLFxuICAgICAgIHBsdXNtbjogXCLCsVwiLFxuICAgICAgIHN1cDI6IFwiwrJcIixcbiAgICAgICBzdXAzOiBcIsKzXCIsXG4gICAgICAgYWN1dGU6IFwiwrRcIixcbiAgICAgICBtaWNybzogXCLCtVwiLFxuICAgICAgIHBhcmE6IFwiwrZcIixcbiAgICAgICBtaWRkb3Q6IFwiwrdcIixcbiAgICAgICBjZWRpbDogXCLCuFwiLFxuICAgICAgIHN1cDE6IFwiwrlcIixcbiAgICAgICBvcmRtOiBcIsK6XCIsXG4gICAgICAgcmFxdW86IFwiwrtcIixcbiAgICAgICBmcmFjMTQ6IFwiwrxcIixcbiAgICAgICBmcmFjMTI6IFwiwr1cIixcbiAgICAgICBmcmFjMzQ6IFwiwr5cIixcbiAgICAgICBpcXVlc3Q6IFwiwr9cIixcbiAgICAgICB0aW1lczogXCLDl1wiLFxuICAgICAgIGRpdmlkZTogXCLDt1wiLFxuICAgICAgIGZvcmFsbDogXCLiiIBcIixcbiAgICAgICBwYXJ0OiBcIuKIglwiLFxuICAgICAgIGV4aXN0OiBcIuKIg1wiLFxuICAgICAgIGVtcHR5OiBcIuKIhVwiLFxuICAgICAgIG5hYmxhOiBcIuKIh1wiLFxuICAgICAgIGlzaW46IFwi4oiIXCIsXG4gICAgICAgbm90aW46IFwi4oiJXCIsXG4gICAgICAgbmk6IFwi4oiLXCIsXG4gICAgICAgcHJvZDogXCLiiI9cIixcbiAgICAgICBzdW06IFwi4oiRXCIsXG4gICAgICAgbWludXM6IFwi4oiSXCIsXG4gICAgICAgbG93YXN0OiBcIuKIl1wiLFxuICAgICAgIHJhZGljOiBcIuKImlwiLFxuICAgICAgIHByb3A6IFwi4oidXCIsXG4gICAgICAgaW5maW46IFwi4oieXCIsXG4gICAgICAgYW5nOiBcIuKIoFwiLFxuICAgICAgIGFuZDogXCLiiKdcIixcbiAgICAgICBvcjogXCLiiKhcIixcbiAgICAgICBjYXA6IFwi4oipXCIsXG4gICAgICAgY3VwOiBcIuKIqlwiLFxuICAgICAgICdpbnQnOiBcIuKIq1wiLFxuICAgICAgIHRoZXJlNDogXCLiiLRcIixcbiAgICAgICBzaW06IFwi4oi8XCIsXG4gICAgICAgY29uZzogXCLiiYVcIixcbiAgICAgICBhc3ltcDogXCLiiYhcIixcbiAgICAgICBuZTogXCLiiaBcIixcbiAgICAgICBlcXVpdjogXCLiiaFcIixcbiAgICAgICBsZTogXCLiiaRcIixcbiAgICAgICBnZTogXCLiiaVcIixcbiAgICAgICBzdWI6IFwi4oqCXCIsXG4gICAgICAgc3VwOiBcIuKKg1wiLFxuICAgICAgIG5zdWI6IFwi4oqEXCIsXG4gICAgICAgc3ViZTogXCLiioZcIixcbiAgICAgICBzdXBlOiBcIuKKh1wiLFxuICAgICAgIG9wbHVzOiBcIuKKlVwiLFxuICAgICAgIG90aW1lczogXCLiipdcIixcbiAgICAgICBwZXJwOiBcIuKKpVwiLFxuICAgICAgIHNkb3Q6IFwi4ouFXCIsXG4gICAgICAgQWxwaGE6IFwizpFcIixcbiAgICAgICBCZXRhOiBcIs6SXCIsXG4gICAgICAgR2FtbWE6IFwizpNcIixcbiAgICAgICBEZWx0YTogXCLOlFwiLFxuICAgICAgIEVwc2lsb246IFwizpVcIixcbiAgICAgICBaZXRhOiBcIs6WXCIsXG4gICAgICAgRXRhOiBcIs6XXCIsXG4gICAgICAgVGhldGE6IFwizphcIixcbiAgICAgICBJb3RhOiBcIs6ZXCIsXG4gICAgICAgS2FwcGE6IFwizppcIixcbiAgICAgICBMYW1iZGE6IFwizptcIixcbiAgICAgICBNdTogXCLOnFwiLFxuICAgICAgIE51OiBcIs6dXCIsXG4gICAgICAgWGk6IFwizp5cIixcbiAgICAgICBPbWljcm9uOiBcIs6fXCIsXG4gICAgICAgUGk6IFwizqBcIixcbiAgICAgICBSaG86IFwizqFcIixcbiAgICAgICBTaWdtYTogXCLOo1wiLFxuICAgICAgIFRhdTogXCLOpFwiLFxuICAgICAgIFVwc2lsb246IFwizqVcIixcbiAgICAgICBQaGk6IFwizqZcIixcbiAgICAgICBDaGk6IFwizqdcIixcbiAgICAgICBQc2k6IFwizqhcIixcbiAgICAgICBPbWVnYTogXCLOqVwiLFxuICAgICAgIGFscGhhOiBcIs6xXCIsXG4gICAgICAgYmV0YTogXCLOslwiLFxuICAgICAgIGdhbW1hOiBcIs6zXCIsXG4gICAgICAgZGVsdGE6IFwizrRcIixcbiAgICAgICBlcHNpbG9uOiBcIs61XCIsXG4gICAgICAgemV0YTogXCLOtlwiLFxuICAgICAgIGV0YTogXCLOt1wiLFxuICAgICAgIHRoZXRhOiBcIs64XCIsXG4gICAgICAgaW90YTogXCLOuVwiLFxuICAgICAgIGthcHBhOiBcIs66XCIsXG4gICAgICAgbGFtYmRhOiBcIs67XCIsXG4gICAgICAgbXU6IFwizrxcIixcbiAgICAgICBudTogXCLOvVwiLFxuICAgICAgIHhpOiBcIs6+XCIsXG4gICAgICAgb21pY3JvbjogXCLOv1wiLFxuICAgICAgIHBpOiBcIs+AXCIsXG4gICAgICAgcmhvOiBcIs+BXCIsXG4gICAgICAgc2lnbWFmOiBcIs+CXCIsXG4gICAgICAgc2lnbWE6IFwiz4NcIixcbiAgICAgICB0YXU6IFwiz4RcIixcbiAgICAgICB1cHNpbG9uOiBcIs+FXCIsXG4gICAgICAgcGhpOiBcIs+GXCIsXG4gICAgICAgY2hpOiBcIs+HXCIsXG4gICAgICAgcHNpOiBcIs+IXCIsXG4gICAgICAgb21lZ2E6IFwiz4lcIixcbiAgICAgICB0aGV0YXN5bTogXCLPkVwiLFxuICAgICAgIHVwc2loOiBcIs+SXCIsXG4gICAgICAgcGl2OiBcIs+WXCIsXG4gICAgICAgT0VsaWc6IFwixZJcIixcbiAgICAgICBvZWxpZzogXCLFk1wiLFxuICAgICAgIFNjYXJvbjogXCLFoFwiLFxuICAgICAgIHNjYXJvbjogXCLFoVwiLFxuICAgICAgIFl1bWw6IFwixbhcIixcbiAgICAgICBmbm9mOiBcIsaSXCIsXG4gICAgICAgY2lyYzogXCLLhlwiLFxuICAgICAgIHRpbGRlOiBcIsucXCIsXG4gICAgICAgZW5zcDogXCLigIJcIixcbiAgICAgICBlbXNwOiBcIuKAg1wiLFxuICAgICAgIHRoaW5zcDogXCLigIlcIixcbiAgICAgICB6d25qOiBcIuKAjFwiLFxuICAgICAgIHp3ajogXCLigI1cIixcbiAgICAgICBscm06IFwi4oCOXCIsXG4gICAgICAgcmxtOiBcIuKAj1wiLFxuICAgICAgIG5kYXNoOiBcIuKAk1wiLFxuICAgICAgIG1kYXNoOiBcIuKAlFwiLFxuICAgICAgIGxzcXVvOiBcIuKAmFwiLFxuICAgICAgIHJzcXVvOiBcIuKAmVwiLFxuICAgICAgIHNicXVvOiBcIuKAmlwiLFxuICAgICAgIGxkcXVvOiBcIuKAnFwiLFxuICAgICAgIHJkcXVvOiBcIuKAnVwiLFxuICAgICAgIGJkcXVvOiBcIuKAnlwiLFxuICAgICAgIGRhZ2dlcjogXCLigKBcIixcbiAgICAgICBEYWdnZXI6IFwi4oChXCIsXG4gICAgICAgYnVsbDogXCLigKJcIixcbiAgICAgICBoZWxsaXA6IFwi4oCmXCIsXG4gICAgICAgcGVybWlsOiBcIuKAsFwiLFxuICAgICAgIHByaW1lOiBcIuKAslwiLFxuICAgICAgIFByaW1lOiBcIuKAs1wiLFxuICAgICAgIGxzYXF1bzogXCLigLlcIixcbiAgICAgICByc2FxdW86IFwi4oC6XCIsXG4gICAgICAgb2xpbmU6IFwi4oC+XCIsXG4gICAgICAgZXVybzogXCLigqxcIixcbiAgICAgICB0cmFkZTogXCLihKJcIixcbiAgICAgICBsYXJyOiBcIuKGkFwiLFxuICAgICAgIHVhcnI6IFwi4oaRXCIsXG4gICAgICAgcmFycjogXCLihpJcIixcbiAgICAgICBkYXJyOiBcIuKGk1wiLFxuICAgICAgIGhhcnI6IFwi4oaUXCIsXG4gICAgICAgY3JhcnI6IFwi4oa1XCIsXG4gICAgICAgbGNlaWw6IFwi4oyIXCIsXG4gICAgICAgcmNlaWw6IFwi4oyJXCIsXG4gICAgICAgbGZsb29yOiBcIuKMilwiLFxuICAgICAgIHJmbG9vcjogXCLijItcIixcbiAgICAgICBsb3o6IFwi4peKXCIsXG4gICAgICAgc3BhZGVzOiBcIuKZoFwiLFxuICAgICAgIGNsdWJzOiBcIuKZo1wiLFxuICAgICAgIGhlYXJ0czogXCLimaVcIixcbiAgICAgICBkaWFtczogXCLimaZcIlxufSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGBIVE1MX0VOVElUSUVTYCBpbnN0ZWFkXG4gKiBAc2VlIEhUTUxfRU5USVRJRVNcbiAqL1xuZXhwb3J0cy5lbnRpdHlNYXAgPSBleHBvcnRzLkhUTUxfRU5USVRJRVNcbiIsInZhciBkb20gPSByZXF1aXJlKCcuL2RvbScpXG5leHBvcnRzLkRPTUltcGxlbWVudGF0aW9uID0gZG9tLkRPTUltcGxlbWVudGF0aW9uXG5leHBvcnRzLlhNTFNlcmlhbGl6ZXIgPSBkb20uWE1MU2VyaWFsaXplclxuZXhwb3J0cy5ET01QYXJzZXIgPSByZXF1aXJlKCcuL2RvbS1wYXJzZXInKS5ET01QYXJzZXJcbiIsInZhciBOQU1FU1BBQ0UgPSByZXF1aXJlKFwiLi9jb252ZW50aW9uc1wiKS5OQU1FU1BBQ0U7XG5cbi8vWzRdICAgXHROYW1lU3RhcnRDaGFyXHQgICA6Oj0gICBcdFwiOlwiIHwgW0EtWl0gfCBcIl9cIiB8IFthLXpdIHwgWyN4QzAtI3hENl0gfCBbI3hEOC0jeEY2XSB8IFsjeEY4LSN4MkZGXSB8IFsjeDM3MC0jeDM3RF0gfCBbI3gzN0YtI3gxRkZGXSB8IFsjeDIwMEMtI3gyMDBEXSB8IFsjeDIwNzAtI3gyMThGXSB8IFsjeDJDMDAtI3gyRkVGXSB8IFsjeDMwMDEtI3hEN0ZGXSB8IFsjeEY5MDAtI3hGRENGXSB8IFsjeEZERjAtI3hGRkZEXSB8IFsjeDEwMDAwLSN4RUZGRkZdXG4vL1s0YV0gICBcdE5hbWVDaGFyXHQgICA6Oj0gICBcdE5hbWVTdGFydENoYXIgfCBcIi1cIiB8IFwiLlwiIHwgWzAtOV0gfCAjeEI3IHwgWyN4MDMwMC0jeDAzNkZdIHwgWyN4MjAzRi0jeDIwNDBdXG4vL1s1XSAgIFx0TmFtZVx0ICAgOjo9ICAgXHROYW1lU3RhcnRDaGFyIChOYW1lQ2hhcikqXG52YXIgbmFtZVN0YXJ0Q2hhciA9IC9bQS1aX2EtelxceEMwLVxceEQ2XFx4RDgtXFx4RjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRdLy8vXFx1MTAwMDAtXFx1RUZGRkZcbnZhciBuYW1lQ2hhciA9IG5ldyBSZWdFeHAoXCJbXFxcXC1cXFxcLjAtOVwiK25hbWVTdGFydENoYXIuc291cmNlLnNsaWNlKDEsLTEpK1wiXFxcXHUwMEI3XFxcXHUwMzAwLVxcXFx1MDM2RlxcXFx1MjAzRi1cXFxcdTIwNDBdXCIpO1xudmFyIHRhZ05hbWVQYXR0ZXJuID0gbmV3IFJlZ0V4cCgnXicrbmFtZVN0YXJ0Q2hhci5zb3VyY2UrbmFtZUNoYXIuc291cmNlKycqKD86XFw6JytuYW1lU3RhcnRDaGFyLnNvdXJjZStuYW1lQ2hhci5zb3VyY2UrJyopPyQnKTtcbi8vdmFyIHRhZ05hbWVQYXR0ZXJuID0gL15bYS16QS1aX11bXFx3XFwtXFwuXSooPzpcXDpbYS16QS1aX11bXFx3XFwtXFwuXSopPyQvXG4vL3ZhciBoYW5kbGVycyA9ICdyZXNvbHZlRW50aXR5LGdldEV4dGVybmFsU3Vic2V0LGNoYXJhY3RlcnMsZW5kRG9jdW1lbnQsZW5kRWxlbWVudCxlbmRQcmVmaXhNYXBwaW5nLGlnbm9yYWJsZVdoaXRlc3BhY2UscHJvY2Vzc2luZ0luc3RydWN0aW9uLHNldERvY3VtZW50TG9jYXRvcixza2lwcGVkRW50aXR5LHN0YXJ0RG9jdW1lbnQsc3RhcnRFbGVtZW50LHN0YXJ0UHJlZml4TWFwcGluZyxub3RhdGlvbkRlY2wsdW5wYXJzZWRFbnRpdHlEZWNsLGVycm9yLGZhdGFsRXJyb3Isd2FybmluZyxhdHRyaWJ1dGVEZWNsLGVsZW1lbnREZWNsLGV4dGVybmFsRW50aXR5RGVjbCxpbnRlcm5hbEVudGl0eURlY2wsY29tbWVudCxlbmRDREFUQSxlbmREVEQsZW5kRW50aXR5LHN0YXJ0Q0RBVEEsc3RhcnREVEQsc3RhcnRFbnRpdHknLnNwbGl0KCcsJylcblxuLy9TX1RBRyxcdFNfQVRUUixcdFNfRVEsXHRTX0FUVFJfTk9RVU9UX1ZBTFVFXG4vL1NfQVRUUl9TUEFDRSxcdFNfQVRUUl9FTkQsXHRTX1RBR19TUEFDRSwgU19UQUdfQ0xPU0VcbnZhciBTX1RBRyA9IDA7Ly90YWcgbmFtZSBvZmZlcnJpbmdcbnZhciBTX0FUVFIgPSAxOy8vYXR0ciBuYW1lIG9mZmVycmluZ1xudmFyIFNfQVRUUl9TUEFDRT0yOy8vYXR0ciBuYW1lIGVuZCBhbmQgc3BhY2Ugb2ZmZXJcbnZhciBTX0VRID0gMzsvLz1zcGFjZT9cbnZhciBTX0FUVFJfTk9RVU9UX1ZBTFVFID0gNDsvL2F0dHIgdmFsdWUobm8gcXVvdCB2YWx1ZSBvbmx5KVxudmFyIFNfQVRUUl9FTkQgPSA1Oy8vYXR0ciB2YWx1ZSBlbmQgYW5kIG5vIHNwYWNlKHF1b3QgZW5kKVxudmFyIFNfVEFHX1NQQUNFID0gNjsvLyhhdHRyIHZhbHVlIGVuZCB8fCB0YWcgZW5kICkgJiYgKHNwYWNlIG9mZmVyKVxudmFyIFNfVEFHX0NMT1NFID0gNzsvL2Nsb3NlZCBlbDxlbCAvPlxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXJyb3IgdGhhdCB3aWxsIG5vdCBiZSBjYXVnaHQgYnkgWE1MUmVhZGVyIGFrYSB0aGUgU0FYIHBhcnNlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHBhcmFtIHthbnk/fSBsb2NhdG9yIE9wdGlvbmFsLCBjYW4gcHJvdmlkZSBkZXRhaWxzIGFib3V0IHRoZSBsb2NhdGlvbiBpbiB0aGUgc291cmNlXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gUGFyc2VFcnJvcihtZXNzYWdlLCBsb2NhdG9yKSB7XG5cdHRoaXMubWVzc2FnZSA9IG1lc3NhZ2Vcblx0dGhpcy5sb2NhdG9yID0gbG9jYXRvclxuXHRpZihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgUGFyc2VFcnJvcik7XG59XG5QYXJzZUVycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuUGFyc2VFcnJvci5wcm90b3R5cGUubmFtZSA9IFBhcnNlRXJyb3IubmFtZVxuXG5mdW5jdGlvbiBYTUxSZWFkZXIoKXtcblxufVxuXG5YTUxSZWFkZXIucHJvdG90eXBlID0ge1xuXHRwYXJzZTpmdW5jdGlvbihzb3VyY2UsZGVmYXVsdE5TTWFwLGVudGl0eU1hcCl7XG5cdFx0dmFyIGRvbUJ1aWxkZXIgPSB0aGlzLmRvbUJ1aWxkZXI7XG5cdFx0ZG9tQnVpbGRlci5zdGFydERvY3VtZW50KCk7XG5cdFx0X2NvcHkoZGVmYXVsdE5TTWFwICxkZWZhdWx0TlNNYXAgPSB7fSlcblx0XHRwYXJzZShzb3VyY2UsZGVmYXVsdE5TTWFwLGVudGl0eU1hcCxcblx0XHRcdFx0ZG9tQnVpbGRlcix0aGlzLmVycm9ySGFuZGxlcik7XG5cdFx0ZG9tQnVpbGRlci5lbmREb2N1bWVudCgpO1xuXHR9XG59XG5mdW5jdGlvbiBwYXJzZShzb3VyY2UsZGVmYXVsdE5TTWFwQ29weSxlbnRpdHlNYXAsZG9tQnVpbGRlcixlcnJvckhhbmRsZXIpe1xuXHRmdW5jdGlvbiBmaXhlZEZyb21DaGFyQ29kZShjb2RlKSB7XG5cdFx0Ly8gU3RyaW5nLnByb3RvdHlwZS5mcm9tQ2hhckNvZGUgZG9lcyBub3Qgc3VwcG9ydHNcblx0XHQvLyA+IDIgYnl0ZXMgdW5pY29kZSBjaGFycyBkaXJlY3RseVxuXHRcdGlmIChjb2RlID4gMHhmZmZmKSB7XG5cdFx0XHRjb2RlIC09IDB4MTAwMDA7XG5cdFx0XHR2YXIgc3Vycm9nYXRlMSA9IDB4ZDgwMCArIChjb2RlID4+IDEwKVxuXHRcdFx0XHQsIHN1cnJvZ2F0ZTIgPSAweGRjMDAgKyAoY29kZSAmIDB4M2ZmKTtcblxuXHRcdFx0cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoc3Vycm9nYXRlMSwgc3Vycm9nYXRlMik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuXHRcdH1cblx0fVxuXHRmdW5jdGlvbiBlbnRpdHlSZXBsYWNlcihhKXtcblx0XHR2YXIgayA9IGEuc2xpY2UoMSwtMSk7XG5cdFx0aWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVudGl0eU1hcCwgaykpIHtcblx0XHRcdHJldHVybiBlbnRpdHlNYXBba107XG5cdFx0fWVsc2UgaWYoay5jaGFyQXQoMCkgPT09ICcjJyl7XG5cdFx0XHRyZXR1cm4gZml4ZWRGcm9tQ2hhckNvZGUocGFyc2VJbnQoay5zdWJzdHIoMSkucmVwbGFjZSgneCcsJzB4JykpKVxuXHRcdH1lbHNle1xuXHRcdFx0ZXJyb3JIYW5kbGVyLmVycm9yKCdlbnRpdHkgbm90IGZvdW5kOicrYSk7XG5cdFx0XHRyZXR1cm4gYTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gYXBwZW5kVGV4dChlbmQpey8vaGFzIHNvbWUgYnVnc1xuXHRcdGlmKGVuZD5zdGFydCl7XG5cdFx0XHR2YXIgeHQgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0LGVuZCkucmVwbGFjZSgvJiM/XFx3KzsvZyxlbnRpdHlSZXBsYWNlcik7XG5cdFx0XHRsb2NhdG9yJiZwb3NpdGlvbihzdGFydCk7XG5cdFx0XHRkb21CdWlsZGVyLmNoYXJhY3RlcnMoeHQsMCxlbmQtc3RhcnQpO1xuXHRcdFx0c3RhcnQgPSBlbmRcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gcG9zaXRpb24ocCxtKXtcblx0XHR3aGlsZShwPj1saW5lRW5kICYmIChtID0gbGluZVBhdHRlcm4uZXhlYyhzb3VyY2UpKSl7XG5cdFx0XHRsaW5lU3RhcnQgPSBtLmluZGV4O1xuXHRcdFx0bGluZUVuZCA9IGxpbmVTdGFydCArIG1bMF0ubGVuZ3RoO1xuXHRcdFx0bG9jYXRvci5saW5lTnVtYmVyKys7XG5cdFx0XHQvL2NvbnNvbGUubG9nKCdsaW5lKys6Jyxsb2NhdG9yLHN0YXJ0UG9zLGVuZFBvcylcblx0XHR9XG5cdFx0bG9jYXRvci5jb2x1bW5OdW1iZXIgPSBwLWxpbmVTdGFydCsxO1xuXHR9XG5cdHZhciBsaW5lU3RhcnQgPSAwO1xuXHR2YXIgbGluZUVuZCA9IDA7XG5cdHZhciBsaW5lUGF0dGVybiA9IC8uKig/Olxcclxcbj98XFxuKXwuKiQvZ1xuXHR2YXIgbG9jYXRvciA9IGRvbUJ1aWxkZXIubG9jYXRvcjtcblxuXHR2YXIgcGFyc2VTdGFjayA9IFt7Y3VycmVudE5TTWFwOmRlZmF1bHROU01hcENvcHl9XVxuXHR2YXIgY2xvc2VNYXAgPSB7fTtcblx0dmFyIHN0YXJ0ID0gMDtcblx0d2hpbGUodHJ1ZSl7XG5cdFx0dHJ5e1xuXHRcdFx0dmFyIHRhZ1N0YXJ0ID0gc291cmNlLmluZGV4T2YoJzwnLHN0YXJ0KTtcblx0XHRcdGlmKHRhZ1N0YXJ0PDApe1xuXHRcdFx0XHRpZighc291cmNlLnN1YnN0cihzdGFydCkubWF0Y2goL15cXHMqJC8pKXtcblx0XHRcdFx0XHR2YXIgZG9jID0gZG9tQnVpbGRlci5kb2M7XG5cdCAgICBcdFx0XHR2YXIgdGV4dCA9IGRvYy5jcmVhdGVUZXh0Tm9kZShzb3VyY2Uuc3Vic3RyKHN0YXJ0KSk7XG5cdCAgICBcdFx0XHRkb2MuYXBwZW5kQ2hpbGQodGV4dCk7XG5cdCAgICBcdFx0XHRkb21CdWlsZGVyLmN1cnJlbnRFbGVtZW50ID0gdGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZih0YWdTdGFydD5zdGFydCl7XG5cdFx0XHRcdGFwcGVuZFRleHQodGFnU3RhcnQpO1xuXHRcdFx0fVxuXHRcdFx0c3dpdGNoKHNvdXJjZS5jaGFyQXQodGFnU3RhcnQrMSkpe1xuXHRcdFx0Y2FzZSAnLyc6XG5cdFx0XHRcdHZhciBlbmQgPSBzb3VyY2UuaW5kZXhPZignPicsdGFnU3RhcnQrMyk7XG5cdFx0XHRcdHZhciB0YWdOYW1lID0gc291cmNlLnN1YnN0cmluZyh0YWdTdGFydCArIDIsIGVuZCkucmVwbGFjZSgvWyBcXHRcXG5cXHJdKyQvZywgJycpO1xuXHRcdFx0XHR2YXIgY29uZmlnID0gcGFyc2VTdGFjay5wb3AoKTtcblx0XHRcdFx0aWYoZW5kPDApe1xuXG5cdCAgICAgICAgXHRcdHRhZ05hbWUgPSBzb3VyY2Uuc3Vic3RyaW5nKHRhZ1N0YXJ0KzIpLnJlcGxhY2UoL1tcXHM8XS4qLywnJyk7XG5cdCAgICAgICAgXHRcdGVycm9ySGFuZGxlci5lcnJvcihcImVuZCB0YWcgbmFtZTogXCIrdGFnTmFtZSsnIGlzIG5vdCBjb21wbGV0ZTonK2NvbmZpZy50YWdOYW1lKTtcblx0ICAgICAgICBcdFx0ZW5kID0gdGFnU3RhcnQrMSt0YWdOYW1lLmxlbmd0aDtcblx0ICAgICAgICBcdH1lbHNlIGlmKHRhZ05hbWUubWF0Y2goL1xcczwvKSl7XG5cdCAgICAgICAgXHRcdHRhZ05hbWUgPSB0YWdOYW1lLnJlcGxhY2UoL1tcXHM8XS4qLywnJyk7XG5cdCAgICAgICAgXHRcdGVycm9ySGFuZGxlci5lcnJvcihcImVuZCB0YWcgbmFtZTogXCIrdGFnTmFtZSsnIG1heWJlIG5vdCBjb21wbGV0ZScpO1xuXHQgICAgICAgIFx0XHRlbmQgPSB0YWdTdGFydCsxK3RhZ05hbWUubGVuZ3RoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciBsb2NhbE5TTWFwID0gY29uZmlnLmxvY2FsTlNNYXA7XG5cdFx0XHRcdHZhciBlbmRNYXRjaCA9IGNvbmZpZy50YWdOYW1lID09IHRhZ05hbWU7XG5cdFx0XHRcdHZhciBlbmRJZ25vcmVDYXNlTWFjaCA9IGVuZE1hdGNoIHx8IGNvbmZpZy50YWdOYW1lJiZjb25maWcudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IHRhZ05hbWUudG9Mb3dlckNhc2UoKVxuXHRcdCAgICAgICAgaWYoZW5kSWdub3JlQ2FzZU1hY2gpe1xuXHRcdCAgICAgICAgXHRkb21CdWlsZGVyLmVuZEVsZW1lbnQoY29uZmlnLnVyaSxjb25maWcubG9jYWxOYW1lLHRhZ05hbWUpO1xuXHRcdFx0XHRcdGlmKGxvY2FsTlNNYXApe1xuXHRcdFx0XHRcdFx0Zm9yKHZhciBwcmVmaXggaW4gbG9jYWxOU01hcCl7XG5cdFx0XHRcdFx0XHRcdGRvbUJ1aWxkZXIuZW5kUHJlZml4TWFwcGluZyhwcmVmaXgpIDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoIWVuZE1hdGNoKXtcblx0XHQgICAgICAgICAgICBcdGVycm9ySGFuZGxlci5mYXRhbEVycm9yKFwiZW5kIHRhZyBuYW1lOiBcIit0YWdOYW1lKycgaXMgbm90IG1hdGNoIHRoZSBjdXJyZW50IHN0YXJ0IHRhZ05hbWU6Jytjb25maWcudGFnTmFtZSApOyAvLyBObyBrbm93biB0ZXN0IGNhc2Vcblx0XHRcdFx0XHR9XG5cdFx0ICAgICAgICB9ZWxzZXtcblx0XHQgICAgICAgIFx0cGFyc2VTdGFjay5wdXNoKGNvbmZpZylcblx0XHQgICAgICAgIH1cblxuXHRcdFx0XHRlbmQrKztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdC8vIGVuZCBlbG1lbnRcblx0XHRcdGNhc2UgJz8nOi8vIDw/Li4uPz5cblx0XHRcdFx0bG9jYXRvciYmcG9zaXRpb24odGFnU3RhcnQpO1xuXHRcdFx0XHRlbmQgPSBwYXJzZUluc3RydWN0aW9uKHNvdXJjZSx0YWdTdGFydCxkb21CdWlsZGVyKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICchJzovLyA8IWRvY3R5cGUsPCFbQ0RBVEEsPCEtLVxuXHRcdFx0XHRsb2NhdG9yJiZwb3NpdGlvbih0YWdTdGFydCk7XG5cdFx0XHRcdGVuZCA9IHBhcnNlRENDKHNvdXJjZSx0YWdTdGFydCxkb21CdWlsZGVyLGVycm9ySGFuZGxlcik7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0bG9jYXRvciYmcG9zaXRpb24odGFnU3RhcnQpO1xuXHRcdFx0XHR2YXIgZWwgPSBuZXcgRWxlbWVudEF0dHJpYnV0ZXMoKTtcblx0XHRcdFx0dmFyIGN1cnJlbnROU01hcCA9IHBhcnNlU3RhY2tbcGFyc2VTdGFjay5sZW5ndGgtMV0uY3VycmVudE5TTWFwO1xuXHRcdFx0XHQvL2VsU3RhcnRFbmRcblx0XHRcdFx0dmFyIGVuZCA9IHBhcnNlRWxlbWVudFN0YXJ0UGFydChzb3VyY2UsdGFnU3RhcnQsZWwsY3VycmVudE5TTWFwLGVudGl0eVJlcGxhY2VyLGVycm9ySGFuZGxlcik7XG5cdFx0XHRcdHZhciBsZW4gPSBlbC5sZW5ndGg7XG5cblxuXHRcdFx0XHRpZighZWwuY2xvc2VkICYmIGZpeFNlbGZDbG9zZWQoc291cmNlLGVuZCxlbC50YWdOYW1lLGNsb3NlTWFwKSl7XG5cdFx0XHRcdFx0ZWwuY2xvc2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRpZighZW50aXR5TWFwLm5ic3Ape1xuXHRcdFx0XHRcdFx0ZXJyb3JIYW5kbGVyLndhcm5pbmcoJ3VuY2xvc2VkIHhtbCBhdHRyaWJ1dGUnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYobG9jYXRvciAmJiBsZW4pe1xuXHRcdFx0XHRcdHZhciBsb2NhdG9yMiA9IGNvcHlMb2NhdG9yKGxvY2F0b3Ise30pO1xuXHRcdFx0XHRcdC8vdHJ5ey8vYXR0cmlidXRlIHBvc2l0aW9uIGZpeGVkXG5cdFx0XHRcdFx0Zm9yKHZhciBpID0gMDtpPGxlbjtpKyspe1xuXHRcdFx0XHRcdFx0dmFyIGEgPSBlbFtpXTtcblx0XHRcdFx0XHRcdHBvc2l0aW9uKGEub2Zmc2V0KTtcblx0XHRcdFx0XHRcdGEubG9jYXRvciA9IGNvcHlMb2NhdG9yKGxvY2F0b3Ise30pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb21CdWlsZGVyLmxvY2F0b3IgPSBsb2NhdG9yMlxuXHRcdFx0XHRcdGlmKGFwcGVuZEVsZW1lbnQoZWwsZG9tQnVpbGRlcixjdXJyZW50TlNNYXApKXtcblx0XHRcdFx0XHRcdHBhcnNlU3RhY2sucHVzaChlbClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9tQnVpbGRlci5sb2NhdG9yID0gbG9jYXRvcjtcblx0XHRcdFx0fWVsc2V7XG5cdFx0XHRcdFx0aWYoYXBwZW5kRWxlbWVudChlbCxkb21CdWlsZGVyLGN1cnJlbnROU01hcCkpe1xuXHRcdFx0XHRcdFx0cGFyc2VTdGFjay5wdXNoKGVsKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChOQU1FU1BBQ0UuaXNIVE1MKGVsLnVyaSkgJiYgIWVsLmNsb3NlZCkge1xuXHRcdFx0XHRcdGVuZCA9IHBhcnNlSHRtbFNwZWNpYWxDb250ZW50KHNvdXJjZSxlbmQsZWwudGFnTmFtZSxlbnRpdHlSZXBsYWNlcixkb21CdWlsZGVyKVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGVuZCsrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fWNhdGNoKGUpe1xuXHRcdFx0aWYgKGUgaW5zdGFuY2VvZiBQYXJzZUVycm9yKSB7XG5cdFx0XHRcdHRocm93IGU7XG5cdFx0XHR9XG5cdFx0XHRlcnJvckhhbmRsZXIuZXJyb3IoJ2VsZW1lbnQgcGFyc2UgZXJyb3I6ICcrZSlcblx0XHRcdGVuZCA9IC0xO1xuXHRcdH1cblx0XHRpZihlbmQ+c3RhcnQpe1xuXHRcdFx0c3RhcnQgPSBlbmQ7XG5cdFx0fWVsc2V7XG5cdFx0XHQvL1RPRE86IOi/memHjOacieWPr+iDvXNheOWbnumAgO+8jOacieS9jee9rumUmeivr+mjjumZqVxuXHRcdFx0YXBwZW5kVGV4dChNYXRoLm1heCh0YWdTdGFydCxzdGFydCkrMSk7XG5cdFx0fVxuXHR9XG59XG5mdW5jdGlvbiBjb3B5TG9jYXRvcihmLHQpe1xuXHR0LmxpbmVOdW1iZXIgPSBmLmxpbmVOdW1iZXI7XG5cdHQuY29sdW1uTnVtYmVyID0gZi5jb2x1bW5OdW1iZXI7XG5cdHJldHVybiB0O1xufVxuXG4vKipcbiAqIEBzZWUgI2FwcGVuZEVsZW1lbnQoc291cmNlLGVsU3RhcnRFbmQsZWwsc2VsZkNsb3NlZCxlbnRpdHlSZXBsYWNlcixkb21CdWlsZGVyLHBhcnNlU3RhY2spO1xuICogQHJldHVybiBlbmQgb2YgdGhlIGVsZW1lbnRTdGFydFBhcnQoZW5kIG9mIGVsZW1lbnRFbmRQYXJ0IGZvciBzZWxmQ2xvc2VkIGVsKVxuICovXG5mdW5jdGlvbiBwYXJzZUVsZW1lbnRTdGFydFBhcnQoc291cmNlLHN0YXJ0LGVsLGN1cnJlbnROU01hcCxlbnRpdHlSZXBsYWNlcixlcnJvckhhbmRsZXIpe1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcW5hbWVcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydEluZGV4XG5cdCAqL1xuXHRmdW5jdGlvbiBhZGRBdHRyaWJ1dGUocW5hbWUsIHZhbHVlLCBzdGFydEluZGV4KSB7XG5cdFx0aWYgKGVsLmF0dHJpYnV0ZU5hbWVzLmhhc093blByb3BlcnR5KHFuYW1lKSkge1xuXHRcdFx0ZXJyb3JIYW5kbGVyLmZhdGFsRXJyb3IoJ0F0dHJpYnV0ZSAnICsgcW5hbWUgKyAnIHJlZGVmaW5lZCcpXG5cdFx0fVxuXHRcdGVsLmFkZFZhbHVlKFxuXHRcdFx0cW5hbWUsXG5cdFx0XHQvLyBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi94bWwvI0FWTm9ybWFsaXplXG5cdFx0XHQvLyBzaW5jZSB0aGUgeG1sZG9tIHNheCBwYXJzZXIgZG9lcyBub3QgXCJpbnRlcnByZXRcIiBEVEQgdGhlIGZvbGxvd2luZyBpcyBub3QgaW1wbGVtZW50ZWQ6XG5cdFx0XHQvLyAtIHJlY3Vyc2l2ZSByZXBsYWNlbWVudCBvZiAoRFREKSBlbnRpdHkgcmVmZXJlbmNlc1xuXHRcdFx0Ly8gLSB0cmltbWluZyBhbmQgY29sbGFwc2luZyBtdWx0aXBsZSBzcGFjZXMgaW50byBhIHNpbmdsZSBvbmUgZm9yIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IG9mIHR5cGUgQ0RBVEFcblx0XHRcdHZhbHVlLnJlcGxhY2UoL1tcXHRcXG5cXHJdL2csICcgJykucmVwbGFjZSgvJiM/XFx3KzsvZywgZW50aXR5UmVwbGFjZXIpLFxuXHRcdFx0c3RhcnRJbmRleFxuXHRcdClcblx0fVxuXHR2YXIgYXR0ck5hbWU7XG5cdHZhciB2YWx1ZTtcblx0dmFyIHAgPSArK3N0YXJ0O1xuXHR2YXIgcyA9IFNfVEFHOy8vc3RhdHVzXG5cdHdoaWxlKHRydWUpe1xuXHRcdHZhciBjID0gc291cmNlLmNoYXJBdChwKTtcblx0XHRzd2l0Y2goYyl7XG5cdFx0Y2FzZSAnPSc6XG5cdFx0XHRpZihzID09PSBTX0FUVFIpey8vYXR0ck5hbWVcblx0XHRcdFx0YXR0ck5hbWUgPSBzb3VyY2Uuc2xpY2Uoc3RhcnQscCk7XG5cdFx0XHRcdHMgPSBTX0VRO1xuXHRcdFx0fWVsc2UgaWYocyA9PT0gU19BVFRSX1NQQUNFKXtcblx0XHRcdFx0cyA9IFNfRVE7XG5cdFx0XHR9ZWxzZXtcblx0XHRcdFx0Ly9mYXRhbEVycm9yOiBlcXVhbCBtdXN0IGFmdGVyIGF0dHJOYW1lIG9yIHNwYWNlIGFmdGVyIGF0dHJOYW1lXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignYXR0cmlidXRlIGVxdWFsIG11c3QgYWZ0ZXIgYXR0ck5hbWUnKTsgLy8gTm8ga25vd24gdGVzdCBjYXNlXG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdcXCcnOlxuXHRcdGNhc2UgJ1wiJzpcblx0XHRcdGlmKHMgPT09IFNfRVEgfHwgcyA9PT0gU19BVFRSIC8vfHwgcyA9PSBTX0FUVFJfU1BBQ0Vcblx0XHRcdFx0KXsvL2VxdWFsXG5cdFx0XHRcdGlmKHMgPT09IFNfQVRUUil7XG5cdFx0XHRcdFx0ZXJyb3JIYW5kbGVyLndhcm5pbmcoJ2F0dHJpYnV0ZSB2YWx1ZSBtdXN0IGFmdGVyIFwiPVwiJylcblx0XHRcdFx0XHRhdHRyTmFtZSA9IHNvdXJjZS5zbGljZShzdGFydCxwKVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0YXJ0ID0gcCsxO1xuXHRcdFx0XHRwID0gc291cmNlLmluZGV4T2YoYyxzdGFydClcblx0XHRcdFx0aWYocD4wKXtcblx0XHRcdFx0XHR2YWx1ZSA9IHNvdXJjZS5zbGljZShzdGFydCwgcCk7XG5cdFx0XHRcdFx0YWRkQXR0cmlidXRlKGF0dHJOYW1lLCB2YWx1ZSwgc3RhcnQtMSk7XG5cdFx0XHRcdFx0cyA9IFNfQVRUUl9FTkQ7XG5cdFx0XHRcdH1lbHNle1xuXHRcdFx0XHRcdC8vZmF0YWxFcnJvcjogbm8gZW5kIHF1b3QgbWF0Y2hcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2F0dHJpYnV0ZSB2YWx1ZSBubyBlbmQgXFwnJytjKydcXCcgbWF0Y2gnKTtcblx0XHRcdFx0fVxuXHRcdFx0fWVsc2UgaWYocyA9PSBTX0FUVFJfTk9RVU9UX1ZBTFVFKXtcblx0XHRcdFx0dmFsdWUgPSBzb3VyY2Uuc2xpY2Uoc3RhcnQsIHApO1xuXHRcdFx0XHRhZGRBdHRyaWJ1dGUoYXR0ck5hbWUsIHZhbHVlLCBzdGFydCk7XG5cdFx0XHRcdGVycm9ySGFuZGxlci53YXJuaW5nKCdhdHRyaWJ1dGUgXCInK2F0dHJOYW1lKydcIiBtaXNzZWQgc3RhcnQgcXVvdCgnK2MrJykhIScpO1xuXHRcdFx0XHRzdGFydCA9IHArMTtcblx0XHRcdFx0cyA9IFNfQVRUUl9FTkRcblx0XHRcdH1lbHNle1xuXHRcdFx0XHQvL2ZhdGFsRXJyb3I6IG5vIGVxdWFsIGJlZm9yZVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2F0dHJpYnV0ZSB2YWx1ZSBtdXN0IGFmdGVyIFwiPVwiJyk7IC8vIE5vIGtub3duIHRlc3QgY2FzZVxuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnLyc6XG5cdFx0XHRzd2l0Y2gocyl7XG5cdFx0XHRjYXNlIFNfVEFHOlxuXHRcdFx0XHRlbC5zZXRUYWdOYW1lKHNvdXJjZS5zbGljZShzdGFydCxwKSk7XG5cdFx0XHRjYXNlIFNfQVRUUl9FTkQ6XG5cdFx0XHRjYXNlIFNfVEFHX1NQQUNFOlxuXHRcdFx0Y2FzZSBTX1RBR19DTE9TRTpcblx0XHRcdFx0cyA9U19UQUdfQ0xPU0U7XG5cdFx0XHRcdGVsLmNsb3NlZCA9IHRydWU7XG5cdFx0XHRjYXNlIFNfQVRUUl9OT1FVT1RfVkFMVUU6XG5cdFx0XHRjYXNlIFNfQVRUUjpcblx0XHRcdGNhc2UgU19BVFRSX1NQQUNFOlxuXHRcdFx0XHRicmVhaztcblx0XHRcdC8vY2FzZSBTX0VROlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiYXR0cmlidXRlIGludmFsaWQgY2xvc2UgY2hhcignLycpXCIpIC8vIE5vIGtub3duIHRlc3QgY2FzZVxuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnJzovL2VuZCBkb2N1bWVudFxuXHRcdFx0ZXJyb3JIYW5kbGVyLmVycm9yKCd1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCcpO1xuXHRcdFx0aWYocyA9PSBTX1RBRyl7XG5cdFx0XHRcdGVsLnNldFRhZ05hbWUoc291cmNlLnNsaWNlKHN0YXJ0LHApKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwO1xuXHRcdGNhc2UgJz4nOlxuXHRcdFx0c3dpdGNoKHMpe1xuXHRcdFx0Y2FzZSBTX1RBRzpcblx0XHRcdFx0ZWwuc2V0VGFnTmFtZShzb3VyY2Uuc2xpY2Uoc3RhcnQscCkpO1xuXHRcdFx0Y2FzZSBTX0FUVFJfRU5EOlxuXHRcdFx0Y2FzZSBTX1RBR19TUEFDRTpcblx0XHRcdGNhc2UgU19UQUdfQ0xPU0U6XG5cdFx0XHRcdGJyZWFrOy8vbm9ybWFsXG5cdFx0XHRjYXNlIFNfQVRUUl9OT1FVT1RfVkFMVUU6Ly9Db21wYXRpYmxlIHN0YXRlXG5cdFx0XHRjYXNlIFNfQVRUUjpcblx0XHRcdFx0dmFsdWUgPSBzb3VyY2Uuc2xpY2Uoc3RhcnQscCk7XG5cdFx0XHRcdGlmKHZhbHVlLnNsaWNlKC0xKSA9PT0gJy8nKXtcblx0XHRcdFx0XHRlbC5jbG9zZWQgID0gdHJ1ZTtcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsLTEpXG5cdFx0XHRcdH1cblx0XHRcdGNhc2UgU19BVFRSX1NQQUNFOlxuXHRcdFx0XHRpZihzID09PSBTX0FUVFJfU1BBQ0Upe1xuXHRcdFx0XHRcdHZhbHVlID0gYXR0ck5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYocyA9PSBTX0FUVFJfTk9RVU9UX1ZBTFVFKXtcblx0XHRcdFx0XHRlcnJvckhhbmRsZXIud2FybmluZygnYXR0cmlidXRlIFwiJyt2YWx1ZSsnXCIgbWlzc2VkIHF1b3QoXCIpIScpO1xuXHRcdFx0XHRcdGFkZEF0dHJpYnV0ZShhdHRyTmFtZSwgdmFsdWUsIHN0YXJ0KVxuXHRcdFx0XHR9ZWxzZXtcblx0XHRcdFx0XHRpZighTkFNRVNQQUNFLmlzSFRNTChjdXJyZW50TlNNYXBbJyddKSB8fCAhdmFsdWUubWF0Y2goL14oPzpkaXNhYmxlZHxjaGVja2VkfHNlbGVjdGVkKSQvaSkpe1xuXHRcdFx0XHRcdFx0ZXJyb3JIYW5kbGVyLndhcm5pbmcoJ2F0dHJpYnV0ZSBcIicrdmFsdWUrJ1wiIG1pc3NlZCB2YWx1ZSEhIFwiJyt2YWx1ZSsnXCIgaW5zdGVhZCEhJylcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YWRkQXR0cmlidXRlKHZhbHVlLCB2YWx1ZSwgc3RhcnQpXG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFNfRVE6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignYXR0cmlidXRlIHZhbHVlIG1pc3NlZCEhJyk7XG5cdFx0XHR9XG4vL1x0XHRcdGNvbnNvbGUubG9nKHRhZ05hbWUsdGFnTmFtZVBhdHRlcm4sdGFnTmFtZVBhdHRlcm4udGVzdCh0YWdOYW1lKSlcblx0XHRcdHJldHVybiBwO1xuXHRcdC8qeG1sIHNwYWNlICdcXHgyMCcgfCAjeDkgfCAjeEQgfCAjeEE7ICovXG5cdFx0Y2FzZSAnXFx1MDA4MCc6XG5cdFx0XHRjID0gJyAnO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRpZihjPD0gJyAnKXsvL3NwYWNlXG5cdFx0XHRcdHN3aXRjaChzKXtcblx0XHRcdFx0Y2FzZSBTX1RBRzpcblx0XHRcdFx0XHRlbC5zZXRUYWdOYW1lKHNvdXJjZS5zbGljZShzdGFydCxwKSk7Ly90YWdOYW1lXG5cdFx0XHRcdFx0cyA9IFNfVEFHX1NQQUNFO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFNfQVRUUjpcblx0XHRcdFx0XHRhdHRyTmFtZSA9IHNvdXJjZS5zbGljZShzdGFydCxwKVxuXHRcdFx0XHRcdHMgPSBTX0FUVFJfU1BBQ0U7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgU19BVFRSX05PUVVPVF9WQUxVRTpcblx0XHRcdFx0XHR2YXIgdmFsdWUgPSBzb3VyY2Uuc2xpY2Uoc3RhcnQsIHApO1xuXHRcdFx0XHRcdGVycm9ySGFuZGxlci53YXJuaW5nKCdhdHRyaWJ1dGUgXCInK3ZhbHVlKydcIiBtaXNzZWQgcXVvdChcIikhIScpO1xuXHRcdFx0XHRcdGFkZEF0dHJpYnV0ZShhdHRyTmFtZSwgdmFsdWUsIHN0YXJ0KVxuXHRcdFx0XHRjYXNlIFNfQVRUUl9FTkQ6XG5cdFx0XHRcdFx0cyA9IFNfVEFHX1NQQUNFO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHQvL2Nhc2UgU19UQUdfU1BBQ0U6XG5cdFx0XHRcdC8vY2FzZSBTX0VROlxuXHRcdFx0XHQvL2Nhc2UgU19BVFRSX1NQQUNFOlxuXHRcdFx0XHQvL1x0dm9pZCgpO2JyZWFrO1xuXHRcdFx0XHQvL2Nhc2UgU19UQUdfQ0xPU0U6XG5cdFx0XHRcdFx0Ly9pZ25vcmUgd2FybmluZ1xuXHRcdFx0XHR9XG5cdFx0XHR9ZWxzZXsvL25vdCBzcGFjZVxuLy9TX1RBRyxcdFNfQVRUUixcdFNfRVEsXHRTX0FUVFJfTk9RVU9UX1ZBTFVFXG4vL1NfQVRUUl9TUEFDRSxcdFNfQVRUUl9FTkQsXHRTX1RBR19TUEFDRSwgU19UQUdfQ0xPU0Vcblx0XHRcdFx0c3dpdGNoKHMpe1xuXHRcdFx0XHQvL2Nhc2UgU19UQUc6dm9pZCgpO2JyZWFrO1xuXHRcdFx0XHQvL2Nhc2UgU19BVFRSOnZvaWQoKTticmVhaztcblx0XHRcdFx0Ly9jYXNlIFNfQVRUUl9OT1FVT1RfVkFMVUU6dm9pZCgpO2JyZWFrO1xuXHRcdFx0XHRjYXNlIFNfQVRUUl9TUEFDRTpcblx0XHRcdFx0XHR2YXIgdGFnTmFtZSA9ICBlbC50YWdOYW1lO1xuXHRcdFx0XHRcdGlmICghTkFNRVNQQUNFLmlzSFRNTChjdXJyZW50TlNNYXBbJyddKSB8fCAhYXR0ck5hbWUubWF0Y2goL14oPzpkaXNhYmxlZHxjaGVja2VkfHNlbGVjdGVkKSQvaSkpIHtcblx0XHRcdFx0XHRcdGVycm9ySGFuZGxlci53YXJuaW5nKCdhdHRyaWJ1dGUgXCInK2F0dHJOYW1lKydcIiBtaXNzZWQgdmFsdWUhISBcIicrYXR0ck5hbWUrJ1wiIGluc3RlYWQyISEnKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhZGRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJOYW1lLCBzdGFydCk7XG5cdFx0XHRcdFx0c3RhcnQgPSBwO1xuXHRcdFx0XHRcdHMgPSBTX0FUVFI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgU19BVFRSX0VORDpcblx0XHRcdFx0XHRlcnJvckhhbmRsZXIud2FybmluZygnYXR0cmlidXRlIHNwYWNlIGlzIHJlcXVpcmVkXCInK2F0dHJOYW1lKydcIiEhJylcblx0XHRcdFx0Y2FzZSBTX1RBR19TUEFDRTpcblx0XHRcdFx0XHRzID0gU19BVFRSO1xuXHRcdFx0XHRcdHN0YXJ0ID0gcDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBTX0VROlxuXHRcdFx0XHRcdHMgPSBTX0FUVFJfTk9RVU9UX1ZBTFVFO1xuXHRcdFx0XHRcdHN0YXJ0ID0gcDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBTX1RBR19DTE9TRTpcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJlbGVtZW50cyBjbG9zZWQgY2hhcmFjdGVyICcvJyBhbmQgJz4nIG11c3QgYmUgY29ubmVjdGVkIHRvXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fS8vZW5kIG91dGVyIHN3aXRjaFxuXHRcdC8vY29uc29sZS5sb2coJ3ArKycscClcblx0XHRwKys7XG5cdH1cbn1cbi8qKlxuICogQHJldHVybiB0cnVlIGlmIGhhcyBuZXcgbmFtZXNwYWNlIGRlZmluZVxuICovXG5mdW5jdGlvbiBhcHBlbmRFbGVtZW50KGVsLGRvbUJ1aWxkZXIsY3VycmVudE5TTWFwKXtcblx0dmFyIHRhZ05hbWUgPSBlbC50YWdOYW1lO1xuXHR2YXIgbG9jYWxOU01hcCA9IG51bGw7XG5cdC8vdmFyIGN1cnJlbnROU01hcCA9IHBhcnNlU3RhY2tbcGFyc2VTdGFjay5sZW5ndGgtMV0uY3VycmVudE5TTWFwO1xuXHR2YXIgaSA9IGVsLmxlbmd0aDtcblx0d2hpbGUoaS0tKXtcblx0XHR2YXIgYSA9IGVsW2ldO1xuXHRcdHZhciBxTmFtZSA9IGEucU5hbWU7XG5cdFx0dmFyIHZhbHVlID0gYS52YWx1ZTtcblx0XHR2YXIgbnNwID0gcU5hbWUuaW5kZXhPZignOicpO1xuXHRcdGlmKG5zcD4wKXtcblx0XHRcdHZhciBwcmVmaXggPSBhLnByZWZpeCA9IHFOYW1lLnNsaWNlKDAsbnNwKTtcblx0XHRcdHZhciBsb2NhbE5hbWUgPSBxTmFtZS5zbGljZShuc3ArMSk7XG5cdFx0XHR2YXIgbnNQcmVmaXggPSBwcmVmaXggPT09ICd4bWxucycgJiYgbG9jYWxOYW1lXG5cdFx0fWVsc2V7XG5cdFx0XHRsb2NhbE5hbWUgPSBxTmFtZTtcblx0XHRcdHByZWZpeCA9IG51bGxcblx0XHRcdG5zUHJlZml4ID0gcU5hbWUgPT09ICd4bWxucycgJiYgJydcblx0XHR9XG5cdFx0Ly9jYW4gbm90IHNldCBwcmVmaXgsYmVjYXVzZSBwcmVmaXggIT09ICcnXG5cdFx0YS5sb2NhbE5hbWUgPSBsb2NhbE5hbWUgO1xuXHRcdC8vcHJlZml4ID09IG51bGwgZm9yIG5vIG5zIHByZWZpeCBhdHRyaWJ1dGVcblx0XHRpZihuc1ByZWZpeCAhPT0gZmFsc2Upey8vaGFjayEhXG5cdFx0XHRpZihsb2NhbE5TTWFwID09IG51bGwpe1xuXHRcdFx0XHRsb2NhbE5TTWFwID0ge31cblx0XHRcdFx0Ly9jb25zb2xlLmxvZyhjdXJyZW50TlNNYXAsMClcblx0XHRcdFx0X2NvcHkoY3VycmVudE5TTWFwLGN1cnJlbnROU01hcD17fSlcblx0XHRcdFx0Ly9jb25zb2xlLmxvZyhjdXJyZW50TlNNYXAsMSlcblx0XHRcdH1cblx0XHRcdGN1cnJlbnROU01hcFtuc1ByZWZpeF0gPSBsb2NhbE5TTWFwW25zUHJlZml4XSA9IHZhbHVlO1xuXHRcdFx0YS51cmkgPSBOQU1FU1BBQ0UuWE1MTlNcblx0XHRcdGRvbUJ1aWxkZXIuc3RhcnRQcmVmaXhNYXBwaW5nKG5zUHJlZml4LCB2YWx1ZSlcblx0XHR9XG5cdH1cblx0dmFyIGkgPSBlbC5sZW5ndGg7XG5cdHdoaWxlKGktLSl7XG5cdFx0YSA9IGVsW2ldO1xuXHRcdHZhciBwcmVmaXggPSBhLnByZWZpeDtcblx0XHRpZihwcmVmaXgpey8vbm8gcHJlZml4IGF0dHJpYnV0ZSBoYXMgbm8gbmFtZXNwYWNlXG5cdFx0XHRpZihwcmVmaXggPT09ICd4bWwnKXtcblx0XHRcdFx0YS51cmkgPSBOQU1FU1BBQ0UuWE1MO1xuXHRcdFx0fWlmKHByZWZpeCAhPT0gJ3htbG5zJyl7XG5cdFx0XHRcdGEudXJpID0gY3VycmVudE5TTWFwW3ByZWZpeCB8fCAnJ11cblxuXHRcdFx0XHQvL3tjb25zb2xlLmxvZygnIyMjJythLnFOYW1lLGRvbUJ1aWxkZXIubG9jYXRvci5zeXN0ZW1JZCsnJyxjdXJyZW50TlNNYXAsYS51cmkpfVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHR2YXIgbnNwID0gdGFnTmFtZS5pbmRleE9mKCc6Jyk7XG5cdGlmKG5zcD4wKXtcblx0XHRwcmVmaXggPSBlbC5wcmVmaXggPSB0YWdOYW1lLnNsaWNlKDAsbnNwKTtcblx0XHRsb2NhbE5hbWUgPSBlbC5sb2NhbE5hbWUgPSB0YWdOYW1lLnNsaWNlKG5zcCsxKTtcblx0fWVsc2V7XG5cdFx0cHJlZml4ID0gbnVsbDsvL2ltcG9ydGFudCEhXG5cdFx0bG9jYWxOYW1lID0gZWwubG9jYWxOYW1lID0gdGFnTmFtZTtcblx0fVxuXHQvL25vIHByZWZpeCBlbGVtZW50IGhhcyBkZWZhdWx0IG5hbWVzcGFjZVxuXHR2YXIgbnMgPSBlbC51cmkgPSBjdXJyZW50TlNNYXBbcHJlZml4IHx8ICcnXTtcblx0ZG9tQnVpbGRlci5zdGFydEVsZW1lbnQobnMsbG9jYWxOYW1lLHRhZ05hbWUsZWwpO1xuXHQvL2VuZFByZWZpeE1hcHBpbmcgYW5kIHN0YXJ0UHJlZml4TWFwcGluZyBoYXZlIG5vdCBhbnkgaGVscCBmb3IgZG9tIGJ1aWxkZXJcblx0Ly9sb2NhbE5TTWFwID0gbnVsbFxuXHRpZihlbC5jbG9zZWQpe1xuXHRcdGRvbUJ1aWxkZXIuZW5kRWxlbWVudChucyxsb2NhbE5hbWUsdGFnTmFtZSk7XG5cdFx0aWYobG9jYWxOU01hcCl7XG5cdFx0XHRmb3IocHJlZml4IGluIGxvY2FsTlNNYXApe1xuXHRcdFx0XHRkb21CdWlsZGVyLmVuZFByZWZpeE1hcHBpbmcocHJlZml4KVxuXHRcdFx0fVxuXHRcdH1cblx0fWVsc2V7XG5cdFx0ZWwuY3VycmVudE5TTWFwID0gY3VycmVudE5TTWFwO1xuXHRcdGVsLmxvY2FsTlNNYXAgPSBsb2NhbE5TTWFwO1xuXHRcdC8vcGFyc2VTdGFjay5wdXNoKGVsKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxufVxuZnVuY3Rpb24gcGFyc2VIdG1sU3BlY2lhbENvbnRlbnQoc291cmNlLGVsU3RhcnRFbmQsdGFnTmFtZSxlbnRpdHlSZXBsYWNlcixkb21CdWlsZGVyKXtcblx0aWYoL14oPzpzY3JpcHR8dGV4dGFyZWEpJC9pLnRlc3QodGFnTmFtZSkpe1xuXHRcdHZhciBlbEVuZFN0YXJ0ID0gIHNvdXJjZS5pbmRleE9mKCc8LycrdGFnTmFtZSsnPicsZWxTdGFydEVuZCk7XG5cdFx0dmFyIHRleHQgPSBzb3VyY2Uuc3Vic3RyaW5nKGVsU3RhcnRFbmQrMSxlbEVuZFN0YXJ0KTtcblx0XHRpZigvWyY8XS8udGVzdCh0ZXh0KSl7XG5cdFx0XHRpZigvXnNjcmlwdCQvaS50ZXN0KHRhZ05hbWUpKXtcblx0XHRcdFx0Ly9pZighL1xcXVxcXT4vLnRlc3QodGV4dCkpe1xuXHRcdFx0XHRcdC8vbGV4SGFuZGxlci5zdGFydENEQVRBKCk7XG5cdFx0XHRcdFx0ZG9tQnVpbGRlci5jaGFyYWN0ZXJzKHRleHQsMCx0ZXh0Lmxlbmd0aCk7XG5cdFx0XHRcdFx0Ly9sZXhIYW5kbGVyLmVuZENEQVRBKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGVsRW5kU3RhcnQ7XG5cdFx0XHRcdC8vfVxuXHRcdFx0fS8vfWVsc2V7Ly90ZXh0IGFyZWFcblx0XHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZSgvJiM/XFx3KzsvZyxlbnRpdHlSZXBsYWNlcik7XG5cdFx0XHRcdGRvbUJ1aWxkZXIuY2hhcmFjdGVycyh0ZXh0LDAsdGV4dC5sZW5ndGgpO1xuXHRcdFx0XHRyZXR1cm4gZWxFbmRTdGFydDtcblx0XHRcdC8vfVxuXG5cdFx0fVxuXHR9XG5cdHJldHVybiBlbFN0YXJ0RW5kKzE7XG59XG5mdW5jdGlvbiBmaXhTZWxmQ2xvc2VkKHNvdXJjZSxlbFN0YXJ0RW5kLHRhZ05hbWUsY2xvc2VNYXApe1xuXHQvL2lmKHRhZ05hbWUgaW4gY2xvc2VNYXApe1xuXHR2YXIgcG9zID0gY2xvc2VNYXBbdGFnTmFtZV07XG5cdGlmKHBvcyA9PSBudWxsKXtcblx0XHQvL2NvbnNvbGUubG9nKHRhZ05hbWUpXG5cdFx0cG9zID0gIHNvdXJjZS5sYXN0SW5kZXhPZignPC8nK3RhZ05hbWUrJz4nKVxuXHRcdGlmKHBvczxlbFN0YXJ0RW5kKXsvL+W/mOiusOmXreWQiFxuXHRcdFx0cG9zID0gc291cmNlLmxhc3RJbmRleE9mKCc8LycrdGFnTmFtZSlcblx0XHR9XG5cdFx0Y2xvc2VNYXBbdGFnTmFtZV0gPXBvc1xuXHR9XG5cdHJldHVybiBwb3M8ZWxTdGFydEVuZDtcblx0Ly99XG59XG5mdW5jdGlvbiBfY29weShzb3VyY2UsdGFyZ2V0KXtcblx0Zm9yKHZhciBuIGluIHNvdXJjZSl7dGFyZ2V0W25dID0gc291cmNlW25dfVxufVxuZnVuY3Rpb24gcGFyc2VEQ0Moc291cmNlLHN0YXJ0LGRvbUJ1aWxkZXIsZXJyb3JIYW5kbGVyKXsvL3N1cmUgc3RhcnQgd2l0aCAnPCEnXG5cdHZhciBuZXh0PSBzb3VyY2UuY2hhckF0KHN0YXJ0KzIpXG5cdHN3aXRjaChuZXh0KXtcblx0Y2FzZSAnLSc6XG5cdFx0aWYoc291cmNlLmNoYXJBdChzdGFydCArIDMpID09PSAnLScpe1xuXHRcdFx0dmFyIGVuZCA9IHNvdXJjZS5pbmRleE9mKCctLT4nLHN0YXJ0KzQpO1xuXHRcdFx0Ly9hcHBlbmQgY29tbWVudCBzb3VyY2Uuc3Vic3RyaW5nKDQsZW5kKS8vPCEtLVxuXHRcdFx0aWYoZW5kPnN0YXJ0KXtcblx0XHRcdFx0ZG9tQnVpbGRlci5jb21tZW50KHNvdXJjZSxzdGFydCs0LGVuZC1zdGFydC00KTtcblx0XHRcdFx0cmV0dXJuIGVuZCszO1xuXHRcdFx0fWVsc2V7XG5cdFx0XHRcdGVycm9ySGFuZGxlci5lcnJvcihcIlVuY2xvc2VkIGNvbW1lbnRcIik7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9ZWxzZXtcblx0XHRcdC8vZXJyb3Jcblx0XHRcdHJldHVybiAtMTtcblx0XHR9XG5cdGRlZmF1bHQ6XG5cdFx0aWYoc291cmNlLnN1YnN0cihzdGFydCszLDYpID09ICdDREFUQVsnKXtcblx0XHRcdHZhciBlbmQgPSBzb3VyY2UuaW5kZXhPZignXV0+JyxzdGFydCs5KTtcblx0XHRcdGRvbUJ1aWxkZXIuc3RhcnRDREFUQSgpO1xuXHRcdFx0ZG9tQnVpbGRlci5jaGFyYWN0ZXJzKHNvdXJjZSxzdGFydCs5LGVuZC1zdGFydC05KTtcblx0XHRcdGRvbUJ1aWxkZXIuZW5kQ0RBVEEoKVxuXHRcdFx0cmV0dXJuIGVuZCszO1xuXHRcdH1cblx0XHQvLzwhRE9DVFlQRVxuXHRcdC8vc3RhcnREVEQoamF2YS5sYW5nLlN0cmluZyBuYW1lLCBqYXZhLmxhbmcuU3RyaW5nIHB1YmxpY0lkLCBqYXZhLmxhbmcuU3RyaW5nIHN5c3RlbUlkKVxuXHRcdHZhciBtYXRjaHMgPSBzcGxpdChzb3VyY2Usc3RhcnQpO1xuXHRcdHZhciBsZW4gPSBtYXRjaHMubGVuZ3RoO1xuXHRcdGlmKGxlbj4xICYmIC8hZG9jdHlwZS9pLnRlc3QobWF0Y2hzWzBdWzBdKSl7XG5cdFx0XHR2YXIgbmFtZSA9IG1hdGNoc1sxXVswXTtcblx0XHRcdHZhciBwdWJpZCA9IGZhbHNlO1xuXHRcdFx0dmFyIHN5c2lkID0gZmFsc2U7XG5cdFx0XHRpZihsZW4+Myl7XG5cdFx0XHRcdGlmKC9ecHVibGljJC9pLnRlc3QobWF0Y2hzWzJdWzBdKSl7XG5cdFx0XHRcdFx0cHViaWQgPSBtYXRjaHNbM11bMF07XG5cdFx0XHRcdFx0c3lzaWQgPSBsZW4+NCAmJiBtYXRjaHNbNF1bMF07XG5cdFx0XHRcdH1lbHNlIGlmKC9ec3lzdGVtJC9pLnRlc3QobWF0Y2hzWzJdWzBdKSl7XG5cdFx0XHRcdFx0c3lzaWQgPSBtYXRjaHNbM11bMF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHZhciBsYXN0TWF0Y2ggPSBtYXRjaHNbbGVuLTFdXG5cdFx0XHRkb21CdWlsZGVyLnN0YXJ0RFREKG5hbWUsIHB1YmlkLCBzeXNpZCk7XG5cdFx0XHRkb21CdWlsZGVyLmVuZERURCgpO1xuXG5cdFx0XHRyZXR1cm4gbGFzdE1hdGNoLmluZGV4K2xhc3RNYXRjaFswXS5sZW5ndGhcblx0XHR9XG5cdH1cblx0cmV0dXJuIC0xO1xufVxuXG5cblxuZnVuY3Rpb24gcGFyc2VJbnN0cnVjdGlvbihzb3VyY2Usc3RhcnQsZG9tQnVpbGRlcil7XG5cdHZhciBlbmQgPSBzb3VyY2UuaW5kZXhPZignPz4nLHN0YXJ0KTtcblx0aWYoZW5kKXtcblx0XHR2YXIgbWF0Y2ggPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0LGVuZCkubWF0Y2goL148XFw/KFxcUyopXFxzKihbXFxzXFxTXSo/KVxccyokLyk7XG5cdFx0aWYobWF0Y2gpe1xuXHRcdFx0dmFyIGxlbiA9IG1hdGNoWzBdLmxlbmd0aDtcblx0XHRcdGRvbUJ1aWxkZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKG1hdGNoWzFdLCBtYXRjaFsyXSkgO1xuXHRcdFx0cmV0dXJuIGVuZCsyO1xuXHRcdH1lbHNley8vZXJyb3Jcblx0XHRcdHJldHVybiAtMTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBFbGVtZW50QXR0cmlidXRlcygpe1xuXHR0aGlzLmF0dHJpYnV0ZU5hbWVzID0ge31cbn1cbkVsZW1lbnRBdHRyaWJ1dGVzLnByb3RvdHlwZSA9IHtcblx0c2V0VGFnTmFtZTpmdW5jdGlvbih0YWdOYW1lKXtcblx0XHRpZighdGFnTmFtZVBhdHRlcm4udGVzdCh0YWdOYW1lKSl7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdGFnTmFtZTonK3RhZ05hbWUpXG5cdFx0fVxuXHRcdHRoaXMudGFnTmFtZSA9IHRhZ05hbWVcblx0fSxcblx0YWRkVmFsdWU6ZnVuY3Rpb24ocU5hbWUsIHZhbHVlLCBvZmZzZXQpIHtcblx0XHRpZighdGFnTmFtZVBhdHRlcm4udGVzdChxTmFtZSkpe1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGF0dHJpYnV0ZTonK3FOYW1lKVxuXHRcdH1cblx0XHR0aGlzLmF0dHJpYnV0ZU5hbWVzW3FOYW1lXSA9IHRoaXMubGVuZ3RoO1xuXHRcdHRoaXNbdGhpcy5sZW5ndGgrK10gPSB7cU5hbWU6cU5hbWUsdmFsdWU6dmFsdWUsb2Zmc2V0Om9mZnNldH1cblx0fSxcblx0bGVuZ3RoOjAsXG5cdGdldExvY2FsTmFtZTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpc1tpXS5sb2NhbE5hbWV9LFxuXHRnZXRMb2NhdG9yOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzW2ldLmxvY2F0b3J9LFxuXHRnZXRRTmFtZTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpc1tpXS5xTmFtZX0sXG5cdGdldFVSSTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpc1tpXS51cml9LFxuXHRnZXRWYWx1ZTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpc1tpXS52YWx1ZX1cbi8vXHQsZ2V0SW5kZXg6ZnVuY3Rpb24odXJpLCBsb2NhbE5hbWUpKXtcbi8vXHRcdGlmKGxvY2FsTmFtZSl7XG4vL1xuLy9cdFx0fWVsc2V7XG4vL1x0XHRcdHZhciBxTmFtZSA9IHVyaVxuLy9cdFx0fVxuLy9cdH0sXG4vL1x0Z2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRWYWx1ZSh0aGlzLmdldEluZGV4LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LFxuLy9cdGdldFR5cGU6ZnVuY3Rpb24odXJpLGxvY2FsTmFtZSl7fVxuLy9cdGdldFR5cGU6ZnVuY3Rpb24oaSl7fSxcbn1cblxuXG5cbmZ1bmN0aW9uIHNwbGl0KHNvdXJjZSxzdGFydCl7XG5cdHZhciBtYXRjaDtcblx0dmFyIGJ1ZiA9IFtdO1xuXHR2YXIgcmVnID0gLydbXiddKyd8XCJbXlwiXStcInxbXlxcczw+XFwvPV0rPT98KFxcLz9cXHMqPnw8KS9nO1xuXHRyZWcubGFzdEluZGV4ID0gc3RhcnQ7XG5cdHJlZy5leGVjKHNvdXJjZSk7Ly9za2lwIDxcblx0d2hpbGUobWF0Y2ggPSByZWcuZXhlYyhzb3VyY2UpKXtcblx0XHRidWYucHVzaChtYXRjaCk7XG5cdFx0aWYobWF0Y2hbMV0pcmV0dXJuIGJ1Zjtcblx0fVxufVxuXG5leHBvcnRzLlhNTFJlYWRlciA9IFhNTFJlYWRlcjtcbmV4cG9ydHMuUGFyc2VFcnJvciA9IFBhcnNlRXJyb3I7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLyogZ2xvYmFscyBfX3dlYnBhY2tfYW1kX29wdGlvbnNfXyAqL1xubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfYW1kX29wdGlvbnNfXztcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcbiIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG52YXIgc2Vzc2lvbiA9IHJlcXVpcmUoJy4vc2Vzc2lvbicpO1xuXG52YXIgQXN5bmMgPSByZXF1aXJlKCcuL2FzeW5jJyk7XG5cbnZhciBFdmVudFByb3h5ID0gcmVxdWlyZSgnLi9ldmVudCcpLkV2ZW50UHJveHk7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbnZhciBUcmFja2VyID0gcmVxdWlyZSgnLi90cmFja2VyJyk7IC8vIOaWh+S7tuWIhuWdl+S4iuS8oOWFqOi/h+eoi++8jOaatOmcsueahOWIhuWdl+S4iuS8oOaOpeWPo1xuXG5cbmZ1bmN0aW9uIHNsaWNlVXBsb2FkRmlsZShwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGVwID0gbmV3IEV2ZW50UHJveHkoKTtcbiAgdmFyIFRhc2tJZCA9IHBhcmFtcy5UYXNrSWQ7XG4gIHZhciBCdWNrZXQgPSBwYXJhbXMuQnVja2V0O1xuICB2YXIgUmVnaW9uID0gcGFyYW1zLlJlZ2lvbjtcbiAgdmFyIEtleSA9IHBhcmFtcy5LZXk7XG4gIHZhciBCb2R5ID0gcGFyYW1zLkJvZHk7XG4gIHZhciBDaHVua1NpemUgPSBwYXJhbXMuQ2h1bmtTaXplIHx8IHBhcmFtcy5TbGljZVNpemUgfHwgc2VsZi5vcHRpb25zLkNodW5rU2l6ZTtcbiAgdmFyIEFzeW5jTGltaXQgPSBwYXJhbXMuQXN5bmNMaW1pdDtcbiAgdmFyIFN0b3JhZ2VDbGFzcyA9IHBhcmFtcy5TdG9yYWdlQ2xhc3M7XG4gIHZhciBTZXJ2ZXJTaWRlRW5jcnlwdGlvbiA9IHBhcmFtcy5TZXJ2ZXJTaWRlRW5jcnlwdGlvbjtcbiAgdmFyIEZpbGVTaXplO1xuICB2YXIgb25Qcm9ncmVzcztcbiAgdmFyIG9uSGFzaFByb2dyZXNzID0gcGFyYW1zLm9uSGFzaFByb2dyZXNzO1xuICB2YXIgdHJhY2tlciA9IHBhcmFtcy50cmFja2VyO1xuICB0cmFja2VyICYmIHRyYWNrZXIuc2V0UGFyYW1zKHtcbiAgICBjaHVua1NpemU6IENodW5rU2l6ZVxuICB9KTsgLy8g5LiK5Lyg6L+H56iL5Lit5Ye6546w6ZSZ6K+v77yM6L+U5Zue6ZSZ6K+vXG5cbiAgZXAub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIGlmICghc2VsZi5faXNSdW5uaW5nVGFzayhUYXNrSWQpKSByZXR1cm47XG4gICAgZXJyLlVwbG9hZElkID0gcGFyYW1zLlVwbG9hZERhdGEuVXBsb2FkSWQgfHwgJyc7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gIH0pOyAvLyDkuIrkvKDliIblnZflrozmiJDvvIzlvIDlp4sgdXBsb2FkU2xpY2VDb21wbGV0ZSDmk43kvZxcblxuICBlcC5vbigndXBsb2FkX2NvbXBsZXRlJywgZnVuY3Rpb24gKFVwbG9hZENvbXBsZXRlRGF0YSkge1xuICAgIHZhciBfVXBsb2FkQ29tcGxldGVEYXRhID0gdXRpbC5leHRlbmQoe1xuICAgICAgVXBsb2FkSWQ6IHBhcmFtcy5VcGxvYWREYXRhLlVwbG9hZElkIHx8ICcnXG4gICAgfSwgVXBsb2FkQ29tcGxldGVEYXRhKTtcblxuICAgIGNhbGxiYWNrKG51bGwsIF9VcGxvYWRDb21wbGV0ZURhdGEpO1xuICB9KTsgLy8g5LiK5Lyg5YiG5Z2X5a6M5oiQ77yM5byA5aeLIHVwbG9hZFNsaWNlQ29tcGxldGUg5pON5L2cXG5cbiAgZXAub24oJ3VwbG9hZF9zbGljZV9jb21wbGV0ZScsIGZ1bmN0aW9uIChVcGxvYWREYXRhKSB7XG4gICAgdmFyIG1ldGFIZWFkZXJzID0ge307XG4gICAgdXRpbC5lYWNoKHBhcmFtcy5IZWFkZXJzLCBmdW5jdGlvbiAodmFsLCBrKSB7XG4gICAgICB2YXIgc2hvcnRLZXkgPSBrLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoc2hvcnRLZXkuaW5kZXhPZigneC1jb3MtbWV0YS0nKSA9PT0gMCB8fCBzaG9ydEtleSA9PT0gJ3BpYy1vcGVyYXRpb25zJykgbWV0YUhlYWRlcnNba10gPSB2YWw7XG4gICAgfSk7XG4gICAgdXBsb2FkU2xpY2VDb21wbGV0ZS5jYWxsKHNlbGYsIHtcbiAgICAgIEJ1Y2tldDogQnVja2V0LFxuICAgICAgUmVnaW9uOiBSZWdpb24sXG4gICAgICBLZXk6IEtleSxcbiAgICAgIFVwbG9hZElkOiBVcGxvYWREYXRhLlVwbG9hZElkLFxuICAgICAgU2xpY2VMaXN0OiBVcGxvYWREYXRhLlNsaWNlTGlzdCxcbiAgICAgIEhlYWRlcnM6IG1ldGFIZWFkZXJzLFxuICAgICAgdHJhY2tlcjogdHJhY2tlclxuICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGlmICghc2VsZi5faXNSdW5uaW5nVGFzayhUYXNrSWQpKSByZXR1cm47XG4gICAgICBzZXNzaW9uLnJlbW92ZVVzaW5nKFVwbG9hZERhdGEuVXBsb2FkSWQpO1xuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIG9uUHJvZ3Jlc3MobnVsbCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBlcC5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICB9XG5cbiAgICAgIHNlc3Npb24ucmVtb3ZlVXBsb2FkSWQuY2FsbChzZWxmLCBVcGxvYWREYXRhLlVwbG9hZElkKTtcbiAgICAgIG9uUHJvZ3Jlc3Moe1xuICAgICAgICBsb2FkZWQ6IEZpbGVTaXplLFxuICAgICAgICB0b3RhbDogRmlsZVNpemVcbiAgICAgIH0sIHRydWUpO1xuICAgICAgZXAuZW1pdCgndXBsb2FkX2NvbXBsZXRlJywgZGF0YSk7XG4gICAgfSk7XG4gIH0pOyAvLyDojrflj5YgVXBsb2FkSWQg5a6M5oiQ77yM5byA5aeL5LiK5Lyg5q+P5Liq5YiG54mHXG5cbiAgZXAub24oJ2dldF91cGxvYWRfZGF0YV9maW5pc2gnLCBmdW5jdGlvbiAoVXBsb2FkRGF0YSkge1xuICAgIC8vIOWkhOeQhiBVcGxvYWRJZCDnvJPlrZhcbiAgICB2YXIgdXVpZCA9IHNlc3Npb24uZ2V0RmlsZUlkKEJvZHksIHBhcmFtcy5DaHVua1NpemUsIEJ1Y2tldCwgS2V5KTtcbiAgICB1dWlkICYmIHNlc3Npb24uc2F2ZVVwbG9hZElkLmNhbGwoc2VsZiwgdXVpZCwgVXBsb2FkRGF0YS5VcGxvYWRJZCwgc2VsZi5vcHRpb25zLlVwbG9hZElkQ2FjaGVMaW1pdCk7IC8vIOe8k+WtmCBVcGxvYWRJZFxuXG4gICAgc2Vzc2lvbi5zZXRVc2luZyhVcGxvYWREYXRhLlVwbG9hZElkKTsgLy8g5qCH6K6wIFVwbG9hZElkIOS4uuato+WcqOS9v+eUqFxuICAgIC8vIOiOt+WPliBVcGxvYWRJZFxuXG4gICAgb25Qcm9ncmVzcyhudWxsLCB0cnVlKTsgLy8g5Lu75Yqh54q25oCB5byA5aeLIHVwbG9hZGluZ1xuXG4gICAgdXBsb2FkU2xpY2VMaXN0LmNhbGwoc2VsZiwge1xuICAgICAgVGFza0lkOiBUYXNrSWQsXG4gICAgICBCdWNrZXQ6IEJ1Y2tldCxcbiAgICAgIFJlZ2lvbjogUmVnaW9uLFxuICAgICAgS2V5OiBLZXksXG4gICAgICBCb2R5OiBCb2R5LFxuICAgICAgRmlsZVNpemU6IEZpbGVTaXplLFxuICAgICAgU2xpY2VTaXplOiBDaHVua1NpemUsXG4gICAgICBBc3luY0xpbWl0OiBBc3luY0xpbWl0LFxuICAgICAgU2VydmVyU2lkZUVuY3J5cHRpb246IFNlcnZlclNpZGVFbmNyeXB0aW9uLFxuICAgICAgVXBsb2FkRGF0YTogVXBsb2FkRGF0YSxcbiAgICAgIEhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgICAgb25Qcm9ncmVzczogb25Qcm9ncmVzcyxcbiAgICAgIHRyYWNrZXI6IHRyYWNrZXJcbiAgICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICBpZiAoIXNlbGYuX2lzUnVubmluZ1Rhc2soVGFza0lkKSkgcmV0dXJuO1xuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIG9uUHJvZ3Jlc3MobnVsbCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBlcC5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICB9XG5cbiAgICAgIGVwLmVtaXQoJ3VwbG9hZF9zbGljZV9jb21wbGV0ZScsIGRhdGEpO1xuICAgIH0pO1xuICB9KTsgLy8g5byA5aeL6I635Y+W5paH5Lu2IFVwbG9hZElk77yM6YeM6Z2i5Lya6KeG5oOF5Ya16K6h566XIEVUYWfvvIzlubbmr5Tlr7nvvIzkv53or4Hmlofku7bkuIDoh7TmgKfvvIzkuZ/kvJjljJbkuIrkvKBcblxuICBlcC5vbignZ2V0X2ZpbGVfc2l6ZV9maW5pc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgb25Qcm9ncmVzcyA9IHV0aWwudGhyb3R0bGVPblByb2dyZXNzLmNhbGwoc2VsZiwgRmlsZVNpemUsIHBhcmFtcy5vblByb2dyZXNzKTtcblxuICAgIGlmIChwYXJhbXMuVXBsb2FkRGF0YS5VcGxvYWRJZCkge1xuICAgICAgZXAuZW1pdCgnZ2V0X3VwbG9hZF9kYXRhX2ZpbmlzaCcsIHBhcmFtcy5VcGxvYWREYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9wYXJhbXMgPSB1dGlsLmV4dGVuZCh7XG4gICAgICAgIFRhc2tJZDogVGFza0lkLFxuICAgICAgICBCdWNrZXQ6IEJ1Y2tldCxcbiAgICAgICAgUmVnaW9uOiBSZWdpb24sXG4gICAgICAgIEtleTogS2V5LFxuICAgICAgICBIZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICAgICAgU3RvcmFnZUNsYXNzOiBTdG9yYWdlQ2xhc3MsXG4gICAgICAgIEJvZHk6IEJvZHksXG4gICAgICAgIEZpbGVTaXplOiBGaWxlU2l6ZSxcbiAgICAgICAgU2xpY2VTaXplOiBDaHVua1NpemUsXG4gICAgICAgIG9uSGFzaFByb2dyZXNzOiBvbkhhc2hQcm9ncmVzcyxcbiAgICAgICAgdHJhY2tlcjogdHJhY2tlclxuICAgICAgfSwgcGFyYW1zKTtcblxuICAgICAgZ2V0VXBsb2FkSWRBbmRQYXJ0TGlzdC5jYWxsKHNlbGYsIF9wYXJhbXMsIGZ1bmN0aW9uIChlcnIsIFVwbG9hZERhdGEpIHtcbiAgICAgICAgaWYgKCFzZWxmLl9pc1J1bm5pbmdUYXNrKFRhc2tJZCkpIHJldHVybjtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIGVwLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgcGFyYW1zLlVwbG9hZERhdGEuVXBsb2FkSWQgPSBVcGxvYWREYXRhLlVwbG9hZElkO1xuICAgICAgICBwYXJhbXMuVXBsb2FkRGF0YS5QYXJ0TGlzdCA9IFVwbG9hZERhdGEuUGFydExpc3Q7XG4gICAgICAgIGVwLmVtaXQoJ2dldF91cGxvYWRfZGF0YV9maW5pc2gnLCBwYXJhbXMuVXBsb2FkRGF0YSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pOyAvLyDojrflj5bkuIrkvKDmlofku7blpKflsI9cblxuICBGaWxlU2l6ZSA9IHBhcmFtcy5Db250ZW50TGVuZ3RoO1xuICBkZWxldGUgcGFyYW1zLkNvbnRlbnRMZW5ndGg7XG4gICFwYXJhbXMuSGVhZGVycyAmJiAocGFyYW1zLkhlYWRlcnMgPSB7fSk7XG4gIHV0aWwuZWFjaChwYXJhbXMuSGVhZGVycywgZnVuY3Rpb24gKGl0ZW0sIGtleSkge1xuICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtbGVuZ3RoJykge1xuICAgICAgZGVsZXRlIHBhcmFtcy5IZWFkZXJzW2tleV07XG4gICAgfVxuICB9KTsgLy8g5o6n5Yi25YiG54mH5aSn5bCPXG5cbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgU0laRSA9IFsxLCAyLCA0LCA4LCAxNiwgMzIsIDY0LCAxMjgsIDI1NiwgNTEyLCAxMDI0LCAxMDI0ICogMiwgMTAyNCAqIDQsIDEwMjQgKiA1XTtcbiAgICB2YXIgQXV0b0NodW5rU2l6ZSA9IDEwMjQgKiAxMDI0O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBTSVpFLmxlbmd0aDsgaSsrKSB7XG4gICAgICBBdXRvQ2h1bmtTaXplID0gU0laRVtpXSAqIDEwMjQgKiAxMDI0O1xuICAgICAgaWYgKEZpbGVTaXplIC8gQXV0b0NodW5rU2l6ZSA8PSBzZWxmLm9wdGlvbnMuTWF4UGFydE51bWJlcikgYnJlYWs7XG4gICAgfVxuXG4gICAgcGFyYW1zLkNodW5rU2l6ZSA9IHBhcmFtcy5TbGljZVNpemUgPSBDaHVua1NpemUgPSBNYXRoLm1heChDaHVua1NpemUsIEF1dG9DaHVua1NpemUpO1xuICB9KSgpOyAvLyDlvIDlp4vkuIrkvKBcblxuXG4gIGlmIChGaWxlU2l6ZSA9PT0gMCkge1xuICAgIHBhcmFtcy5Cb2R5ID0gJyc7XG4gICAgcGFyYW1zLkNvbnRlbnRMZW5ndGggPSAwO1xuICAgIHBhcmFtcy5Ta2lwVGFzayA9IHRydWU7XG4gICAgc2VsZi5wdXRPYmplY3QocGFyYW1zLCBjYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgZXAuZW1pdCgnZ2V0X2ZpbGVfc2l6ZV9maW5pc2gnKTtcbiAgfVxufSAvLyDojrflj5bkuIrkvKDku7vliqHnmoQgVXBsb2FkSWRcblxuXG5mdW5jdGlvbiBnZXRVcGxvYWRJZEFuZFBhcnRMaXN0KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIFRhc2tJZCA9IHBhcmFtcy5UYXNrSWQ7XG4gIHZhciBCdWNrZXQgPSBwYXJhbXMuQnVja2V0O1xuICB2YXIgUmVnaW9uID0gcGFyYW1zLlJlZ2lvbjtcbiAgdmFyIEtleSA9IHBhcmFtcy5LZXk7XG4gIHZhciBTdG9yYWdlQ2xhc3MgPSBwYXJhbXMuU3RvcmFnZUNsYXNzO1xuICB2YXIgc2VsZiA9IHRoaXM7IC8vIOiuoeeulyBFVGFnXG5cbiAgdmFyIEVUYWdNYXAgPSB7fTtcbiAgdmFyIEZpbGVTaXplID0gcGFyYW1zLkZpbGVTaXplO1xuICB2YXIgU2xpY2VTaXplID0gcGFyYW1zLlNsaWNlU2l6ZTtcbiAgdmFyIFNsaWNlQ291bnQgPSBNYXRoLmNlaWwoRmlsZVNpemUgLyBTbGljZVNpemUpO1xuICB2YXIgRmluaXNoU2xpY2VDb3VudCA9IDA7XG4gIHZhciBGaW5pc2hTaXplID0gMDtcbiAgdmFyIG9uSGFzaFByb2dyZXNzID0gdXRpbC50aHJvdHRsZU9uUHJvZ3Jlc3MuY2FsbChzZWxmLCBGaWxlU2l6ZSwgcGFyYW1zLm9uSGFzaFByb2dyZXNzKTtcblxuICB2YXIgZ2V0Q2h1bmtFVGFnID0gZnVuY3Rpb24gZ2V0Q2h1bmtFVGFnKFBhcnROdW1iZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHN0YXJ0ID0gU2xpY2VTaXplICogKFBhcnROdW1iZXIgLSAxKTtcbiAgICB2YXIgZW5kID0gTWF0aC5taW4oc3RhcnQgKyBTbGljZVNpemUsIEZpbGVTaXplKTtcbiAgICB2YXIgQ2h1bmtTaXplID0gZW5kIC0gc3RhcnQ7XG5cbiAgICBpZiAoRVRhZ01hcFtQYXJ0TnVtYmVyXSkge1xuICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICBQYXJ0TnVtYmVyOiBQYXJ0TnVtYmVyLFxuICAgICAgICBFVGFnOiBFVGFnTWFwW1BhcnROdW1iZXJdLFxuICAgICAgICBTaXplOiBDaHVua1NpemVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB1dGlsLmZpbGVTbGljZShwYXJhbXMuQm9keSwgc3RhcnQsIGVuZCwgZmFsc2UsIGZ1bmN0aW9uIChjaHVua0l0ZW0pIHtcbiAgICAgICAgdXRpbC5nZXRGaWxlTWQ1KGNodW5rSXRlbSwgZnVuY3Rpb24gKGVyciwgbWQ1KSB7XG4gICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKHV0aWwuZXJyb3IoZXJyKSk7XG4gICAgICAgICAgdmFyIEVUYWcgPSAnXCInICsgbWQ1ICsgJ1wiJztcbiAgICAgICAgICBFVGFnTWFwW1BhcnROdW1iZXJdID0gRVRhZztcbiAgICAgICAgICBGaW5pc2hTbGljZUNvdW50ICs9IDE7XG4gICAgICAgICAgRmluaXNoU2l6ZSArPSBDaHVua1NpemU7XG4gICAgICAgICAgb25IYXNoUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgbG9hZGVkOiBGaW5pc2hTaXplLFxuICAgICAgICAgICAgdG90YWw6IEZpbGVTaXplXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgICAgUGFydE51bWJlcjogUGFydE51bWJlcixcbiAgICAgICAgICAgIEVUYWc6IEVUYWcsXG4gICAgICAgICAgICBTaXplOiBDaHVua1NpemVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07IC8vIOmAmui/h+WSjOaWh+S7tueahCBtZDUg5a+55q+U77yM5Yik5patIFVwbG9hZElkIOaYr+WQpuWPr+eUqFxuXG5cbiAgdmFyIGlzQXZhaWxhYmxlVXBsb2FkTGlzdCA9IGZ1bmN0aW9uIGlzQXZhaWxhYmxlVXBsb2FkTGlzdChQYXJ0TGlzdCwgY2FsbGJhY2spIHtcbiAgICB2YXIgUGFydENvdW50ID0gUGFydExpc3QubGVuZ3RoOyAvLyDlpoLmnpzmsqHmnInliIbniYfvvIzpgJrov4dcblxuICAgIGlmIChQYXJ0Q291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTtcbiAgICB9IC8vIOajgOafpeWIhueJh+aVsOmHj1xuXG5cbiAgICBpZiAoUGFydENvdW50ID4gU2xpY2VDb3VudCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGZhbHNlKTtcbiAgICB9IC8vIOajgOafpeWIhueJh+Wkp+Wwj1xuXG5cbiAgICBpZiAoUGFydENvdW50ID4gMSkge1xuICAgICAgdmFyIFBhcnRTbGljZVNpemUgPSBNYXRoLm1heChQYXJ0TGlzdFswXS5TaXplLCBQYXJ0TGlzdFsxXS5TaXplKTtcblxuICAgICAgaWYgKFBhcnRTbGljZVNpemUgIT09IFNsaWNlU2l6ZSkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH0gLy8g6YCQ5Liq5YiG54mH6K6h566X5bm25qOA5p+lIEVUYWcg5piv5ZCm5LiA6Ie0XG5cblxuICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChpbmRleCkge1xuICAgICAgaWYgKGluZGV4IDwgUGFydENvdW50KSB7XG4gICAgICAgIHZhciBQYXJ0ID0gUGFydExpc3RbaW5kZXhdO1xuICAgICAgICBnZXRDaHVua0VUYWcoUGFydC5QYXJ0TnVtYmVyLCBmdW5jdGlvbiAoZXJyLCBjaHVuaykge1xuICAgICAgICAgIGlmIChjaHVuayAmJiBjaHVuay5FVGFnID09PSBQYXJ0LkVUYWcgJiYgY2h1bmsuU2l6ZSA9PT0gUGFydC5TaXplKSB7XG4gICAgICAgICAgICBuZXh0KGluZGV4ICsgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIG5leHQoMCk7XG4gIH07XG5cbiAgdmFyIGVwID0gbmV3IEV2ZW50UHJveHkoKTtcbiAgZXAub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVyckRhdGEpIHtcbiAgICBpZiAoIXNlbGYuX2lzUnVubmluZ1Rhc2soVGFza0lkKSkgcmV0dXJuO1xuICAgIHJldHVybiBjYWxsYmFjayhlcnJEYXRhKTtcbiAgfSk7IC8vIOWtmOWcqCBVcGxvYWRJZFxuXG4gIGVwLm9uKCd1cGxvYWRfaWRfYXZhaWxhYmxlJywgZnVuY3Rpb24gKFVwbG9hZERhdGEpIHtcbiAgICAvLyDovazmjaLmiJAgbWFwXG4gICAgdmFyIG1hcCA9IHt9O1xuICAgIHZhciBsaXN0ID0gW107XG4gICAgdXRpbC5lYWNoKFVwbG9hZERhdGEuUGFydExpc3QsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBtYXBbaXRlbS5QYXJ0TnVtYmVyXSA9IGl0ZW07XG4gICAgfSk7XG5cbiAgICBmb3IgKHZhciBQYXJ0TnVtYmVyID0gMTsgUGFydE51bWJlciA8PSBTbGljZUNvdW50OyBQYXJ0TnVtYmVyKyspIHtcbiAgICAgIHZhciBpdGVtID0gbWFwW1BhcnROdW1iZXJdO1xuXG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICBpdGVtLlBhcnROdW1iZXIgPSBQYXJ0TnVtYmVyO1xuICAgICAgICBpdGVtLlVwbG9hZGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW0gPSB7XG4gICAgICAgICAgUGFydE51bWJlcjogUGFydE51bWJlcixcbiAgICAgICAgICBFVGFnOiBudWxsLFxuICAgICAgICAgIFVwbG9hZGVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgVXBsb2FkRGF0YS5QYXJ0TGlzdCA9IGxpc3Q7XG4gICAgY2FsbGJhY2sobnVsbCwgVXBsb2FkRGF0YSk7XG4gIH0pOyAvLyDkuI3lrZjlnKggVXBsb2FkSWQsIOWIneWni+WMlueUn+aIkCBVcGxvYWRJZFxuXG4gIGVwLm9uKCdub19hdmFpbGFibGVfdXBsb2FkX2lkJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghc2VsZi5faXNSdW5uaW5nVGFzayhUYXNrSWQpKSByZXR1cm47XG5cbiAgICB2YXIgX3BhcmFtcyA9IHV0aWwuZXh0ZW5kKHtcbiAgICAgIEJ1Y2tldDogQnVja2V0LFxuICAgICAgUmVnaW9uOiBSZWdpb24sXG4gICAgICBLZXk6IEtleSxcbiAgICAgIFF1ZXJ5OiB1dGlsLmNsb25lKHBhcmFtcy5RdWVyeSksXG4gICAgICBTdG9yYWdlQ2xhc3M6IFN0b3JhZ2VDbGFzcyxcbiAgICAgIEJvZHk6IHBhcmFtcy5Cb2R5LFxuICAgICAgY2FsbGVkQnlTZGs6ICdzbGljZVVwbG9hZEZpbGUnLFxuICAgICAgdHJhY2tlcjogcGFyYW1zLnRyYWNrZXJcbiAgICB9LCBwYXJhbXMpO1xuXG4gICAgdmFyIGhlYWRlcnMgPSB1dGlsLmNsb25lKHBhcmFtcy5IZWFkZXJzKTtcbiAgICBkZWxldGUgaGVhZGVyc1sneC1jb3MtbWltZS1saW1pdCddO1xuICAgIF9wYXJhbXMuSGVhZGVycyA9IGhlYWRlcnM7XG4gICAgc2VsZi5tdWx0aXBhcnRJbml0KF9wYXJhbXMsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGlmICghc2VsZi5faXNSdW5uaW5nVGFzayhUYXNrSWQpKSByZXR1cm47XG4gICAgICBpZiAoZXJyKSByZXR1cm4gZXAuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgdmFyIFVwbG9hZElkID0gZGF0YS5VcGxvYWRJZDtcblxuICAgICAgaWYgKCFVcGxvYWRJZCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodXRpbC5lcnJvcihuZXcgRXJyb3IoJ25vIHN1Y2ggdXBsb2FkIGlkJykpKTtcbiAgICAgIH1cblxuICAgICAgZXAuZW1pdCgndXBsb2FkX2lkX2F2YWlsYWJsZScsIHtcbiAgICAgICAgVXBsb2FkSWQ6IFVwbG9hZElkLFxuICAgICAgICBQYXJ0TGlzdDogW11cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTsgLy8g5aaC5p6c5bey5a2Y5ZyoIFVwbG9hZElk77yM5om+5LiA5Liq5Y+v5Lul55So55qEIFVwbG9hZElkXG5cbiAgZXAub24oJ2hhc19hbmRfY2hlY2tfdXBsb2FkX2lkJywgZnVuY3Rpb24gKFVwbG9hZElkTGlzdCkge1xuICAgIC8vIOS4suihjOWcsO+8jOaJvuS4gOS4quWGheWuueS4gOiHtOeahCBVcGxvYWRJZFxuICAgIFVwbG9hZElkTGlzdCA9IFVwbG9hZElkTGlzdC5yZXZlcnNlKCk7XG4gICAgQXN5bmMuZWFjaExpbWl0KFVwbG9hZElkTGlzdCwgMSwgZnVuY3Rpb24gKFVwbG9hZElkLCBhc3luY0NhbGxiYWNrKSB7XG4gICAgICBpZiAoIXNlbGYuX2lzUnVubmluZ1Rhc2soVGFza0lkKSkgcmV0dXJuOyAvLyDlpoLmnpzmraPlnKjkuIrkvKDvvIzot7Pov4dcblxuICAgICAgaWYgKHNlc3Npb24udXNpbmdbVXBsb2FkSWRdKSB7XG4gICAgICAgIGFzeW5jQ2FsbGJhY2soKTsgLy8g5qOA5p+l5LiL5LiA5LiqIFVwbG9hZElkXG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyDliKTmlq0gVXBsb2FkSWQg5piv5ZCm5Y+v55SoXG5cblxuICAgICAgd2hvbGVNdWx0aXBhcnRMaXN0UGFydC5jYWxsKHNlbGYsIHtcbiAgICAgICAgQnVja2V0OiBCdWNrZXQsXG4gICAgICAgIFJlZ2lvbjogUmVnaW9uLFxuICAgICAgICBLZXk6IEtleSxcbiAgICAgICAgVXBsb2FkSWQ6IFVwbG9hZElkLFxuICAgICAgICB0cmFja2VyOiBwYXJhbXMudHJhY2tlclxuICAgICAgfSwgZnVuY3Rpb24gKGVyciwgUGFydExpc3REYXRhKSB7XG4gICAgICAgIGlmICghc2VsZi5faXNSdW5uaW5nVGFzayhUYXNrSWQpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHNlc3Npb24ucmVtb3ZlVXNpbmcoVXBsb2FkSWQpO1xuICAgICAgICAgIHJldHVybiBlcC5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgUGFydExpc3QgPSBQYXJ0TGlzdERhdGEuUGFydExpc3Q7XG4gICAgICAgIFBhcnRMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICBpdGVtLlBhcnROdW1iZXIgKj0gMTtcbiAgICAgICAgICBpdGVtLlNpemUgKj0gMTtcbiAgICAgICAgICBpdGVtLkVUYWcgPSBpdGVtLkVUYWcgfHwgJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBpc0F2YWlsYWJsZVVwbG9hZExpc3QoUGFydExpc3QsIGZ1bmN0aW9uIChlcnIsIGlzQXZhaWxhYmxlKSB7XG4gICAgICAgICAgaWYgKCFzZWxmLl9pc1J1bm5pbmdUYXNrKFRhc2tJZCkpIHJldHVybjtcbiAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gZXAuZW1pdCgnZXJyb3InLCBlcnIpO1xuXG4gICAgICAgICAgaWYgKGlzQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICBhc3luY0NhbGxiYWNrKHtcbiAgICAgICAgICAgICAgVXBsb2FkSWQ6IFVwbG9hZElkLFxuICAgICAgICAgICAgICBQYXJ0TGlzdDogUGFydExpc3RcbiAgICAgICAgICAgIH0pOyAvLyDpqazkuIrnu5PmnZ9cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXN5bmNDYWxsYmFjaygpOyAvLyDmo4Dmn6XkuIvkuIDkuKogVXBsb2FkSWRcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24gKEF2YWlsYWJsZVVwbG9hZERhdGEpIHtcbiAgICAgIGlmICghc2VsZi5faXNSdW5uaW5nVGFzayhUYXNrSWQpKSByZXR1cm47XG4gICAgICBvbkhhc2hQcm9ncmVzcyhudWxsLCB0cnVlKTtcblxuICAgICAgaWYgKEF2YWlsYWJsZVVwbG9hZERhdGEgJiYgQXZhaWxhYmxlVXBsb2FkRGF0YS5VcGxvYWRJZCkge1xuICAgICAgICBlcC5lbWl0KCd1cGxvYWRfaWRfYXZhaWxhYmxlJywgQXZhaWxhYmxlVXBsb2FkRGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcC5lbWl0KCdub19hdmFpbGFibGVfdXBsb2FkX2lkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pOyAvLyDlnKjmnKzlnLDnvJPlrZjmib7lj6/nlKjnmoQgVXBsb2FkSWRcblxuICBlcC5vbignc2Vla19sb2NhbF9hdmFpbF91cGxvYWRfaWQnLCBmdW5jdGlvbiAoUmVtb3RlVXBsb2FkSWRMaXN0KSB7XG4gICAgLy8g5Zyo5pys5Zyw5om+5Y+v55So55qEIFVwbG9hZElkXG4gICAgdmFyIHV1aWQgPSBzZXNzaW9uLmdldEZpbGVJZChwYXJhbXMuQm9keSwgcGFyYW1zLkNodW5rU2l6ZSwgQnVja2V0LCBLZXkpO1xuICAgIHZhciBMb2NhbFVwbG9hZElkTGlzdCA9IHNlc3Npb24uZ2V0VXBsb2FkSWRMaXN0LmNhbGwoc2VsZiwgdXVpZCk7XG5cbiAgICBpZiAoIXV1aWQgfHwgIUxvY2FsVXBsb2FkSWRMaXN0KSB7XG4gICAgICBlcC5lbWl0KCdoYXNfYW5kX2NoZWNrX3VwbG9hZF9pZCcsIFJlbW90ZVVwbG9hZElkTGlzdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHQgPSBmdW5jdGlvbiBuZXh0KGluZGV4KSB7XG4gICAgICAvLyDlpoLmnpzmnKzlnLDmib7kuI3liLDlj6/nlKggVXBsb2FkSWTvvIzlho3kuIDkuKrkuKrpgY3ljobmoKHpqozov5znq69cbiAgICAgIGlmIChpbmRleCA+PSBMb2NhbFVwbG9hZElkTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgZXAuZW1pdCgnaGFzX2FuZF9jaGVja191cGxvYWRfaWQnLCBSZW1vdGVVcGxvYWRJZExpc3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBVcGxvYWRJZCA9IExvY2FsVXBsb2FkSWRMaXN0W2luZGV4XTsgLy8g5aaC5p6c5LiN5Zyo6L+c56uvIFVwbG9hZElkIOWIl+ihqOmHjO+8jOi3s+i/h+W5tuWIoOmZpFxuXG4gICAgICBpZiAoIXV0aWwuaXNJbkFycmF5KFJlbW90ZVVwbG9hZElkTGlzdCwgVXBsb2FkSWQpKSB7XG4gICAgICAgIHNlc3Npb24ucmVtb3ZlVXBsb2FkSWQuY2FsbChzZWxmLCBVcGxvYWRJZCk7XG4gICAgICAgIG5leHQoaW5kZXggKyAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyDlpoLmnpzmraPlnKjkuIrkvKDvvIzot7Pov4dcblxuXG4gICAgICBpZiAoc2Vzc2lvbi51c2luZ1tVcGxvYWRJZF0pIHtcbiAgICAgICAgbmV4dChpbmRleCArIDEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIOWIpOaWrSBVcGxvYWRJZCDmmK/lkKblrZjlnKjnur/kuIpcblxuXG4gICAgICB3aG9sZU11bHRpcGFydExpc3RQYXJ0LmNhbGwoc2VsZiwge1xuICAgICAgICBCdWNrZXQ6IEJ1Y2tldCxcbiAgICAgICAgUmVnaW9uOiBSZWdpb24sXG4gICAgICAgIEtleTogS2V5LFxuICAgICAgICBVcGxvYWRJZDogVXBsb2FkSWQsXG4gICAgICAgIHRyYWNrZXI6IHBhcmFtcy50cmFja2VyXG4gICAgICB9LCBmdW5jdGlvbiAoZXJyLCBQYXJ0TGlzdERhdGEpIHtcbiAgICAgICAgaWYgKCFzZWxmLl9pc1J1bm5pbmdUYXNrKFRhc2tJZCkpIHJldHVybjtcblxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgLy8g5aaC5p6cIFVwbG9hZElkIOiOt+WPluS8muWHuumUme+8jOi3s+i/h+W5tuWIoOmZpFxuICAgICAgICAgIHNlc3Npb24ucmVtb3ZlVXBsb2FkSWQuY2FsbChzZWxmLCBVcGxvYWRJZCk7XG4gICAgICAgICAgbmV4dChpbmRleCArIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIOaJvuWIsOWPr+eUqCBVcGxvYWRJZFxuICAgICAgICAgIGVwLmVtaXQoJ3VwbG9hZF9pZF9hdmFpbGFibGUnLCB7XG4gICAgICAgICAgICBVcGxvYWRJZDogVXBsb2FkSWQsXG4gICAgICAgICAgICBQYXJ0TGlzdDogUGFydExpc3REYXRhLlBhcnRMaXN0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBuZXh0KDApO1xuICB9KTsgLy8g6I635Y+W57q/5LiKIFVwbG9hZElkIOWIl+ihqFxuXG4gIGVwLm9uKCdnZXRfcmVtb3RlX3VwbG9hZF9pZF9saXN0JywgZnVuY3Rpb24gKCkge1xuICAgIC8vIOiOt+WPluespuWQiOadoeS7tueahCBVcGxvYWRJZCDliJfooajvvIzlm6DkuLrlkIzkuIDkuKrmlofku7blj6/ku6XmnInlpJrkuKrkuIrkvKDku7vliqHjgIJcbiAgICB3aG9sZU11bHRpcGFydExpc3QuY2FsbChzZWxmLCB7XG4gICAgICBCdWNrZXQ6IEJ1Y2tldCxcbiAgICAgIFJlZ2lvbjogUmVnaW9uLFxuICAgICAgS2V5OiBLZXksXG4gICAgICB0cmFja2VyOiBwYXJhbXMudHJhY2tlclxuICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGlmICghc2VsZi5faXNSdW5uaW5nVGFzayhUYXNrSWQpKSByZXR1cm47XG4gICAgICBpZiAoZXJyKSByZXR1cm4gZXAuZW1pdCgnZXJyb3InLCBlcnIpOyAvLyDmlbTnkIbov5znq68gVXBsb2FkSWQg5YiX6KGoXG5cbiAgICAgIHZhciBSZW1vdGVVcGxvYWRJZExpc3QgPSB1dGlsLmZpbHRlcihkYXRhLlVwbG9hZExpc3QsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtLktleSA9PT0gS2V5ICYmICghU3RvcmFnZUNsYXNzIHx8IGl0ZW0uU3RvcmFnZUNsYXNzLnRvVXBwZXJDYXNlKCkgPT09IFN0b3JhZ2VDbGFzcy50b1VwcGVyQ2FzZSgpKTtcbiAgICAgIH0pLnJldmVyc2UoKS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uVXBsb2FkSWQgfHwgaXRlbS5VcGxvYWRJRDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoUmVtb3RlVXBsb2FkSWRMaXN0Lmxlbmd0aCkge1xuICAgICAgICBlcC5lbWl0KCdzZWVrX2xvY2FsX2F2YWlsX3VwbG9hZF9pZCcsIFJlbW90ZVVwbG9hZElkTGlzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDov5znq6/msqHmnIkgVXBsb2FkSWTvvIzmuIXnkIbnvJPlrZjnmoQgVXBsb2FkSWRcbiAgICAgICAgdmFyIHV1aWQgPSBzZXNzaW9uLmdldEZpbGVJZChwYXJhbXMuQm9keSwgcGFyYW1zLkNodW5rU2l6ZSwgQnVja2V0LCBLZXkpLFxuICAgICAgICAgICAgTG9jYWxVcGxvYWRJZExpc3Q7XG5cbiAgICAgICAgaWYgKHV1aWQgJiYgKExvY2FsVXBsb2FkSWRMaXN0ID0gc2Vzc2lvbi5nZXRVcGxvYWRJZExpc3QuY2FsbChzZWxmLCB1dWlkKSkpIHtcbiAgICAgICAgICB1dGlsLmVhY2goTG9jYWxVcGxvYWRJZExpc3QsIGZ1bmN0aW9uIChVcGxvYWRJZCkge1xuICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVVcGxvYWRJZC5jYWxsKHNlbGYsIFVwbG9hZElkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVwLmVtaXQoJ25vX2F2YWlsYWJsZV91cGxvYWRfaWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7IC8vIOW8gOWni+aJvuWPr+eUqCBVcGxvYWRJZFxuXG4gIGVwLmVtaXQoJ2dldF9yZW1vdGVfdXBsb2FkX2lkX2xpc3QnKTtcbn0gLy8g6I635Y+W56ym5ZCI5p2h5Lu255qE5YWo6YOo5LiK5Lyg5Lu75YqhICjmnaHku7bljIXmi6wgQnVja2V0LCBSZWdpb24sIFByZWZpeClcblxuXG5mdW5jdGlvbiB3aG9sZU11bHRpcGFydExpc3QocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBVcGxvYWRMaXN0ID0gW107XG4gIHZhciBzZW5kUGFyYW1zID0ge1xuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgUHJlZml4OiBwYXJhbXMuS2V5LFxuICAgIGNhbGxlZEJ5U2RrOiBwYXJhbXMuY2FsbGVkQnlTZGsgfHwgJ3NsaWNlVXBsb2FkRmlsZScsXG4gICAgdHJhY2tlcjogcGFyYW1zLnRyYWNrZXJcbiAgfTtcblxuICB2YXIgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgc2VsZi5tdWx0aXBhcnRMaXN0KHNlbmRQYXJhbXMsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgVXBsb2FkTGlzdC5wdXNoLmFwcGx5KFVwbG9hZExpc3QsIGRhdGEuVXBsb2FkIHx8IFtdKTtcblxuICAgICAgaWYgKGRhdGEuSXNUcnVuY2F0ZWQgPT09ICd0cnVlJykge1xuICAgICAgICAvLyDliJfooajkuI3lrozmlbRcbiAgICAgICAgc2VuZFBhcmFtcy5LZXlNYXJrZXIgPSBkYXRhLk5leHRLZXlNYXJrZXI7XG4gICAgICAgIHNlbmRQYXJhbXMuVXBsb2FkSWRNYXJrZXIgPSBkYXRhLk5leHRVcGxvYWRJZE1hcmtlcjtcbiAgICAgICAgbmV4dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgIFVwbG9hZExpc3Q6IFVwbG9hZExpc3RcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgbmV4dCgpO1xufSAvLyDojrflj5bmjIflrprkuIrkvKDku7vliqHnmoTliIblnZfliJfooahcblxuXG5mdW5jdGlvbiB3aG9sZU11bHRpcGFydExpc3RQYXJ0KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgUGFydExpc3QgPSBbXTtcbiAgdmFyIHNlbmRQYXJhbXMgPSB7XG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBLZXk6IHBhcmFtcy5LZXksXG4gICAgVXBsb2FkSWQ6IHBhcmFtcy5VcGxvYWRJZCxcbiAgICBjYWxsZWRCeVNkazogJ3NsaWNlVXBsb2FkRmlsZScsXG4gICAgdHJhY2tlcjogcGFyYW1zLnRyYWNrZXJcbiAgfTtcblxuICB2YXIgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgc2VsZi5tdWx0aXBhcnRMaXN0UGFydChzZW5kUGFyYW1zLCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIFBhcnRMaXN0LnB1c2guYXBwbHkoUGFydExpc3QsIGRhdGEuUGFydCB8fCBbXSk7XG5cbiAgICAgIGlmIChkYXRhLklzVHJ1bmNhdGVkID09PSAndHJ1ZScpIHtcbiAgICAgICAgLy8g5YiX6KGo5LiN5a6M5pW0XG4gICAgICAgIHNlbmRQYXJhbXMuUGFydE51bWJlck1hcmtlciA9IGRhdGEuTmV4dFBhcnROdW1iZXJNYXJrZXI7XG4gICAgICAgIG5leHQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgICBQYXJ0TGlzdDogUGFydExpc3RcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgbmV4dCgpO1xufSAvLyDkuIrkvKDmlofku7bliIblnZfvvIzljIXmi6xcblxuLypcbiBVcGxvYWRJZCAo5LiK5Lyg5Lu75Yqh57yW5Y+3KVxuIEFzeW5jTGltaXQgKOW5tuWPkemHjynvvIxcbiBTbGljZUxpc3QgKOS4iuS8oOeahOWIhuWdl+aVsOe7hCnvvIxcbiBGaWxlUGF0aCAo5pys5Zyw5paH5Lu255qE5L2N572uKe+8jFxuIFNsaWNlU2l6ZSAo5paH5Lu25YiG5Z2X5aSn5bCPKVxuIEZpbGVTaXplICjmlofku7blpKflsI8pXG4gb25Qcm9ncmVzcyAo5LiK5Lyg5oiQ5Yqf5LmL5ZCO55qE5Zue6LCD5Ye95pWwKVxuICovXG5cblxuZnVuY3Rpb24gdXBsb2FkU2xpY2VMaXN0KHBhcmFtcywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgVGFza0lkID0gcGFyYW1zLlRhc2tJZDtcbiAgdmFyIEJ1Y2tldCA9IHBhcmFtcy5CdWNrZXQ7XG4gIHZhciBSZWdpb24gPSBwYXJhbXMuUmVnaW9uO1xuICB2YXIgS2V5ID0gcGFyYW1zLktleTtcbiAgdmFyIFVwbG9hZERhdGEgPSBwYXJhbXMuVXBsb2FkRGF0YTtcbiAgdmFyIEZpbGVTaXplID0gcGFyYW1zLkZpbGVTaXplO1xuICB2YXIgU2xpY2VTaXplID0gcGFyYW1zLlNsaWNlU2l6ZTtcbiAgdmFyIENodW5rUGFyYWxsZWwgPSBNYXRoLm1pbihwYXJhbXMuQXN5bmNMaW1pdCB8fCBzZWxmLm9wdGlvbnMuQ2h1bmtQYXJhbGxlbExpbWl0IHx8IDEsIDI1Nik7XG4gIHZhciBCb2R5ID0gcGFyYW1zLkJvZHk7XG4gIHZhciBTbGljZUNvdW50ID0gTWF0aC5jZWlsKEZpbGVTaXplIC8gU2xpY2VTaXplKTtcbiAgdmFyIEZpbmlzaFNpemUgPSAwO1xuICB2YXIgU2VydmVyU2lkZUVuY3J5cHRpb24gPSBwYXJhbXMuU2VydmVyU2lkZUVuY3J5cHRpb247XG4gIHZhciBIZWFkZXJzID0gcGFyYW1zLkhlYWRlcnM7XG4gIHZhciBuZWVkVXBsb2FkU2xpY2VzID0gdXRpbC5maWx0ZXIoVXBsb2FkRGF0YS5QYXJ0TGlzdCwgZnVuY3Rpb24gKFNsaWNlSXRlbSkge1xuICAgIGlmIChTbGljZUl0ZW1bJ1VwbG9hZGVkJ10pIHtcbiAgICAgIEZpbmlzaFNpemUgKz0gU2xpY2VJdGVtWydQYXJ0TnVtYmVyJ10gPj0gU2xpY2VDb3VudCA/IEZpbGVTaXplICUgU2xpY2VTaXplIHx8IFNsaWNlU2l6ZSA6IFNsaWNlU2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gIVNsaWNlSXRlbVsnVXBsb2FkZWQnXTtcbiAgfSk7XG4gIHZhciBfb25Qcm9ncmVzczIgPSBwYXJhbXMub25Qcm9ncmVzcztcbiAgQXN5bmMuZWFjaExpbWl0KG5lZWRVcGxvYWRTbGljZXMsIENodW5rUGFyYWxsZWwsIGZ1bmN0aW9uIChTbGljZUl0ZW0sIGFzeW5jQ2FsbGJhY2spIHtcbiAgICBpZiAoIXNlbGYuX2lzUnVubmluZ1Rhc2soVGFza0lkKSkgcmV0dXJuO1xuICAgIHZhciBQYXJ0TnVtYmVyID0gU2xpY2VJdGVtWydQYXJ0TnVtYmVyJ107XG4gICAgdmFyIGN1cnJlbnRTaXplID0gTWF0aC5taW4oRmlsZVNpemUsIFNsaWNlSXRlbVsnUGFydE51bWJlciddICogU2xpY2VTaXplKSAtIChTbGljZUl0ZW1bJ1BhcnROdW1iZXInXSAtIDEpICogU2xpY2VTaXplO1xuICAgIHZhciBwcmVBZGRTaXplID0gMDtcbiAgICB1cGxvYWRTbGljZUl0ZW0uY2FsbChzZWxmLCB7XG4gICAgICBUYXNrSWQ6IFRhc2tJZCxcbiAgICAgIEJ1Y2tldDogQnVja2V0LFxuICAgICAgUmVnaW9uOiBSZWdpb24sXG4gICAgICBLZXk6IEtleSxcbiAgICAgIFNsaWNlU2l6ZTogU2xpY2VTaXplLFxuICAgICAgRmlsZVNpemU6IEZpbGVTaXplLFxuICAgICAgUGFydE51bWJlcjogUGFydE51bWJlcixcbiAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uOiBTZXJ2ZXJTaWRlRW5jcnlwdGlvbixcbiAgICAgIEJvZHk6IEJvZHksXG4gICAgICBVcGxvYWREYXRhOiBVcGxvYWREYXRhLFxuICAgICAgSGVhZGVyczogSGVhZGVycyxcbiAgICAgIG9uUHJvZ3Jlc3M6IGZ1bmN0aW9uIG9uUHJvZ3Jlc3MoZGF0YSkge1xuICAgICAgICBGaW5pc2hTaXplICs9IGRhdGEubG9hZGVkIC0gcHJlQWRkU2l6ZTtcbiAgICAgICAgcHJlQWRkU2l6ZSA9IGRhdGEubG9hZGVkO1xuXG4gICAgICAgIF9vblByb2dyZXNzMih7XG4gICAgICAgICAgbG9hZGVkOiBGaW5pc2hTaXplLFxuICAgICAgICAgIHRvdGFsOiBGaWxlU2l6ZVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB0cmFja2VyOiBwYXJhbXMudHJhY2tlclxuICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGlmICghc2VsZi5faXNSdW5uaW5nVGFzayhUYXNrSWQpKSByZXR1cm47XG4gICAgICBpZiAoIWVyciAmJiAhZGF0YS5FVGFnKSBlcnIgPSAnZ2V0IEVUYWcgZXJyb3IsIHBsZWFzZSBhZGQgXCJFVGFnXCIgdG8gQ09SUyBFeHBvc2VIZWFkZXIgc2V0dGluZy4oIOiOt+WPlkVUYWflpLHotKXvvIzor7flnKhDT1JTIEV4cG9zZUhlYWRlcuiuvue9ruS4rea3u+WKoEVUYWfvvIzor7flj4LogIPmlofmoaPvvJpodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2LzEzMzE4ICknO1xuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIEZpbmlzaFNpemUgLT0gcHJlQWRkU2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEZpbmlzaFNpemUgKz0gY3VycmVudFNpemUgLSBwcmVBZGRTaXplO1xuICAgICAgICBTbGljZUl0ZW0uRVRhZyA9IGRhdGEuRVRhZztcbiAgICAgIH1cblxuICAgICAgX29uUHJvZ3Jlc3MyKHtcbiAgICAgICAgbG9hZGVkOiBGaW5pc2hTaXplLFxuICAgICAgICB0b3RhbDogRmlsZVNpemVcbiAgICAgIH0pO1xuXG4gICAgICBhc3luY0NhbGxiYWNrKGVyciB8fCBudWxsLCBkYXRhKTtcbiAgICB9KTtcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmICghc2VsZi5faXNSdW5uaW5nVGFzayhUYXNrSWQpKSByZXR1cm47XG4gICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG4gICAgY2IobnVsbCwge1xuICAgICAgVXBsb2FkSWQ6IFVwbG9hZERhdGEuVXBsb2FkSWQsXG4gICAgICBTbGljZUxpc3Q6IFVwbG9hZERhdGEuUGFydExpc3RcbiAgICB9KTtcbiAgfSk7XG59IC8vIOS4iuS8oOaMh+WumuWIhueJh1xuXG5cbmZ1bmN0aW9uIHVwbG9hZFNsaWNlSXRlbShwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIFRhc2tJZCA9IHBhcmFtcy5UYXNrSWQ7XG4gIHZhciBCdWNrZXQgPSBwYXJhbXMuQnVja2V0O1xuICB2YXIgUmVnaW9uID0gcGFyYW1zLlJlZ2lvbjtcbiAgdmFyIEtleSA9IHBhcmFtcy5LZXk7XG4gIHZhciBGaWxlU2l6ZSA9IHBhcmFtcy5GaWxlU2l6ZTtcbiAgdmFyIEZpbGVCb2R5ID0gcGFyYW1zLkJvZHk7XG4gIHZhciBQYXJ0TnVtYmVyID0gcGFyYW1zLlBhcnROdW1iZXIgKiAxO1xuICB2YXIgU2xpY2VTaXplID0gcGFyYW1zLlNsaWNlU2l6ZTtcbiAgdmFyIFNlcnZlclNpZGVFbmNyeXB0aW9uID0gcGFyYW1zLlNlcnZlclNpZGVFbmNyeXB0aW9uO1xuICB2YXIgVXBsb2FkRGF0YSA9IHBhcmFtcy5VcGxvYWREYXRhO1xuICB2YXIgSGVhZGVycyA9IHBhcmFtcy5IZWFkZXJzIHx8IHt9O1xuICB2YXIgQ2h1bmtSZXRyeVRpbWVzID0gc2VsZi5vcHRpb25zLkNodW5rUmV0cnlUaW1lcyArIDE7XG4gIHZhciBzdGFydCA9IFNsaWNlU2l6ZSAqIChQYXJ0TnVtYmVyIC0gMSk7XG4gIHZhciBDb250ZW50TGVuZ3RoID0gU2xpY2VTaXplO1xuICB2YXIgZW5kID0gc3RhcnQgKyBTbGljZVNpemU7XG5cbiAgaWYgKGVuZCA+IEZpbGVTaXplKSB7XG4gICAgZW5kID0gRmlsZVNpemU7XG4gICAgQ29udGVudExlbmd0aCA9IGVuZCAtIHN0YXJ0O1xuICB9XG5cbiAgdmFyIGhlYWRlcnNXaGl0ZUxpc3QgPSBbJ3gtY29zLXRyYWZmaWMtbGltaXQnLCAneC1jb3MtbWltZS1saW1pdCddO1xuICB2YXIgaGVhZGVycyA9IHt9O1xuICB1dGlsLmVhY2goSGVhZGVycywgZnVuY3Rpb24gKHYsIGspIHtcbiAgICBpZiAoaGVhZGVyc1doaXRlTGlzdC5pbmRleE9mKGspID4gLTEpIHtcbiAgICAgIGhlYWRlcnNba10gPSB2O1xuICAgIH1cbiAgfSk7XG4gIHZhciBQYXJ0SXRlbSA9IFVwbG9hZERhdGEuUGFydExpc3RbUGFydE51bWJlciAtIDFdO1xuICBBc3luYy5yZXRyeShDaHVua1JldHJ5VGltZXMsIGZ1bmN0aW9uICh0cnlDYWxsYmFjaykge1xuICAgIGlmICghc2VsZi5faXNSdW5uaW5nVGFzayhUYXNrSWQpKSByZXR1cm47XG4gICAgdXRpbC5maWxlU2xpY2UoRmlsZUJvZHksIHN0YXJ0LCBlbmQsIHRydWUsIGZ1bmN0aW9uIChCb2R5KSB7XG4gICAgICBzZWxmLm11bHRpcGFydFVwbG9hZCh7XG4gICAgICAgIFRhc2tJZDogVGFza0lkLFxuICAgICAgICBCdWNrZXQ6IEJ1Y2tldCxcbiAgICAgICAgUmVnaW9uOiBSZWdpb24sXG4gICAgICAgIEtleTogS2V5LFxuICAgICAgICBDb250ZW50TGVuZ3RoOiBDb250ZW50TGVuZ3RoLFxuICAgICAgICBQYXJ0TnVtYmVyOiBQYXJ0TnVtYmVyLFxuICAgICAgICBVcGxvYWRJZDogVXBsb2FkRGF0YS5VcGxvYWRJZCxcbiAgICAgICAgU2VydmVyU2lkZUVuY3J5cHRpb246IFNlcnZlclNpZGVFbmNyeXB0aW9uLFxuICAgICAgICBCb2R5OiBCb2R5LFxuICAgICAgICBIZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICBvblByb2dyZXNzOiBwYXJhbXMub25Qcm9ncmVzcyxcbiAgICAgICAgY2FsbGVkQnlTZGs6ICdzbGljZVVwbG9hZEZpbGUnLFxuICAgICAgICB0cmFja2VyOiBwYXJhbXMudHJhY2tlclxuICAgICAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICBpZiAoIXNlbGYuX2lzUnVubmluZ1Rhc2soVGFza0lkKSkgcmV0dXJuO1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gdHJ5Q2FsbGJhY2soZXJyKTtcbiAgICAgICAgUGFydEl0ZW0uVXBsb2FkZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ5Q2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmICghc2VsZi5faXNSdW5uaW5nVGFzayhUYXNrSWQpKSByZXR1cm47XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVyciwgZGF0YSk7XG4gIH0pO1xufSAvLyDlrozmiJDliIblnZfkuIrkvKBcblxuXG5mdW5jdGlvbiB1cGxvYWRTbGljZUNvbXBsZXRlKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIEJ1Y2tldCA9IHBhcmFtcy5CdWNrZXQ7XG4gIHZhciBSZWdpb24gPSBwYXJhbXMuUmVnaW9uO1xuICB2YXIgS2V5ID0gcGFyYW1zLktleTtcbiAgdmFyIFVwbG9hZElkID0gcGFyYW1zLlVwbG9hZElkO1xuICB2YXIgU2xpY2VMaXN0ID0gcGFyYW1zLlNsaWNlTGlzdDtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgQ2h1bmtSZXRyeVRpbWVzID0gdGhpcy5vcHRpb25zLkNodW5rUmV0cnlUaW1lcyArIDE7XG4gIHZhciBIZWFkZXJzID0gcGFyYW1zLkhlYWRlcnM7XG4gIHZhciBQYXJ0cyA9IFNsaWNlTGlzdC5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgUGFydE51bWJlcjogaXRlbS5QYXJ0TnVtYmVyLFxuICAgICAgRVRhZzogaXRlbS5FVGFnXG4gICAgfTtcbiAgfSk7IC8vIOWujOaIkOS4iuS8oOeahOivt+axguS5n+WBmumHjeivlVxuXG4gIEFzeW5jLnJldHJ5KENodW5rUmV0cnlUaW1lcywgZnVuY3Rpb24gKHRyeUNhbGxiYWNrKSB7XG4gICAgc2VsZi5tdWx0aXBhcnRDb21wbGV0ZSh7XG4gICAgICBCdWNrZXQ6IEJ1Y2tldCxcbiAgICAgIFJlZ2lvbjogUmVnaW9uLFxuICAgICAgS2V5OiBLZXksXG4gICAgICBVcGxvYWRJZDogVXBsb2FkSWQsXG4gICAgICBQYXJ0czogUGFydHMsXG4gICAgICBIZWFkZXJzOiBIZWFkZXJzLFxuICAgICAgY2FsbGVkQnlTZGs6ICdzbGljZVVwbG9hZEZpbGUnLFxuICAgICAgdHJhY2tlcjogcGFyYW1zLnRyYWNrZXJcbiAgICB9LCB0cnlDYWxsYmFjayk7XG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBjYWxsYmFjayhlcnIsIGRhdGEpO1xuICB9KTtcbn0gLy8g5oqb5byD5YiG5Z2X5LiK5Lyg5Lu75YqhXG5cbi8qXG4gQXN5bmNMaW1pdCAo5oqb5byD5LiK5Lyg5Lu75Yqh55qE5bm25Y+R6YePKe+8jFxuIFVwbG9hZElkICjkuIrkvKDku7vliqHnmoTnvJblj7fvvIzlvZMgTGV2ZWwg5Li6IHRhc2sg5pe25YCZ6ZyA6KaBKVxuIExldmVsICjmipvlvIPliIblnZfkuIrkvKDku7vliqHnmoTnuqfliKvvvIx0YXNrIDog5oqb5byD5oyH5a6a55qE5LiK5Lyg5Lu75Yqh77yMZmlsZSDvvJog5oqb5byD5oyH5a6a55qE5paH5Lu25a+55bqU55qE5LiK5Lyg5Lu75Yqh77yM5YW25LuW5YC8IO+8muaKm+W8g+aMh+WumkJ1Y2tldCDnmoTlhajpg6jkuIrkvKDku7vliqEpXG4gKi9cblxuXG5mdW5jdGlvbiBhYm9ydFVwbG9hZFRhc2socGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgQnVja2V0ID0gcGFyYW1zLkJ1Y2tldDtcbiAgdmFyIFJlZ2lvbiA9IHBhcmFtcy5SZWdpb247XG4gIHZhciBLZXkgPSBwYXJhbXMuS2V5O1xuICB2YXIgVXBsb2FkSWQgPSBwYXJhbXMuVXBsb2FkSWQ7XG4gIHZhciBMZXZlbCA9IHBhcmFtcy5MZXZlbCB8fCAndGFzayc7XG4gIHZhciBBc3luY0xpbWl0ID0gcGFyYW1zLkFzeW5jTGltaXQ7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGVwID0gbmV3IEV2ZW50UHJveHkoKTtcbiAgZXAub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVyckRhdGEpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soZXJyRGF0YSk7XG4gIH0pOyAvLyDlt7Lnu4/ojrflj5bliLDpnIDopoHmipvlvIPnmoTku7vliqHliJfooahcblxuICBlcC5vbignZ2V0X2Fib3J0X2FycmF5JywgZnVuY3Rpb24gKEFib3J0QXJyYXkpIHtcbiAgICBhYm9ydFVwbG9hZFRhc2tBcnJheS5jYWxsKHNlbGYsIHtcbiAgICAgIEJ1Y2tldDogQnVja2V0LFxuICAgICAgUmVnaW9uOiBSZWdpb24sXG4gICAgICBLZXk6IEtleSxcbiAgICAgIEhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgICAgQXN5bmNMaW1pdDogQXN5bmNMaW1pdCxcbiAgICAgIEFib3J0QXJyYXk6IEFib3J0QXJyYXlcbiAgICB9LCBjYWxsYmFjayk7XG4gIH0pO1xuXG4gIGlmIChMZXZlbCA9PT0gJ2J1Y2tldCcpIHtcbiAgICAvLyBCdWNrZXQg57qn5Yir55qE5Lu75Yqh5oqb5byD77yM5oqb5byD6K+lIEJ1Y2tldCDkuIvnmoTlhajpg6jkuIrkvKDku7vliqFcbiAgICB3aG9sZU11bHRpcGFydExpc3QuY2FsbChzZWxmLCB7XG4gICAgICBCdWNrZXQ6IEJ1Y2tldCxcbiAgICAgIFJlZ2lvbjogUmVnaW9uLFxuICAgICAgY2FsbGVkQnlTZGs6ICdhYm9ydFVwbG9hZFRhc2snXG4gICAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICBlcC5lbWl0KCdnZXRfYWJvcnRfYXJyYXknLCBkYXRhLlVwbG9hZExpc3QgfHwgW10pO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKExldmVsID09PSAnZmlsZScpIHtcbiAgICAvLyDmlofku7bnuqfliKvnmoTku7vliqHmipvlvIPvvIzmipvlvIPor6Xmlofku7bnmoTlhajpg6jkuIrkvKDku7vliqFcbiAgICBpZiAoIUtleSkgcmV0dXJuIGNhbGxiYWNrKHV0aWwuZXJyb3IobmV3IEVycm9yKCdhYm9ydF91cGxvYWRfdGFza19ub19rZXknKSkpO1xuICAgIHdob2xlTXVsdGlwYXJ0TGlzdC5jYWxsKHNlbGYsIHtcbiAgICAgIEJ1Y2tldDogQnVja2V0LFxuICAgICAgUmVnaW9uOiBSZWdpb24sXG4gICAgICBLZXk6IEtleSxcbiAgICAgIGNhbGxlZEJ5U2RrOiAnYWJvcnRVcGxvYWRUYXNrJ1xuICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgZXAuZW1pdCgnZ2V0X2Fib3J0X2FycmF5JywgZGF0YS5VcGxvYWRMaXN0IHx8IFtdKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChMZXZlbCA9PT0gJ3Rhc2snKSB7XG4gICAgLy8g5Y2V5Liq5Lu75Yqh57qn5Yir55qE5Lu75Yqh5oqb5byD77yM5oqb5byD5oyH5a6aIFVwbG9hZElkIOeahOS4iuS8oOS7u+WKoVxuICAgIGlmICghVXBsb2FkSWQpIHJldHVybiBjYWxsYmFjayh1dGlsLmVycm9yKG5ldyBFcnJvcignYWJvcnRfdXBsb2FkX3Rhc2tfbm9faWQnKSkpO1xuICAgIGlmICghS2V5KSByZXR1cm4gY2FsbGJhY2sodXRpbC5lcnJvcihuZXcgRXJyb3IoJ2Fib3J0X3VwbG9hZF90YXNrX25vX2tleScpKSk7XG4gICAgZXAuZW1pdCgnZ2V0X2Fib3J0X2FycmF5JywgW3tcbiAgICAgIEtleTogS2V5LFxuICAgICAgVXBsb2FkSWQ6IFVwbG9hZElkXG4gICAgfV0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjYWxsYmFjayh1dGlsLmVycm9yKG5ldyBFcnJvcignYWJvcnRfdW5rbm93bl9sZXZlbCcpKSk7XG4gIH1cbn0gLy8g5om56YeP5oqb5byD5YiG5Z2X5LiK5Lyg5Lu75YqhXG5cblxuZnVuY3Rpb24gYWJvcnRVcGxvYWRUYXNrQXJyYXkocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgQnVja2V0ID0gcGFyYW1zLkJ1Y2tldDtcbiAgdmFyIFJlZ2lvbiA9IHBhcmFtcy5SZWdpb247XG4gIHZhciBLZXkgPSBwYXJhbXMuS2V5O1xuICB2YXIgQWJvcnRBcnJheSA9IHBhcmFtcy5BYm9ydEFycmF5O1xuICB2YXIgQXN5bmNMaW1pdCA9IHBhcmFtcy5Bc3luY0xpbWl0IHx8IDE7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHJlc3VsdExpc3QgPSBuZXcgQXJyYXkoQWJvcnRBcnJheS5sZW5ndGgpO1xuICBBc3luYy5lYWNoTGltaXQoQWJvcnRBcnJheSwgQXN5bmNMaW1pdCwgZnVuY3Rpb24gKEFib3J0SXRlbSwgbmV4dEl0ZW0pIHtcbiAgICB2YXIgZWFjaEluZGV4ID0gaW5kZXg7XG5cbiAgICBpZiAoS2V5ICYmIEtleSAhPT0gQWJvcnRJdGVtLktleSkge1xuICAgICAgcmVzdWx0TGlzdFtlYWNoSW5kZXhdID0ge1xuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIEtleU5vdE1hdGNoOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuZXh0SXRlbShudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgVXBsb2FkSWQgPSBBYm9ydEl0ZW0uVXBsb2FkSWQgfHwgQWJvcnRJdGVtLlVwbG9hZElEO1xuICAgIHNlbGYubXVsdGlwYXJ0QWJvcnQoe1xuICAgICAgQnVja2V0OiBCdWNrZXQsXG4gICAgICBSZWdpb246IFJlZ2lvbixcbiAgICAgIEtleTogQWJvcnRJdGVtLktleSxcbiAgICAgIEhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgICAgVXBsb2FkSWQ6IFVwbG9hZElkXG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgdmFyIHRhc2sgPSB7XG4gICAgICAgIEJ1Y2tldDogQnVja2V0LFxuICAgICAgICBSZWdpb246IFJlZ2lvbixcbiAgICAgICAgS2V5OiBBYm9ydEl0ZW0uS2V5LFxuICAgICAgICBVcGxvYWRJZDogVXBsb2FkSWRcbiAgICAgIH07XG4gICAgICByZXN1bHRMaXN0W2VhY2hJbmRleF0gPSB7XG4gICAgICAgIGVycm9yOiBlcnIsXG4gICAgICAgIHRhc2s6IHRhc2tcbiAgICAgIH07XG4gICAgICBuZXh0SXRlbShudWxsKTtcbiAgICB9KTtcbiAgICBpbmRleCsrO1xuICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgdmFyIHN1Y2Nlc3NMaXN0ID0gW107XG4gICAgdmFyIGVycm9yTGlzdCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJlc3VsdExpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gcmVzdWx0TGlzdFtpXTtcblxuICAgICAgaWYgKGl0ZW1bJ3Rhc2snXSkge1xuICAgICAgICBpZiAoaXRlbVsnZXJyb3InXSkge1xuICAgICAgICAgIGVycm9yTGlzdC5wdXNoKGl0ZW1bJ3Rhc2snXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VjY2Vzc0xpc3QucHVzaChpdGVtWyd0YXNrJ10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIHN1Y2Nlc3NMaXN0OiBzdWNjZXNzTGlzdCxcbiAgICAgIGVycm9yTGlzdDogZXJyb3JMaXN0XG4gICAgfSk7XG4gIH0pO1xufSAvLyDpq5jnuqfkuIrkvKBcblxuXG5mdW5jdGlvbiB1cGxvYWRGaWxlKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzOyAvLyDliKTmlq3lpJrlpKfnmoTmlofku7bkvb/nlKjliIbniYfkuIrkvKBcblxuICB2YXIgU2xpY2VTaXplID0gcGFyYW1zLlNsaWNlU2l6ZSA9PT0gdW5kZWZpbmVkID8gc2VsZi5vcHRpb25zLlNsaWNlU2l6ZSA6IHBhcmFtcy5TbGljZVNpemU7XG4gIHZhciB0YXNrTGlzdCA9IFtdO1xuICB2YXIgQm9keSA9IHBhcmFtcy5Cb2R5O1xuICB2YXIgRmlsZVNpemUgPSBCb2R5LnNpemUgfHwgQm9keS5sZW5ndGggfHwgMDtcbiAgdmFyIGZpbGVJbmZvID0ge1xuICAgIFRhc2tJZDogJydcbiAgfTsgLy8g5LiK5Lyg6ZO+6LevXG5cbiAgaWYgKHNlbGYub3B0aW9ucy5FbmFibGVUcmFja2VyKSB7XG4gICAgdmFyIGFjY2VsZXJhdGUgPSBzZWxmLm9wdGlvbnMuVXNlQWNjZWxlcmF0ZSB8fCBzZWxmLm9wdGlvbnMuRG9tYWluLmluY2x1ZGVzKCdhY2NlbGVyYXRlLicpO1xuICAgIHBhcmFtcy50cmFja2VyID0gbmV3IFRyYWNrZXIoe1xuICAgICAgYnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgICAgcmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgICAgYXBpTmFtZTogJ3VwbG9hZEZpbGUnLFxuICAgICAgZmlsZUtleTogcGFyYW1zLktleSxcbiAgICAgIGZpbGVTaXplOiBGaWxlU2l6ZSxcbiAgICAgIGFjY2VsZXJhdGU6IGFjY2VsZXJhdGUsXG4gICAgICBkZWVwVHJhY2tlcjogc2VsZi5vcHRpb25zLkRlZXBUcmFja2VyLFxuICAgICAgY3VzdG9tSWQ6IHNlbGYub3B0aW9ucy5DdXN0b21JZCxcbiAgICAgIGRlbGF5OiBzZWxmLm9wdGlvbnMuVHJhY2tlckRlbGF5XG4gICAgfSk7XG4gIH0gLy8g5pW055CGIG9wdGlvbu+8jOeUqOS6jui/lOWbnue7meWbnuiwg1xuXG5cbiAgdXRpbC5lYWNoKHBhcmFtcywgZnVuY3Rpb24gKHYsIGspIHtcbiAgICBpZiAoX3R5cGVvZih2KSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHYgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbGVJbmZvW2tdID0gdjtcbiAgICB9XG4gIH0pOyAvLyDlpITnkIbmlofku7YgVGFza1JlYWR5XG5cbiAgdmFyIF9vblRhc2tSZWFkeSA9IHBhcmFtcy5vblRhc2tSZWFkeTtcblxuICB2YXIgb25UYXNrUmVhZHkgPSBmdW5jdGlvbiBvblRhc2tSZWFkeSh0aWQpIHtcbiAgICBmaWxlSW5mby5UYXNrSWQgPSB0aWQ7XG4gICAgX29uVGFza1JlYWR5ICYmIF9vblRhc2tSZWFkeSh0aWQpO1xuICB9O1xuXG4gIHBhcmFtcy5vblRhc2tSZWFkeSA9IG9uVGFza1JlYWR5OyAvLyDmt7vliqDkuIrkvKDku7vliqEs6LaF6L+H6ZiI5YC85L2/55So5YiG5Z2X5LiK5Lyg77yM5bCP5LqO562J5LqO5YiZ566A5Y2V5LiK5LygXG5cbiAgdmFyIGFwaSA9IEZpbGVTaXplID4gU2xpY2VTaXplID8gJ3NsaWNlVXBsb2FkRmlsZScgOiAncHV0T2JqZWN0JzsgLy8g5aSE55CG5paH5Lu25a6M5oiQXG5cbiAgdmFyIF9vbkZpbGVGaW5pc2ggPSBwYXJhbXMub25GaWxlRmluaXNoO1xuXG4gIHZhciBvbkZpbGVGaW5pc2ggPSBmdW5jdGlvbiBvbkZpbGVGaW5pc2goZXJyLCBkYXRhKSB7XG4gICAgLy8g5qC85byP5YyW5LiK5oql5Y+C5pWw5bm25LiK5oqlXG4gICAgcGFyYW1zLnRyYWNrZXIgJiYgcGFyYW1zLnRyYWNrZXIuZm9ybWF0UmVzdWx0KGVyciwgZGF0YSk7XG4gICAgX29uRmlsZUZpbmlzaCAmJiBfb25GaWxlRmluaXNoKGVyciwgZGF0YSwgZmlsZUluZm8pO1xuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGVyciwgZGF0YSk7XG4gIH07XG5cbiAgdGFza0xpc3QucHVzaCh7XG4gICAgYXBpOiBhcGksXG4gICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgY2FsbGJhY2s6IG9uRmlsZUZpbmlzaFxuICB9KTtcblxuICBzZWxmLl9hZGRUYXNrcyh0YXNrTGlzdCk7XG59IC8vIOaJuemHj+S4iuS8oOaWh+S7tlxuXG5cbmZ1bmN0aW9uIHVwbG9hZEZpbGVzKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzOyAvLyDliKTmlq3lpJrlpKfnmoTmlofku7bkvb/nlKjliIbniYfkuIrkvKBcblxuICB2YXIgU2xpY2VTaXplID0gcGFyYW1zLlNsaWNlU2l6ZSA9PT0gdW5kZWZpbmVkID8gc2VsZi5vcHRpb25zLlNsaWNlU2l6ZSA6IHBhcmFtcy5TbGljZVNpemU7IC8vIOaxh+aAu+i/lOWbnui/m+W6plxuXG4gIHZhciBUb3RhbFNpemUgPSAwO1xuICB2YXIgVG90YWxGaW5pc2ggPSAwO1xuICB2YXIgb25Ub3RhbFByb2dyZXNzID0gdXRpbC50aHJvdHRsZU9uUHJvZ3Jlc3MuY2FsbChzZWxmLCBUb3RhbEZpbmlzaCwgcGFyYW1zLm9uUHJvZ3Jlc3MpOyAvLyDmsYfmgLvov5Tlm57lm57osINcblxuICB2YXIgdW5GaW5pc2hDb3VudCA9IHBhcmFtcy5maWxlcy5sZW5ndGg7XG4gIHZhciBfb25Ub3RhbEZpbGVGaW5pc2ggPSBwYXJhbXMub25GaWxlRmluaXNoO1xuICB2YXIgcmVzdWx0TGlzdCA9IEFycmF5KHVuRmluaXNoQ291bnQpO1xuXG4gIHZhciBvblRvdGFsRmlsZUZpbmlzaCA9IGZ1bmN0aW9uIG9uVG90YWxGaWxlRmluaXNoKGVyciwgZGF0YSwgb3B0aW9ucykge1xuICAgIG9uVG90YWxQcm9ncmVzcyhudWxsLCB0cnVlKTtcbiAgICBfb25Ub3RhbEZpbGVGaW5pc2ggJiYgX29uVG90YWxGaWxlRmluaXNoKGVyciwgZGF0YSwgb3B0aW9ucyk7XG4gICAgcmVzdWx0TGlzdFtvcHRpb25zLkluZGV4XSA9IHtcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICBlcnJvcjogZXJyLFxuICAgICAgZGF0YTogZGF0YVxuICAgIH07XG5cbiAgICBpZiAoLS11bkZpbmlzaENvdW50IDw9IDAgJiYgY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgZmlsZXM6IHJlc3VsdExpc3RcbiAgICAgIH0pO1xuICAgIH1cbiAgfTsgLy8g5byA5aeL5aSE55CG5q+P5Liq5paH5Lu2XG5cblxuICB2YXIgdGFza0xpc3QgPSBbXTtcbiAgdXRpbC5lYWNoKHBhcmFtcy5maWxlcywgZnVuY3Rpb24gKGZpbGVQYXJhbXMsIGluZGV4KSB7XG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIOWvuem9kCBub2RlanMg57yp6L+bXG4gICAgICB2YXIgQm9keSA9IGZpbGVQYXJhbXMuQm9keTtcbiAgICAgIHZhciBGaWxlU2l6ZSA9IEJvZHkuc2l6ZSB8fCBCb2R5Lmxlbmd0aCB8fCAwO1xuICAgICAgdmFyIGZpbGVJbmZvID0ge1xuICAgICAgICBJbmRleDogaW5kZXgsXG4gICAgICAgIFRhc2tJZDogJydcbiAgICAgIH07IC8vIOabtOaWsOaWh+S7tuaAu+Wkp+Wwj1xuXG4gICAgICBUb3RhbFNpemUgKz0gRmlsZVNpemU7IC8vIOWNleS4quaWh+S7tuS4iuS8oOmTvui3r1xuXG4gICAgICBpZiAoc2VsZi5vcHRpb25zLkVuYWJsZVRyYWNrZXIpIHtcbiAgICAgICAgdmFyIGFjY2VsZXJhdGUgPSBzZWxmLm9wdGlvbnMuVXNlQWNjZWxlcmF0ZSB8fCBzZWxmLm9wdGlvbnMuRG9tYWluLmluY2x1ZGVzKCdhY2NlbGVyYXRlLicpO1xuICAgICAgICBmaWxlUGFyYW1zLnRyYWNrZXIgPSBuZXcgVHJhY2tlcih7XG4gICAgICAgICAgYnVja2V0OiBmaWxlUGFyYW1zLkJ1Y2tldCxcbiAgICAgICAgICByZWdpb246IGZpbGVQYXJhbXMuUmVnaW9uLFxuICAgICAgICAgIGFwaU5hbWU6ICd1cGxvYWRGaWxlcycsXG4gICAgICAgICAgZmlsZUtleTogZmlsZVBhcmFtcy5LZXksXG4gICAgICAgICAgZmlsZVNpemU6IEZpbGVTaXplLFxuICAgICAgICAgIGFjY2VsZXJhdGU6IGFjY2VsZXJhdGUsXG4gICAgICAgICAgZGVlcFRyYWNrZXI6IHNlbGYub3B0aW9ucy5EZWVwVHJhY2tlcixcbiAgICAgICAgICBjdXN0b21JZDogc2VsZi5vcHRpb25zLkN1c3RvbUlkLFxuICAgICAgICAgIGRlbGF5OiBzZWxmLm9wdGlvbnMuVHJhY2tlckRlbGF5XG4gICAgICAgIH0pO1xuICAgICAgfSAvLyDmlbTnkIYgb3B0aW9u77yM55So5LqO6L+U5Zue57uZ5Zue6LCDXG5cblxuICAgICAgdXRpbC5lYWNoKGZpbGVQYXJhbXMsIGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgIGlmIChfdHlwZW9mKHYpICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGZpbGVJbmZvW2tdID0gdjtcbiAgICAgICAgfVxuICAgICAgfSk7IC8vIOWkhOeQhuWNleS4quaWh+S7tiBUYXNrUmVhZHlcblxuICAgICAgdmFyIF9vblRhc2tSZWFkeSA9IGZpbGVQYXJhbXMub25UYXNrUmVhZHk7XG5cbiAgICAgIHZhciBvblRhc2tSZWFkeSA9IGZ1bmN0aW9uIG9uVGFza1JlYWR5KHRpZCkge1xuICAgICAgICBmaWxlSW5mby5UYXNrSWQgPSB0aWQ7XG4gICAgICAgIF9vblRhc2tSZWFkeSAmJiBfb25UYXNrUmVhZHkodGlkKTtcbiAgICAgIH07XG5cbiAgICAgIGZpbGVQYXJhbXMub25UYXNrUmVhZHkgPSBvblRhc2tSZWFkeTsgLy8g5aSE55CG5Y2V5Liq5paH5Lu26L+b5bqmXG5cbiAgICAgIHZhciBQcmVBZGRTaXplID0gMDtcbiAgICAgIHZhciBfb25Qcm9ncmVzcyA9IGZpbGVQYXJhbXMub25Qcm9ncmVzcztcblxuICAgICAgdmFyIG9uUHJvZ3Jlc3MgPSBmdW5jdGlvbiBvblByb2dyZXNzKGluZm8pIHtcbiAgICAgICAgVG90YWxGaW5pc2ggPSBUb3RhbEZpbmlzaCAtIFByZUFkZFNpemUgKyBpbmZvLmxvYWRlZDtcbiAgICAgICAgUHJlQWRkU2l6ZSA9IGluZm8ubG9hZGVkO1xuICAgICAgICBfb25Qcm9ncmVzcyAmJiBfb25Qcm9ncmVzcyhpbmZvKTtcbiAgICAgICAgb25Ub3RhbFByb2dyZXNzKHtcbiAgICAgICAgICBsb2FkZWQ6IFRvdGFsRmluaXNoLFxuICAgICAgICAgIHRvdGFsOiBUb3RhbFNpemVcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBmaWxlUGFyYW1zLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzOyAvLyDmt7vliqDkuIrkvKDku7vliqFcblxuICAgICAgdmFyIGFwaSA9IEZpbGVTaXplID4gU2xpY2VTaXplID8gJ3NsaWNlVXBsb2FkRmlsZScgOiAncHV0T2JqZWN0JzsgLy8g5aSE55CG5Y2V5Liq5paH5Lu25a6M5oiQXG5cbiAgICAgIHZhciBfb25GaWxlRmluaXNoID0gZmlsZVBhcmFtcy5vbkZpbGVGaW5pc2g7XG5cbiAgICAgIHZhciBvbkZpbGVGaW5pc2ggPSBmdW5jdGlvbiBvbkZpbGVGaW5pc2goZXJyLCBkYXRhKSB7XG4gICAgICAgIC8vIOagvOW8j+WMluS4iuaKpeWPguaVsOW5tuS4iuaKpVxuICAgICAgICBmaWxlUGFyYW1zLnRyYWNrZXIgJiYgZmlsZVBhcmFtcy50cmFja2VyLmZvcm1hdFJlc3VsdChlcnIsIGRhdGEpO1xuICAgICAgICBfb25GaWxlRmluaXNoICYmIF9vbkZpbGVGaW5pc2goZXJyLCBkYXRhKTtcbiAgICAgICAgb25Ub3RhbEZpbGVGaW5pc2ggJiYgb25Ub3RhbEZpbGVGaW5pc2goZXJyLCBkYXRhLCBmaWxlSW5mbyk7XG4gICAgICB9O1xuXG4gICAgICB0YXNrTGlzdC5wdXNoKHtcbiAgICAgICAgYXBpOiBhcGksXG4gICAgICAgIHBhcmFtczogZmlsZVBhcmFtcyxcbiAgICAgICAgY2FsbGJhY2s6IG9uRmlsZUZpbmlzaFxuICAgICAgfSk7XG4gICAgfSkoKTtcbiAgfSk7XG5cbiAgc2VsZi5fYWRkVGFza3ModGFza0xpc3QpO1xufSAvLyDliIbniYflpI3liLbmlofku7ZcblxuXG5mdW5jdGlvbiBzbGljZUNvcHlGaWxlKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIGVwID0gbmV3IEV2ZW50UHJveHkoKTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgQnVja2V0ID0gcGFyYW1zLkJ1Y2tldDtcbiAgdmFyIFJlZ2lvbiA9IHBhcmFtcy5SZWdpb247XG4gIHZhciBLZXkgPSBwYXJhbXMuS2V5O1xuICB2YXIgQ29weVNvdXJjZSA9IHBhcmFtcy5Db3B5U291cmNlO1xuICB2YXIgbSA9IHV0aWwuZ2V0U291cmNlUGFyYW1zLmNhbGwodGhpcywgQ29weVNvdXJjZSk7XG5cbiAgaWYgKCFtKSB7XG4gICAgY2FsbGJhY2sodXRpbC5lcnJvcihuZXcgRXJyb3IoJ0NvcHlTb3VyY2UgZm9ybWF0IGVycm9yJykpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgU291cmNlQnVja2V0ID0gbS5CdWNrZXQ7XG4gIHZhciBTb3VyY2VSZWdpb24gPSBtLlJlZ2lvbjtcbiAgdmFyIFNvdXJjZUtleSA9IGRlY29kZVVSSUNvbXBvbmVudChtLktleSk7XG4gIHZhciBDb3B5U2xpY2VTaXplID0gcGFyYW1zLkNvcHlTbGljZVNpemUgPT09IHVuZGVmaW5lZCA/IHNlbGYub3B0aW9ucy5Db3B5U2xpY2VTaXplIDogcGFyYW1zLkNvcHlTbGljZVNpemU7XG4gIENvcHlTbGljZVNpemUgPSBNYXRoLm1heCgwLCBDb3B5U2xpY2VTaXplKTtcbiAgdmFyIENodW5rU2l6ZSA9IHBhcmFtcy5Db3B5Q2h1bmtTaXplIHx8IHRoaXMub3B0aW9ucy5Db3B5Q2h1bmtTaXplO1xuICB2YXIgQ2h1bmtQYXJhbGxlbCA9IHRoaXMub3B0aW9ucy5Db3B5Q2h1bmtQYXJhbGxlbExpbWl0O1xuICB2YXIgRmluaXNoU2l6ZSA9IDA7XG4gIHZhciBGaWxlU2l6ZTtcbiAgdmFyIG9uUHJvZ3Jlc3M7IC8vIOWIhueJh+WkjeWItuWujOaIkO+8jOW8gOWniyBtdWx0aXBhcnRDb21wbGV0ZSDmk43kvZxcblxuICBlcC5vbignY29weV9zbGljZV9jb21wbGV0ZScsIGZ1bmN0aW9uIChVcGxvYWREYXRhKSB7XG4gICAgdmFyIG1ldGFIZWFkZXJzID0ge307XG4gICAgdXRpbC5lYWNoKHBhcmFtcy5IZWFkZXJzLCBmdW5jdGlvbiAodmFsLCBrKSB7XG4gICAgICBpZiAoay50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3gtY29zLW1ldGEtJykgPT09IDApIG1ldGFIZWFkZXJzW2tdID0gdmFsO1xuICAgIH0pO1xuICAgIHZhciBQYXJ0cyA9IHV0aWwubWFwKFVwbG9hZERhdGEuUGFydExpc3QsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQYXJ0TnVtYmVyOiBpdGVtLlBhcnROdW1iZXIsXG4gICAgICAgIEVUYWc6IGl0ZW0uRVRhZ1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBzZWxmLm11bHRpcGFydENvbXBsZXRlKHtcbiAgICAgIEJ1Y2tldDogQnVja2V0LFxuICAgICAgUmVnaW9uOiBSZWdpb24sXG4gICAgICBLZXk6IEtleSxcbiAgICAgIFVwbG9hZElkOiBVcGxvYWREYXRhLlVwbG9hZElkLFxuICAgICAgUGFydHM6IFBhcnRzLFxuICAgICAgY2FsbGVkQnlTZGs6ICdzbGljZUNvcHlGaWxlJ1xuICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgb25Qcm9ncmVzcyhudWxsLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG5cbiAgICAgIG9uUHJvZ3Jlc3Moe1xuICAgICAgICBsb2FkZWQ6IEZpbGVTaXplLFxuICAgICAgICB0b3RhbDogRmlsZVNpemVcbiAgICAgIH0sIHRydWUpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgfSk7XG4gIH0pO1xuICBlcC5vbignZ2V0X2NvcHlfZGF0YV9maW5pc2gnLCBmdW5jdGlvbiAoVXBsb2FkRGF0YSkge1xuICAgIEFzeW5jLmVhY2hMaW1pdChVcGxvYWREYXRhLlBhcnRMaXN0LCBDaHVua1BhcmFsbGVsLCBmdW5jdGlvbiAoU2xpY2VJdGVtLCBhc3luY0NhbGxiYWNrKSB7XG4gICAgICB2YXIgUGFydE51bWJlciA9IFNsaWNlSXRlbS5QYXJ0TnVtYmVyO1xuICAgICAgdmFyIENvcHlTb3VyY2VSYW5nZSA9IFNsaWNlSXRlbS5Db3B5U291cmNlUmFuZ2U7XG4gICAgICB2YXIgY3VycmVudFNpemUgPSBTbGljZUl0ZW0uZW5kIC0gU2xpY2VJdGVtLnN0YXJ0O1xuICAgICAgY29weVNsaWNlSXRlbS5jYWxsKHNlbGYsIHtcbiAgICAgICAgQnVja2V0OiBCdWNrZXQsXG4gICAgICAgIFJlZ2lvbjogUmVnaW9uLFxuICAgICAgICBLZXk6IEtleSxcbiAgICAgICAgQ29weVNvdXJjZTogQ29weVNvdXJjZSxcbiAgICAgICAgVXBsb2FkSWQ6IFVwbG9hZERhdGEuVXBsb2FkSWQsXG4gICAgICAgIFBhcnROdW1iZXI6IFBhcnROdW1iZXIsXG4gICAgICAgIENvcHlTb3VyY2VSYW5nZTogQ29weVNvdXJjZVJhbmdlXG4gICAgICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgIGlmIChlcnIpIHJldHVybiBhc3luY0NhbGxiYWNrKGVycik7XG4gICAgICAgIEZpbmlzaFNpemUgKz0gY3VycmVudFNpemU7XG4gICAgICAgIG9uUHJvZ3Jlc3Moe1xuICAgICAgICAgIGxvYWRlZDogRmluaXNoU2l6ZSxcbiAgICAgICAgICB0b3RhbDogRmlsZVNpemVcbiAgICAgICAgfSk7XG4gICAgICAgIFNsaWNlSXRlbS5FVGFnID0gZGF0YS5FVGFnO1xuICAgICAgICBhc3luY0NhbGxiYWNrKGVyciB8fCBudWxsLCBkYXRhKTtcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgb25Qcm9ncmVzcyhudWxsLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG5cbiAgICAgIGVwLmVtaXQoJ2NvcHlfc2xpY2VfY29tcGxldGUnLCBVcGxvYWREYXRhKTtcbiAgICB9KTtcbiAgfSk7XG4gIGVwLm9uKCdnZXRfZmlsZV9zaXplX2ZpbmlzaCcsIGZ1bmN0aW9uIChTb3VyY2VIZWFkZXJzKSB7XG4gICAgLy8g5o6n5Yi25YiG54mH5aSn5bCPXG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBTSVpFID0gWzEsIDIsIDQsIDgsIDE2LCAzMiwgNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDEwMjQgKiAyLCAxMDI0ICogNCwgMTAyNCAqIDVdO1xuICAgICAgdmFyIEF1dG9DaHVua1NpemUgPSAxMDI0ICogMTAyNDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBTSVpFLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIEF1dG9DaHVua1NpemUgPSBTSVpFW2ldICogMTAyNCAqIDEwMjQ7XG4gICAgICAgIGlmIChGaWxlU2l6ZSAvIEF1dG9DaHVua1NpemUgPD0gc2VsZi5vcHRpb25zLk1heFBhcnROdW1iZXIpIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBwYXJhbXMuQ2h1bmtTaXplID0gQ2h1bmtTaXplID0gTWF0aC5tYXgoQ2h1bmtTaXplLCBBdXRvQ2h1bmtTaXplKTtcbiAgICAgIHZhciBDaHVua0NvdW50ID0gTWF0aC5jZWlsKEZpbGVTaXplIC8gQ2h1bmtTaXplKTtcbiAgICAgIHZhciBsaXN0ID0gW107XG5cbiAgICAgIGZvciAodmFyIHBhcnROdW1iZXIgPSAxOyBwYXJ0TnVtYmVyIDw9IENodW5rQ291bnQ7IHBhcnROdW1iZXIrKykge1xuICAgICAgICB2YXIgc3RhcnQgPSAocGFydE51bWJlciAtIDEpICogQ2h1bmtTaXplO1xuICAgICAgICB2YXIgZW5kID0gcGFydE51bWJlciAqIENodW5rU2l6ZSA8IEZpbGVTaXplID8gcGFydE51bWJlciAqIENodW5rU2l6ZSAtIDEgOiBGaWxlU2l6ZSAtIDE7XG4gICAgICAgIHZhciBpdGVtID0ge1xuICAgICAgICAgIFBhcnROdW1iZXI6IHBhcnROdW1iZXIsXG4gICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgIGVuZDogZW5kLFxuICAgICAgICAgIENvcHlTb3VyY2VSYW5nZTogXCJieXRlcz1cIiArIHN0YXJ0ICsgXCItXCIgKyBlbmRcbiAgICAgICAgfTtcbiAgICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICBwYXJhbXMuUGFydExpc3QgPSBsaXN0O1xuICAgIH0pKCk7XG5cbiAgICB2YXIgVGFyZ2V0SGVhZGVyO1xuXG4gICAgaWYgKHBhcmFtcy5IZWFkZXJzWyd4LWNvcy1tZXRhZGF0YS1kaXJlY3RpdmUnXSA9PT0gJ1JlcGxhY2VkJykge1xuICAgICAgVGFyZ2V0SGVhZGVyID0gcGFyYW1zLkhlYWRlcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIFRhcmdldEhlYWRlciA9IFNvdXJjZUhlYWRlcnM7XG4gICAgfVxuXG4gICAgVGFyZ2V0SGVhZGVyWyd4LWNvcy1zdG9yYWdlLWNsYXNzJ10gPSBwYXJhbXMuSGVhZGVyc1sneC1jb3Mtc3RvcmFnZS1jbGFzcyddIHx8IFNvdXJjZUhlYWRlcnNbJ3gtY29zLXN0b3JhZ2UtY2xhc3MnXTtcbiAgICBUYXJnZXRIZWFkZXIgPSB1dGlsLmNsZWFyS2V5KFRhcmdldEhlYWRlcik7XG4gICAgLyoqXG4gICAgICog5a+55LqO5b2S5qGj5a2Y5YKo55qE5a+56LGh77yM5aaC5p6c5pyq5oGi5aSN5Ymv5pys77yM5YiZ5LiN5YWB6K64IENvcHlcbiAgICAgKi9cblxuICAgIGlmIChTb3VyY2VIZWFkZXJzWyd4LWNvcy1zdG9yYWdlLWNsYXNzJ10gPT09ICdBUkNISVZFJyB8fCBTb3VyY2VIZWFkZXJzWyd4LWNvcy1zdG9yYWdlLWNsYXNzJ10gPT09ICdERUVQX0FSQ0hJVkUnKSB7XG4gICAgICB2YXIgcmVzdG9yZUhlYWRlciA9IFNvdXJjZUhlYWRlcnNbJ3gtY29zLXJlc3RvcmUnXTtcblxuICAgICAgaWYgKCFyZXN0b3JlSGVhZGVyIHx8IHJlc3RvcmVIZWFkZXIgPT09ICdvbmdvaW5nLXJlcXVlc3Q9XCJ0cnVlXCInKSB7XG4gICAgICAgIGNhbGxiYWNrKHV0aWwuZXJyb3IobmV3IEVycm9yKCdVbnJlc3RvcmVkIGFyY2hpdmUgb2JqZWN0IGlzIG5vdCBhbGxvd2VkIHRvIGJlIGNvcGllZCcpKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICog5Y676Zmk5LiA5Lqb5peg55So55qE5aS06YOo77yM6KeE6YG/IG11bHRpcGFydEluaXQg5Ye66ZSZXG4gICAgICog6L+Z5Lqb5aS06YOo6YCa5bi45piv5ZyoIHB1dE9iamVjdENvcHkg5pe25omN5L2/55SoXG4gICAgICovXG5cblxuICAgIGRlbGV0ZSBUYXJnZXRIZWFkZXJbJ3gtY29zLWNvcHktc291cmNlJ107XG4gICAgZGVsZXRlIFRhcmdldEhlYWRlclsneC1jb3MtbWV0YWRhdGEtZGlyZWN0aXZlJ107XG4gICAgZGVsZXRlIFRhcmdldEhlYWRlclsneC1jb3MtY29weS1zb3VyY2UtSWYtTW9kaWZpZWQtU2luY2UnXTtcbiAgICBkZWxldGUgVGFyZ2V0SGVhZGVyWyd4LWNvcy1jb3B5LXNvdXJjZS1JZi1Vbm1vZGlmaWVkLVNpbmNlJ107XG4gICAgZGVsZXRlIFRhcmdldEhlYWRlclsneC1jb3MtY29weS1zb3VyY2UtSWYtTWF0Y2gnXTtcbiAgICBkZWxldGUgVGFyZ2V0SGVhZGVyWyd4LWNvcy1jb3B5LXNvdXJjZS1JZi1Ob25lLU1hdGNoJ107XG4gICAgc2VsZi5tdWx0aXBhcnRJbml0KHtcbiAgICAgIEJ1Y2tldDogQnVja2V0LFxuICAgICAgUmVnaW9uOiBSZWdpb24sXG4gICAgICBLZXk6IEtleSxcbiAgICAgIEhlYWRlcnM6IFRhcmdldEhlYWRlcixcbiAgICAgIGNhbGxlZEJ5U2RrOiAnc2xpY2VDb3B5RmlsZSdcbiAgICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIHBhcmFtcy5VcGxvYWRJZCA9IGRhdGEuVXBsb2FkSWQ7XG4gICAgICBlcC5lbWl0KCdnZXRfY29weV9kYXRhX2ZpbmlzaCcsIHBhcmFtcyk7XG4gICAgfSk7XG4gIH0pOyAvLyDojrflj5bov5znq6/lpI3liLbmupDmlofku7bnmoTlpKflsI9cblxuICBzZWxmLmhlYWRPYmplY3Qoe1xuICAgIEJ1Y2tldDogU291cmNlQnVja2V0LFxuICAgIFJlZ2lvbjogU291cmNlUmVnaW9uLFxuICAgIEtleTogU291cmNlS2V5XG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBpZiAoZXJyLnN0YXR1c0NvZGUgJiYgZXJyLnN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICBjYWxsYmFjayh1dGlsLmVycm9yKGVyciwge1xuICAgICAgICAgIEVycm9yU3RhdHVzOiBTb3VyY2VLZXkgKyAnIE5vdCBFeGlzdCdcbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIEZpbGVTaXplID0gcGFyYW1zLkZpbGVTaXplID0gZGF0YS5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddO1xuXG4gICAgaWYgKEZpbGVTaXplID09PSB1bmRlZmluZWQgfHwgIUZpbGVTaXplKSB7XG4gICAgICBjYWxsYmFjayh1dGlsLmVycm9yKG5ldyBFcnJvcignZ2V0IENvbnRlbnQtTGVuZ3RoIGVycm9yLCBwbGVhc2UgYWRkIFwiQ29udGVudC1MZW5ndGhcIiB0byBDT1JTIEV4cG9zZUhlYWRlciBzZXR0aW5nLu+8iCDojrflj5ZDb250ZW50LUxlbmd0aOWksei0pe+8jOivt+WcqENPUlMgRXhwb3NlSGVhZGVy6K6+572u5Lit5re75YqgQ29udGVudC1MZW5ndGjvvIzor7flj4LogIPmlofmoaPvvJpodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2LzEzMzE4IO+8iScpKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb25Qcm9ncmVzcyA9IHV0aWwudGhyb3R0bGVPblByb2dyZXNzLmNhbGwoc2VsZiwgRmlsZVNpemUsIHBhcmFtcy5vblByb2dyZXNzKTsgLy8g5byA5aeL5LiK5LygXG5cbiAgICBpZiAoRmlsZVNpemUgPD0gQ29weVNsaWNlU2l6ZSkge1xuICAgICAgaWYgKCFwYXJhbXMuSGVhZGVyc1sneC1jb3MtbWV0YWRhdGEtZGlyZWN0aXZlJ10pIHtcbiAgICAgICAgcGFyYW1zLkhlYWRlcnNbJ3gtY29zLW1ldGFkYXRhLWRpcmVjdGl2ZSddID0gJ0NvcHknO1xuICAgICAgfVxuXG4gICAgICBzZWxmLnB1dE9iamVjdENvcHkocGFyYW1zLCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBvblByb2dyZXNzKG51bGwsIHRydWUpO1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgb25Qcm9ncmVzcyh7XG4gICAgICAgICAgbG9hZGVkOiBGaWxlU2l6ZSxcbiAgICAgICAgICB0b3RhbDogRmlsZVNpemVcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgIGNhbGxiYWNrKGVyciwgZGF0YSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlc0hlYWRlcnMgPSBkYXRhLmhlYWRlcnM7XG4gICAgICB2YXIgU291cmNlSGVhZGVycyA9IHtcbiAgICAgICAgJ0NhY2hlLUNvbnRyb2wnOiByZXNIZWFkZXJzWydjYWNoZS1jb250cm9sJ10sXG4gICAgICAgICdDb250ZW50LURpc3Bvc2l0aW9uJzogcmVzSGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddLFxuICAgICAgICAnQ29udGVudC1FbmNvZGluZyc6IHJlc0hlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSxcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IHJlc0hlYWRlcnNbJ2NvbnRlbnQtdHlwZSddLFxuICAgICAgICAnRXhwaXJlcyc6IHJlc0hlYWRlcnNbJ2V4cGlyZXMnXSxcbiAgICAgICAgJ3gtY29zLXN0b3JhZ2UtY2xhc3MnOiByZXNIZWFkZXJzWyd4LWNvcy1zdG9yYWdlLWNsYXNzJ11cbiAgICAgIH07XG4gICAgICB1dGlsLmVhY2gocmVzSGVhZGVycywgZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgdmFyIG1ldGFQcmVmaXggPSAneC1jb3MtbWV0YS0nO1xuXG4gICAgICAgIGlmIChrLmluZGV4T2YobWV0YVByZWZpeCkgPT09IDAgJiYgay5sZW5ndGggPiBtZXRhUHJlZml4Lmxlbmd0aCkge1xuICAgICAgICAgIFNvdXJjZUhlYWRlcnNba10gPSB2O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGVwLmVtaXQoJ2dldF9maWxlX3NpemVfZmluaXNoJywgU291cmNlSGVhZGVycyk7XG4gICAgfVxuICB9KTtcbn0gLy8g5aSN5Yi25oyH5a6a5YiG54mHXG5cblxuZnVuY3Rpb24gY29weVNsaWNlSXRlbShwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHZhciBUYXNrSWQgPSBwYXJhbXMuVGFza0lkO1xuICB2YXIgQnVja2V0ID0gcGFyYW1zLkJ1Y2tldDtcbiAgdmFyIFJlZ2lvbiA9IHBhcmFtcy5SZWdpb247XG4gIHZhciBLZXkgPSBwYXJhbXMuS2V5O1xuICB2YXIgQ29weVNvdXJjZSA9IHBhcmFtcy5Db3B5U291cmNlO1xuICB2YXIgVXBsb2FkSWQgPSBwYXJhbXMuVXBsb2FkSWQ7XG4gIHZhciBQYXJ0TnVtYmVyID0gcGFyYW1zLlBhcnROdW1iZXIgKiAxO1xuICB2YXIgQ29weVNvdXJjZVJhbmdlID0gcGFyYW1zLkNvcHlTb3VyY2VSYW5nZTtcbiAgdmFyIENodW5rUmV0cnlUaW1lcyA9IHRoaXMub3B0aW9ucy5DaHVua1JldHJ5VGltZXMgKyAxO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIEFzeW5jLnJldHJ5KENodW5rUmV0cnlUaW1lcywgZnVuY3Rpb24gKHRyeUNhbGxiYWNrKSB7XG4gICAgc2VsZi51cGxvYWRQYXJ0Q29weSh7XG4gICAgICBUYXNrSWQ6IFRhc2tJZCxcbiAgICAgIEJ1Y2tldDogQnVja2V0LFxuICAgICAgUmVnaW9uOiBSZWdpb24sXG4gICAgICBLZXk6IEtleSxcbiAgICAgIENvcHlTb3VyY2U6IENvcHlTb3VyY2UsXG4gICAgICBVcGxvYWRJZDogVXBsb2FkSWQsXG4gICAgICBQYXJ0TnVtYmVyOiBQYXJ0TnVtYmVyLFxuICAgICAgQ29weVNvdXJjZVJhbmdlOiBDb3B5U291cmNlUmFuZ2VcbiAgICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICB0cnlDYWxsYmFjayhlcnIgfHwgbnVsbCwgZGF0YSk7XG4gICAgfSk7XG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soZXJyLCBkYXRhKTtcbiAgfSk7XG59XG5cbnZhciBBUElfTUFQID0ge1xuICBzbGljZVVwbG9hZEZpbGU6IHNsaWNlVXBsb2FkRmlsZSxcbiAgYWJvcnRVcGxvYWRUYXNrOiBhYm9ydFVwbG9hZFRhc2ssXG4gIHVwbG9hZEZpbGU6IHVwbG9hZEZpbGUsXG4gIHVwbG9hZEZpbGVzOiB1cGxvYWRGaWxlcyxcbiAgc2xpY2VDb3B5RmlsZTogc2xpY2VDb3B5RmlsZVxufTtcblxubW9kdWxlLmV4cG9ydHMuaW5pdCA9IGZ1bmN0aW9uIChDT1MsIHRhc2spIHtcbiAgdGFzay50cmFuc2ZlclRvVGFza01ldGhvZChBUElfTUFQLCAnc2xpY2VVcGxvYWRGaWxlJyk7XG4gIHV0aWwuZWFjaChBUElfTUFQLCBmdW5jdGlvbiAoZm4sIGFwaU5hbWUpIHtcbiAgICBDT1MucHJvdG90eXBlW2FwaU5hbWVdID0gdXRpbC5hcGlXcmFwcGVyKGFwaU5hbWUsIGZuKTtcbiAgfSk7XG59OyIsInZhciBlYWNoTGltaXQgPSBmdW5jdGlvbiBlYWNoTGltaXQoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307XG5cbiAgaWYgKCFhcnIubGVuZ3RoIHx8IGxpbWl0IDw9IDApIHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfVxuXG4gIHZhciBjb21wbGV0ZWQgPSAwO1xuICB2YXIgc3RhcnRlZCA9IDA7XG4gIHZhciBydW5uaW5nID0gMDtcblxuICAoZnVuY3Rpb24gcmVwbGVuaXNoKCkge1xuICAgIGlmIChjb21wbGV0ZWQgPj0gYXJyLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHJ1bm5pbmcgPCBsaW1pdCAmJiBzdGFydGVkIDwgYXJyLmxlbmd0aCkge1xuICAgICAgc3RhcnRlZCArPSAxO1xuICAgICAgcnVubmluZyArPSAxO1xuICAgICAgaXRlcmF0b3IoYXJyW3N0YXJ0ZWQgLSAxXSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgY2FsbGJhY2soZXJyKTtcblxuICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7fTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wbGV0ZWQgKz0gMTtcbiAgICAgICAgICBydW5uaW5nIC09IDE7XG5cbiAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcGxlbmlzaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KSgpO1xufTtcblxudmFyIHJldHJ5ID0gZnVuY3Rpb24gcmV0cnkodGltZXMsIGl0ZXJhdG9yLCBjYWxsYmFjaykge1xuICB2YXIgbmV4dCA9IGZ1bmN0aW9uIG5leHQoaW5kZXgpIHtcbiAgICBpdGVyYXRvcihmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICBpZiAoZXJyICYmIGluZGV4IDwgdGltZXMpIHtcbiAgICAgICAgbmV4dChpbmRleCArIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soZXJyLCBkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBpZiAodGltZXMgPCAxKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0KDEpO1xuICB9XG59O1xuXG52YXIgYXN5bmMgPSB7XG4gIGVhY2hMaW1pdDogZWFjaExpbWl0LFxuICByZXRyeTogcmV0cnlcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jOyIsInZhciBSRVFVRVNUID0gcmVxdWlyZSgnLi4vbGliL3JlcXVlc3QnKTtcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTsgLy8gQnVja2V0IOebuOWFs1xuXG4vKipcbiAqIOiOt+WPlueUqOaIt+eahCBidWNrZXQg5YiX6KGoXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobvvvIzkuIvpnaLkuLrlj4LmlbDliJfooahcbiAqIOaXoOeJueauiuWPguaVsFxuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRTZXJ2aWNlKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICBwYXJhbXMgPSB7fTtcbiAgfVxuXG4gIHZhciBwcm90b2NvbCA9IHRoaXMub3B0aW9ucy5Qcm90b2NvbCB8fCAodXRpbC5pc0Jyb3dzZXIgJiYgbG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwOicgPyAnaHR0cDonIDogJ2h0dHBzOicpO1xuICB2YXIgZG9tYWluID0gdGhpcy5vcHRpb25zLlNlcnZpY2VEb21haW47XG4gIHZhciBhcHBJZCA9IHBhcmFtcy5BcHBJZCB8fCB0aGlzLm9wdGlvbnMuYXBwSWQ7XG4gIHZhciByZWdpb24gPSBwYXJhbXMuUmVnaW9uO1xuXG4gIGlmIChkb21haW4pIHtcbiAgICBkb21haW4gPSBkb21haW4ucmVwbGFjZSgvXFx7XFx7QXBwSWRcXH1cXH0vaWcsIGFwcElkIHx8ICcnKS5yZXBsYWNlKC9cXHtcXHtSZWdpb25cXH1cXH0vaWcsIHJlZ2lvbiB8fCAnJykucmVwbGFjZSgvXFx7XFx7Lio/XFx9XFx9L2lnLCAnJyk7XG5cbiAgICBpZiAoIS9eW2EtekEtWl0rOlxcL1xcLy8udGVzdChkb21haW4pKSB7XG4gICAgICBkb21haW4gPSBwcm90b2NvbCArICcvLycgKyBkb21haW47XG4gICAgfVxuXG4gICAgaWYgKGRvbWFpbi5zbGljZSgtMSkgPT09ICcvJykge1xuICAgICAgZG9tYWluID0gZG9tYWluLnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocmVnaW9uKSB7XG4gICAgZG9tYWluID0gcHJvdG9jb2wgKyAnLy9jb3MuJyArIHJlZ2lvbiArICcubXlxY2xvdWQuY29tJztcbiAgfSBlbHNlIHtcbiAgICBkb21haW4gPSBwcm90b2NvbCArICcvL3NlcnZpY2UuY29zLm15cWNsb3VkLmNvbSc7XG4gIH1cblxuICB2YXIgU2lnbkhvc3QgPSAnJztcbiAgdmFyIHN0YW5kYXJkSG9zdCA9IHJlZ2lvbiA/ICdjb3MuJyArIHJlZ2lvbiArICcubXlxY2xvdWQuY29tJyA6ICdzZXJ2aWNlLmNvcy5teXFjbG91ZC5jb20nO1xuICB2YXIgdXJsSG9zdCA9IGRvbWFpbi5yZXBsYWNlKC9eaHR0cHM/OlxcL1xcLyhbXi9dKykoXFwvLiopPyQvLCAnJDEnKTtcbiAgaWYgKHN0YW5kYXJkSG9zdCA9PT0gdXJsSG9zdCkgU2lnbkhvc3QgPSBzdGFuZGFyZEhvc3Q7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6R2V0U2VydmljZScsXG4gICAgdXJsOiBkb21haW4sXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBTaWduSG9zdDogU2lnbkhvc3RcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIHZhciBidWNrZXRzID0gZGF0YSAmJiBkYXRhLkxpc3RBbGxNeUJ1Y2tldHNSZXN1bHQgJiYgZGF0YS5MaXN0QWxsTXlCdWNrZXRzUmVzdWx0LkJ1Y2tldHMgJiYgZGF0YS5MaXN0QWxsTXlCdWNrZXRzUmVzdWx0LkJ1Y2tldHMuQnVja2V0IHx8IFtdO1xuICAgIGJ1Y2tldHMgPSB1dGlsLmlzQXJyYXkoYnVja2V0cykgPyBidWNrZXRzIDogW2J1Y2tldHNdO1xuICAgIHZhciBvd25lciA9IGRhdGEgJiYgZGF0YS5MaXN0QWxsTXlCdWNrZXRzUmVzdWx0ICYmIGRhdGEuTGlzdEFsbE15QnVja2V0c1Jlc3VsdC5Pd25lciB8fCB7fTtcbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBCdWNrZXRzOiBidWNrZXRzLFxuICAgICAgT3duZXI6IG93bmVyLFxuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiDliJvlu7ogQnVja2V077yM5bm25Yid5aeL5YyW6K6/6Zeu5p2D6ZmQXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgICAgICAgICAgICAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAgICAgICAgICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkFDTCAgICAgICAgICAgICAgICAg55So5oi36Ieq5a6a5LmJ5paH5Lu25p2D6ZmQ77yM5Y+v5Lul6K6+572u77yacHJpdmF0Ze+8jHB1YmxpYy1yZWFk77yb6buY6K6k5YC877yacHJpdmF0Ze+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5HcmFudFJlYWQgICAgICAgICAgIOi1i+S6iOiiq+aOiOadg+iAheivu+eahOadg+mZkO+8jOagvOW8j3gtY29zLWdyYW50LXJlYWQ6IHVpbj1cIiBcIix1aW49XCIgXCLvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuR3JhbnRXcml0ZSAgICAgICAgICDotYvkuojooqvmjojmnYPogIXlhpnnmoTmnYPpmZDvvIzmoLzlvI94LWNvcy1ncmFudC13cml0ZTogdWluPVwiIFwiLHVpbj1cIiBcIu+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5HcmFudEZ1bGxDb250cm9sICAgIOi1i+S6iOiiq+aOiOadg+iAheivu+WGmeadg+mZkO+8jOagvOW8j3gtY29zLWdyYW50LWZ1bGwtY29udHJvbDogdWluPVwiIFwiLHVpbj1cIiBcIu+8jOmdnuW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgIOWbnuiwg+WHveaVsO+8jOW/hemhu1xuICogQHJldHVybiAge09iamVjdH0gIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgIOi/lOWbnueahOaVsOaNrlxuICogICAgIEByZXR1cm4gIHtTdHJpbmd9ICBkYXRhLkxvY2F0aW9uICAgICAgICAgICAgIOaTjeS9nOWcsOWdgFxuICovXG5cblxuZnVuY3Rpb24gcHV0QnVja2V0KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgeG1sID0gJyc7XG5cbiAgaWYgKHBhcmFtc1snQnVja2V0QVpDb25maWcnXSkge1xuICAgIHZhciBDcmVhdGVCdWNrZXRDb25maWd1cmF0aW9uID0ge1xuICAgICAgQnVja2V0QVpDb25maWc6IHBhcmFtcy5CdWNrZXRBWkNvbmZpZ1xuICAgIH07XG4gICAgeG1sID0gdXRpbC5qc29uMnhtbCh7XG4gICAgICBDcmVhdGVCdWNrZXRDb25maWd1cmF0aW9uOiBDcmVhdGVCdWNrZXRDb25maWd1cmF0aW9uXG4gICAgfSk7XG4gIH1cblxuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOlB1dEJ1Y2tldCcsXG4gICAgbWV0aG9kOiAnUFVUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgIGJvZHk6IHhtbFxuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgdmFyIHVybCA9IGdldFVybCh7XG4gICAgICBwcm90b2NvbDogc2VsZi5vcHRpb25zLlByb3RvY29sLFxuICAgICAgZG9tYWluOiBzZWxmLm9wdGlvbnMuRG9tYWluLFxuICAgICAgYnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgICAgcmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgICAgaXNMb2NhdGlvbjogdHJ1ZVxuICAgIH0pO1xuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIExvY2F0aW9uOiB1cmwsXG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIOafpeeci+aYr+WQpuWtmOWcqOivpUJ1Y2tldO+8jOaYr+WQpuacieadg+mZkOiuv+mXrlxuICogQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zICAgICAgICAgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgICAgICAgICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAgICAgIOWcsOWfn+WQjeensO+8jOW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICAgICAgICAgIOi/lOWbnueahOaVsOaNrlxuICogICAgIEByZXR1cm4gIHtCb29sZWFufSAgZGF0YS5CdWNrZXRFeGlzdCAgICAgQnVja2V05piv5ZCm5a2Y5ZyoXG4gKiAgICAgQHJldHVybiAge0Jvb2xlYW59ICBkYXRhLkJ1Y2tldEF1dGggICAgICDmmK/lkKbmnIkgQnVja2V0IOeahOiuv+mXruadg+mZkFxuICovXG5cblxuZnVuY3Rpb24gaGVhZEJ1Y2tldChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6SGVhZEJ1Y2tldCcsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBtZXRob2Q6ICdIRUFEJ1xuICB9LCBjYWxsYmFjayk7XG59XG4vKipcbiAqIOiOt+WPliBCdWNrZXQg5LiL55qEIG9iamVjdCDliJfooahcbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICAgICAgICAgICAgICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAgICAgICAgICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUHJlZml4ICAgICAgICAgICAgICDliY3nvIDljLnphY3vvIznlKjmnaXop4Tlrprov5Tlm57nmoTmlofku7bliY3nvIDlnLDlnYDvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuRGVsaW1pdGVyICAgICAgICAgICDlrprnlYznrKbkuLrkuIDkuKrnrKblj7fvvIzlpoLmnpzmnIlQcmVmaXjvvIzliJnlsIZQcmVmaXjliLBkZWxpbWl0ZXLkuYvpl7TnmoTnm7jlkIzot6/lvoTlvZLkuLrkuIDnsbvvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuTWFya2VyICAgICAgICAgICAgICDpu5jorqTku6VVVEYtOOS6jOi/m+WItumhuuW6j+WIl+WHuuadoeebru+8jOaJgOacieWIl+WHuuadoeebruS7jm1hcmtlcuW8gOWni++8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5NYXhLZXlzICAgICAgICAgICAgIOWNleasoei/lOWbnuacgOWkp+eahOadoeebruaVsOmHj++8jOm7mOiupDEwMDDvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuRW5jb2RpbmdUeXBlICAgICAgICDop4Tlrprov5Tlm57lgLznmoTnvJbnoIHmlrnlvI/vvIzpnZ7lv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICDov5Tlm57nmoTmlbDmja5cbiAqICAgICBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YS5MaXN0QnVja2V0UmVzdWx0ICAgICDov5Tlm57nmoQgb2JqZWN0IOWIl+ihqOS/oeaBr1xuICovXG5cblxuZnVuY3Rpb24gZ2V0QnVja2V0KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIHJlcVBhcmFtcyA9IHt9O1xuICByZXFQYXJhbXNbJ3ByZWZpeCddID0gcGFyYW1zWydQcmVmaXgnXSB8fCAnJztcbiAgcmVxUGFyYW1zWydkZWxpbWl0ZXInXSA9IHBhcmFtc1snRGVsaW1pdGVyJ107XG4gIHJlcVBhcmFtc1snbWFya2VyJ10gPSBwYXJhbXNbJ01hcmtlciddO1xuICByZXFQYXJhbXNbJ21heC1rZXlzJ10gPSBwYXJhbXNbJ01heEtleXMnXTtcbiAgcmVxUGFyYW1zWydlbmNvZGluZy10eXBlJ10gPSBwYXJhbXNbJ0VuY29kaW5nVHlwZSddO1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkdldEJ1Y2tldCcsXG4gICAgUmVzb3VyY2VLZXk6IHJlcVBhcmFtc1sncHJlZml4J10sXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgIHFzOiByZXFQYXJhbXNcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIHZhciBMaXN0QnVja2V0UmVzdWx0ID0gZGF0YS5MaXN0QnVja2V0UmVzdWx0IHx8IHt9O1xuICAgIHZhciBDb250ZW50cyA9IExpc3RCdWNrZXRSZXN1bHQuQ29udGVudHMgfHwgW107XG4gICAgdmFyIENvbW1vblByZWZpeGVzID0gTGlzdEJ1Y2tldFJlc3VsdC5Db21tb25QcmVmaXhlcyB8fCBbXTtcbiAgICBDb250ZW50cyA9IHV0aWwuaXNBcnJheShDb250ZW50cykgPyBDb250ZW50cyA6IFtDb250ZW50c107XG4gICAgQ29tbW9uUHJlZml4ZXMgPSB1dGlsLmlzQXJyYXkoQ29tbW9uUHJlZml4ZXMpID8gQ29tbW9uUHJlZml4ZXMgOiBbQ29tbW9uUHJlZml4ZXNdO1xuICAgIHZhciByZXN1bHQgPSB1dGlsLmNsb25lKExpc3RCdWNrZXRSZXN1bHQpO1xuICAgIHV0aWwuZXh0ZW5kKHJlc3VsdCwge1xuICAgICAgQ29udGVudHM6IENvbnRlbnRzLFxuICAgICAgQ29tbW9uUHJlZml4ZXM6IENvbW1vblByZWZpeGVzLFxuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgfSk7XG59XG4vKipcbiAqIOWIoOmZpCBCdWNrZXRcbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgICAgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gICAgICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgICAgICDov5Tlm57nmoTmlbDmja5cbiAqICAgICBAcmV0dXJuICB7U3RyaW5nfSAgZGF0YS5Mb2NhdGlvbiAgICAg5pON5L2c5Zyw5Z2AXG4gKi9cblxuXG5mdW5jdGlvbiBkZWxldGVCdWNrZXQocGFyYW1zLCBjYWxsYmFjaykge1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkRlbGV0ZUJ1Y2tldCcsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBtZXRob2Q6ICdERUxFVEUnXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyICYmIGVyci5zdGF0dXNDb2RlID09PSAyMDQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIHN0YXR1c0NvZGU6IGVyci5zdGF0dXNDb2RlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiDorr7nva4gQnVja2V0IOeahCDmnYPpmZDliJfooahcbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICAgICAgICAgICAgICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAgICAgICAgICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQUNMICAgICAgICAgICAgICAgICDnlKjmiLfoh6rlrprkuYnmlofku7bmnYPpmZDvvIzlj6/ku6Xorr7nva7vvJpwcml2YXRl77yMcHVibGljLXJlYWTvvJvpu5jorqTlgLzvvJpwcml2YXRl77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkdyYW50UmVhZCAgICAgICAgICAg6LWL5LqI6KKr5o6I5p2D6ICF6K+755qE5p2D6ZmQ77yM5qC85byPeC1jb3MtZ3JhbnQtcmVhZDogdWluPVwiIFwiLHVpbj1cIiBcIu+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5HcmFudFdyaXRlICAgICAgICAgIOi1i+S6iOiiq+aOiOadg+iAheWGmeeahOadg+mZkO+8jOagvOW8j3gtY29zLWdyYW50LXdyaXRlOiB1aW49XCIgXCIsdWluPVwiIFwi77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkdyYW50RnVsbENvbnRyb2wgICAg6LWL5LqI6KKr5o6I5p2D6ICF6K+75YaZ5p2D6ZmQ77yM5qC85byPeC1jb3MtZ3JhbnQtZnVsbC1jb250cm9sOiB1aW49XCIgXCIsdWluPVwiIFwi77yM6Z2e5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAg6L+U5Zue55qE5pWw5o2uXG4gKi9cblxuXG5mdW5jdGlvbiBwdXRCdWNrZXRBY2wocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgaGVhZGVycyA9IHBhcmFtcy5IZWFkZXJzO1xuICB2YXIgeG1sID0gJyc7XG5cbiAgaWYgKHBhcmFtc1snQWNjZXNzQ29udHJvbFBvbGljeSddKSB7XG4gICAgdmFyIEFjY2Vzc0NvbnRyb2xQb2xpY3kgPSB1dGlsLmNsb25lKHBhcmFtc1snQWNjZXNzQ29udHJvbFBvbGljeSddIHx8IHt9KTtcbiAgICB2YXIgR3JhbnRzID0gQWNjZXNzQ29udHJvbFBvbGljeS5HcmFudHMgfHwgQWNjZXNzQ29udHJvbFBvbGljeS5HcmFudDtcbiAgICBHcmFudHMgPSB1dGlsLmlzQXJyYXkoR3JhbnRzKSA/IEdyYW50cyA6IFtHcmFudHNdO1xuICAgIGRlbGV0ZSBBY2Nlc3NDb250cm9sUG9saWN5LkdyYW50O1xuICAgIGRlbGV0ZSBBY2Nlc3NDb250cm9sUG9saWN5LkdyYW50cztcbiAgICBBY2Nlc3NDb250cm9sUG9saWN5LkFjY2Vzc0NvbnRyb2xMaXN0ID0ge1xuICAgICAgR3JhbnQ6IEdyYW50c1xuICAgIH07XG4gICAgeG1sID0gdXRpbC5qc29uMnhtbCh7XG4gICAgICBBY2Nlc3NDb250cm9sUG9saWN5OiBBY2Nlc3NDb250cm9sUG9saWN5XG4gICAgfSk7XG4gICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veG1sJztcbiAgICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdXRpbC5iaW5hcnlCYXNlNjQodXRpbC5tZDUoeG1sKSk7XG4gIH0gLy8gR3JhbnQgSGVhZGVyIOWOu+mHjVxuXG5cbiAgdXRpbC5lYWNoKGhlYWRlcnMsIGZ1bmN0aW9uICh2YWwsIGtleSkge1xuICAgIGlmIChrZXkuaW5kZXhPZigneC1jb3MtZ3JhbnQtJykgPT09IDApIHtcbiAgICAgIGhlYWRlcnNba2V5XSA9IHVuaXFHcmFudChoZWFkZXJzW2tleV0pO1xuICAgIH1cbiAgfSk7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6UHV0QnVja2V0QUNMJyxcbiAgICBtZXRob2Q6ICdQVVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgaGVhZGVyczogaGVhZGVycyxcbiAgICBhY3Rpb246ICdhY2wnLFxuICAgIGJvZHk6IHhtbFxuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiDojrflj5YgQnVja2V0IOeahCDmnYPpmZDliJfooahcbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICAgICAgICAgICAgICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAgICAgICAgICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICDov5Tlm57nmoTmlbDmja5cbiAqICAgICBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YS5BY2Nlc3NDb250cm9sUG9saWN5ICDorr/pl67mnYPpmZDkv6Hmga9cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEJ1Y2tldEFjbChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6R2V0QnVja2V0QUNMJyxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgYWN0aW9uOiAnYWNsJ1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgdmFyIEFjY2Vzc0NvbnRyb2xQb2xpY3kgPSBkYXRhLkFjY2Vzc0NvbnRyb2xQb2xpY3kgfHwge307XG4gICAgdmFyIE93bmVyID0gQWNjZXNzQ29udHJvbFBvbGljeS5Pd25lciB8fCB7fTtcbiAgICB2YXIgR3JhbnQgPSBBY2Nlc3NDb250cm9sUG9saWN5LkFjY2Vzc0NvbnRyb2xMaXN0LkdyYW50IHx8IFtdO1xuICAgIEdyYW50ID0gdXRpbC5pc0FycmF5KEdyYW50KSA/IEdyYW50IDogW0dyYW50XTtcbiAgICB2YXIgcmVzdWx0ID0gZGVjb2RlQWNsKEFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xuXG4gICAgaWYgKGRhdGEuaGVhZGVycyAmJiBkYXRhLmhlYWRlcnNbJ3gtY29zLWFjbCddKSB7XG4gICAgICByZXN1bHQuQUNMID0gZGF0YS5oZWFkZXJzWyd4LWNvcy1hY2wnXTtcbiAgICB9XG5cbiAgICByZXN1bHQgPSB1dGlsLmV4dGVuZChyZXN1bHQsIHtcbiAgICAgIE93bmVyOiBPd25lcixcbiAgICAgIEdyYW50czogR3JhbnQsXG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICB9KTtcbn1cbi8qKlxuICog6K6+572uIEJ1Y2tldCDnmoQg6Leo5Z+f6K6+572uXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgICAgICAgICAgICAgICAgICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAgICAgICAgICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zLkNPUlNDb25maWd1cmF0aW9uICAgICAgIOebuOWFs+eahOi3qOWfn+iuvue9ru+8jOW/hemhu1xuICogQHBhcmFtICB7QXJyYXl9ICBwYXJhbXMuQ09SU0NvbmZpZ3VyYXRpb24uQ09SU1J1bGVzICDlr7nlupTnmoTot6jln5/op4TliJlcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDov5Tlm57nmoTmlbDmja5cbiAqL1xuXG5cbmZ1bmN0aW9uIHB1dEJ1Y2tldENvcnMocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgQ09SU0NvbmZpZ3VyYXRpb24gPSBwYXJhbXNbJ0NPUlNDb25maWd1cmF0aW9uJ10gfHwge307XG4gIHZhciBDT1JTUnVsZXMgPSBDT1JTQ29uZmlndXJhdGlvblsnQ09SU1J1bGVzJ10gfHwgcGFyYW1zWydDT1JTUnVsZXMnXSB8fCBbXTtcbiAgQ09SU1J1bGVzID0gdXRpbC5jbG9uZSh1dGlsLmlzQXJyYXkoQ09SU1J1bGVzKSA/IENPUlNSdWxlcyA6IFtDT1JTUnVsZXNdKTtcbiAgdXRpbC5lYWNoKENPUlNSdWxlcywgZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICB1dGlsLmVhY2goWydBbGxvd2VkT3JpZ2luJywgJ0FsbG93ZWRIZWFkZXInLCAnQWxsb3dlZE1ldGhvZCcsICdFeHBvc2VIZWFkZXInXSwgZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIHNLZXkgPSBrZXkgKyAncyc7XG4gICAgICB2YXIgdmFsID0gcnVsZVtzS2V5XSB8fCBydWxlW2tleV0gfHwgW107XG4gICAgICBkZWxldGUgcnVsZVtzS2V5XTtcbiAgICAgIHJ1bGVba2V5XSA9IHV0aWwuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG4gICAgfSk7XG4gIH0pO1xuICB2YXIgQ29uZiA9IHtcbiAgICBDT1JTUnVsZTogQ09SU1J1bGVzXG4gIH07XG4gIGlmIChwYXJhbXMuUmVzcG9uc2VWYXJ5KSBDb25mLlJlc3BvbnNlVmFyeSA9IHBhcmFtcy5SZXNwb25zZVZhcnk7XG4gIHZhciB4bWwgPSB1dGlsLmpzb24yeG1sKHtcbiAgICBDT1JTQ29uZmlndXJhdGlvbjogQ29uZlxuICB9KTtcbiAgdmFyIGhlYWRlcnMgPSBwYXJhbXMuSGVhZGVycztcbiAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veG1sJztcbiAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHV0aWwuYmluYXJ5QmFzZTY0KHV0aWwubWQ1KHhtbCkpO1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOlB1dEJ1Y2tldENPUlMnLFxuICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBib2R5OiB4bWwsXG4gICAgYWN0aW9uOiAnY29ycycsXG4gICAgaGVhZGVyczogaGVhZGVyc1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiDojrflj5YgQnVja2V0IOeahCDot6jln5/orr7nva5cbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICAgICAgICAgICAgICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAgICAgICAgICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICDov5Tlm57nmoTmlbDmja5cbiAqICAgICBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YS5DT1JTUnVsZXMgICAgICAgICAgICBCdWNrZXTnmoTot6jln5/orr7nva5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEJ1Y2tldENvcnMocGFyYW1zLCBjYWxsYmFjaykge1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkdldEJ1Y2tldENPUlMnLFxuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBhY3Rpb246ICdjb3JzJ1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgaWYgKGVyci5zdGF0dXNDb2RlID09PSA0MDQgJiYgZXJyLmVycm9yICYmIGVyci5lcnJvci5Db2RlID09PSAnTm9TdWNoQ09SU0NvbmZpZ3VyYXRpb24nKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgICAgQ09SU1J1bGVzOiBbXSxcbiAgICAgICAgICBzdGF0dXNDb2RlOiBlcnIuc3RhdHVzQ29kZVxuICAgICAgICB9O1xuICAgICAgICBlcnIuaGVhZGVycyAmJiAocmVzdWx0LmhlYWRlcnMgPSBlcnIuaGVhZGVycyk7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIENPUlNDb25maWd1cmF0aW9uID0gZGF0YS5DT1JTQ29uZmlndXJhdGlvbiB8fCB7fTtcbiAgICB2YXIgQ09SU1J1bGVzID0gQ09SU0NvbmZpZ3VyYXRpb24uQ09SU1J1bGVzIHx8IENPUlNDb25maWd1cmF0aW9uLkNPUlNSdWxlIHx8IFtdO1xuICAgIENPUlNSdWxlcyA9IHV0aWwuY2xvbmUodXRpbC5pc0FycmF5KENPUlNSdWxlcykgPyBDT1JTUnVsZXMgOiBbQ09SU1J1bGVzXSk7XG4gICAgdmFyIFJlc3BvbnNlVmFyeSA9IENPUlNDb25maWd1cmF0aW9uLlJlc3BvbnNlVmFyeTtcbiAgICB1dGlsLmVhY2goQ09SU1J1bGVzLCBmdW5jdGlvbiAocnVsZSkge1xuICAgICAgdXRpbC5lYWNoKFsnQWxsb3dlZE9yaWdpbicsICdBbGxvd2VkSGVhZGVyJywgJ0FsbG93ZWRNZXRob2QnLCAnRXhwb3NlSGVhZGVyJ10sIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHNLZXkgPSBrZXkgKyAncyc7XG4gICAgICAgIHZhciB2YWwgPSBydWxlW3NLZXldIHx8IHJ1bGVba2V5XSB8fCBbXTtcbiAgICAgICAgZGVsZXRlIHJ1bGVba2V5XTtcbiAgICAgICAgcnVsZVtzS2V5XSA9IHV0aWwuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBDT1JTUnVsZXM6IENPUlNSdWxlcyxcbiAgICAgIFJlc3BvbnNlVmFyeTogUmVzcG9uc2VWYXJ5LFxuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiDliKDpmaQgQnVja2V0IOeahCDot6jln5/orr7nva5cbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgICAgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gICAgICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgICAgICDov5Tlm57nmoTmlbDmja5cbiAqL1xuXG5cbmZ1bmN0aW9uIGRlbGV0ZUJ1Y2tldENvcnMocGFyYW1zLCBjYWxsYmFjaykge1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkRlbGV0ZUJ1Y2tldENPUlMnLFxuICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBhY3Rpb246ICdjb3JzJ1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzQ29kZSA9PT0gMjA0KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge1xuICAgICAgICBzdGF0dXNDb2RlOiBlcnIuc3RhdHVzQ29kZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSB8fCBlcnIuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cbi8qKlxuICog6I635Y+WIEJ1Y2tldCDnmoQg5Zyw5Z+f5L+h5oGvXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAg6L+U5Zue5pWw5o2u77yM5YyF5ZCr5Zyw5Z+f5L+h5oGvIExvY2F0aW9uQ29uc3RyYWludFxuICovXG5cblxuZnVuY3Rpb24gZ2V0QnVja2V0TG9jYXRpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkdldEJ1Y2tldExvY2F0aW9uJyxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgYWN0aW9uOiAnbG9jYXRpb24nXG4gIH0sIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gcHV0QnVja2V0UG9saWN5KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIFBvbGljeSA9IHBhcmFtc1snUG9saWN5J107XG5cbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIFBvbGljeSA9PT0gJ3N0cmluZycpIFBvbGljeSA9IEpTT04ucGFyc2UoUG9saWN5KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICBpZiAoIVBvbGljeSB8fCB0eXBlb2YgUG9saWN5ID09PSAnc3RyaW5nJykgcmV0dXJuIGNhbGxiYWNrKHV0aWwuZXJyb3IobmV3IEVycm9yKCdQb2xpY3kgZm9ybWF0IGVycm9yJykpKTtcbiAgdmFyIFBvbGljeVN0ciA9IEpTT04uc3RyaW5naWZ5KFBvbGljeSk7XG4gIGlmICghUG9saWN5LnZlcnNpb24pIFBvbGljeS52ZXJzaW9uID0gJzIuMCc7XG4gIHZhciBoZWFkZXJzID0gcGFyYW1zLkhlYWRlcnM7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdXRpbC5iaW5hcnlCYXNlNjQodXRpbC5tZDUoUG9saWN5U3RyKSk7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6UHV0QnVja2V0UG9saWN5JyxcbiAgICBtZXRob2Q6ICdQVVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgYWN0aW9uOiAncG9saWN5JyxcbiAgICBib2R5OiBQb2xpY3lTdHIsXG4gICAgaGVhZGVyczogaGVhZGVyc1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzQ29kZSA9PT0gMjA0KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge1xuICAgICAgICBzdGF0dXNDb2RlOiBlcnIuc3RhdHVzQ29kZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cbi8qKlxuICog6I635Y+WIEJ1Y2tldCDnmoTor7vlj5bmnYPpmZDnrZbnlaVcbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICDov5Tlm57mlbDmja5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEJ1Y2tldFBvbGljeShwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6R2V0QnVja2V0UG9saWN5JyxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgYWN0aW9uOiAncG9saWN5JyxcbiAgICByYXdCb2R5OiB0cnVlXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBpZiAoZXJyLnN0YXR1c0NvZGUgJiYgZXJyLnN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sodXRpbC5lcnJvcihlcnIsIHtcbiAgICAgICAgICBFcnJvclN0YXR1czogJ0FjY2VzcyBEZW5pZWQnXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVyci5zdGF0dXNDb2RlICYmIGVyci5zdGF0dXNDb2RlID09PSA0MDUpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHV0aWwuZXJyb3IoZXJyLCB7XG4gICAgICAgICAgRXJyb3JTdGF0dXM6ICdNZXRob2QgTm90IEFsbG93ZWQnXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVyci5zdGF0dXNDb2RlICYmIGVyci5zdGF0dXNDb2RlID09PSA0MDQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHV0aWwuZXJyb3IoZXJyLCB7XG4gICAgICAgICAgRXJyb3JTdGF0dXM6ICdQb2xpY3kgTm90IEZvdW5kJ1xuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIHZhciBQb2xpY3kgPSB7fTtcblxuICAgIHRyeSB7XG4gICAgICBQb2xpY3kgPSBKU09OLnBhcnNlKGRhdGEuYm9keSk7XG4gICAgfSBjYXRjaCAoZSkge31cblxuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIFBvbGljeTogUG9saWN5LFxuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiDliKDpmaQgQnVja2V0IOeahCDot6jln5/orr7nva5cbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgICAgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gICAgICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgICAgICDov5Tlm57nmoTmlbDmja5cbiAqL1xuXG5cbmZ1bmN0aW9uIGRlbGV0ZUJ1Y2tldFBvbGljeShwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6RGVsZXRlQnVja2V0UG9saWN5JyxcbiAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgYWN0aW9uOiAncG9saWN5J1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzQ29kZSA9PT0gMjA0KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge1xuICAgICAgICBzdGF0dXNDb2RlOiBlcnIuc3RhdHVzQ29kZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSB8fCBlcnIuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cbi8qKlxuICog6K6+572uIEJ1Y2tldCDnmoTmoIfnrb5cbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtBcnJheX0gICBwYXJhbXMuVGFnU2V0ICDmoIfnrb7orr7nva7vvIzlv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICDov5Tlm57mlbDmja5cbiAqL1xuXG5cbmZ1bmN0aW9uIHB1dEJ1Y2tldFRhZ2dpbmcocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgVGFnZ2luZyA9IHBhcmFtc1snVGFnZ2luZyddIHx8IHt9O1xuICB2YXIgVGFncyA9IFRhZ2dpbmcuVGFnU2V0IHx8IFRhZ2dpbmcuVGFncyB8fCBwYXJhbXNbJ1RhZ3MnXSB8fCBbXTtcbiAgVGFncyA9IHV0aWwuY2xvbmUodXRpbC5pc0FycmF5KFRhZ3MpID8gVGFncyA6IFtUYWdzXSk7XG4gIHZhciB4bWwgPSB1dGlsLmpzb24yeG1sKHtcbiAgICBUYWdnaW5nOiB7XG4gICAgICBUYWdTZXQ6IHtcbiAgICAgICAgVGFnOiBUYWdzXG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdmFyIGhlYWRlcnMgPSBwYXJhbXMuSGVhZGVycztcbiAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veG1sJztcbiAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHV0aWwuYmluYXJ5QmFzZTY0KHV0aWwubWQ1KHhtbCkpO1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOlB1dEJ1Y2tldFRhZ2dpbmcnLFxuICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBib2R5OiB4bWwsXG4gICAgYWN0aW9uOiAndGFnZ2luZycsXG4gICAgaGVhZGVyczogaGVhZGVyc1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzQ29kZSA9PT0gMjA0KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge1xuICAgICAgICBzdGF0dXNDb2RlOiBlcnIuc3RhdHVzQ29kZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cbi8qKlxuICog6I635Y+WIEJ1Y2tldCDnmoTmoIfnrb7orr7nva5cbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICDov5Tlm57mlbDmja5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEJ1Y2tldFRhZ2dpbmcocGFyYW1zLCBjYWxsYmFjaykge1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkdldEJ1Y2tldFRhZ2dpbmcnLFxuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBhY3Rpb246ICd0YWdnaW5nJ1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgaWYgKGVyci5zdGF0dXNDb2RlID09PSA0MDQgJiYgZXJyLmVycm9yICYmIChlcnIuZXJyb3IgPT09IFwiTm90IEZvdW5kXCIgfHwgZXJyLmVycm9yLkNvZGUgPT09ICdOb1N1Y2hUYWdTZXQnKSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICAgIFRhZ3M6IFtdLFxuICAgICAgICAgIHN0YXR1c0NvZGU6IGVyci5zdGF0dXNDb2RlXG4gICAgICAgIH07XG4gICAgICAgIGVyci5oZWFkZXJzICYmIChyZXN1bHQuaGVhZGVycyA9IGVyci5oZWFkZXJzKTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgVGFncyA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIFRhZ3MgPSBkYXRhLlRhZ2dpbmcuVGFnU2V0LlRhZyB8fCBbXTtcbiAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgVGFncyA9IHV0aWwuY2xvbmUodXRpbC5pc0FycmF5KFRhZ3MpID8gVGFncyA6IFtUYWdzXSk7XG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgVGFnczogVGFncyxcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cbi8qKlxuICog5Yig6ZmkIEJ1Y2tldCDnmoQg5qCH562+6K6+572uXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAg6L+U5Zue55qE5pWw5o2uXG4gKi9cblxuXG5mdW5jdGlvbiBkZWxldGVCdWNrZXRUYWdnaW5nKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpEZWxldGVCdWNrZXRUYWdnaW5nJyxcbiAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgYWN0aW9uOiAndGFnZ2luZydcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIgJiYgZXJyLnN0YXR1c0NvZGUgPT09IDIwNCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZTogZXJyLnN0YXR1c0NvZGVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHB1dEJ1Y2tldExpZmVjeWNsZShwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHZhciBMaWZlY3ljbGVDb25maWd1cmF0aW9uID0gcGFyYW1zWydMaWZlY3ljbGVDb25maWd1cmF0aW9uJ10gfHwge307XG4gIHZhciBSdWxlcyA9IExpZmVjeWNsZUNvbmZpZ3VyYXRpb24uUnVsZXMgfHwgcGFyYW1zLlJ1bGVzIHx8IFtdO1xuICBSdWxlcyA9IHV0aWwuY2xvbmUoUnVsZXMpO1xuICB2YXIgeG1sID0gdXRpbC5qc29uMnhtbCh7XG4gICAgTGlmZWN5Y2xlQ29uZmlndXJhdGlvbjoge1xuICAgICAgUnVsZTogUnVsZXNcbiAgICB9XG4gIH0pO1xuICB2YXIgaGVhZGVycyA9IHBhcmFtcy5IZWFkZXJzO1xuICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94bWwnO1xuICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdXRpbC5iaW5hcnlCYXNlNjQodXRpbC5tZDUoeG1sKSk7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6UHV0QnVja2V0TGlmZWN5Y2xlJyxcbiAgICBtZXRob2Q6ICdQVVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgYm9keTogeG1sLFxuICAgIGFjdGlvbjogJ2xpZmVjeWNsZScsXG4gICAgaGVhZGVyczogaGVhZGVyc1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzQ29kZSA9PT0gMjA0KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge1xuICAgICAgICBzdGF0dXNDb2RlOiBlcnIuc3RhdHVzQ29kZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0QnVja2V0TGlmZWN5Y2xlKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpHZXRCdWNrZXRMaWZlY3ljbGUnLFxuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBhY3Rpb246ICdsaWZlY3ljbGUnXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBpZiAoZXJyLnN0YXR1c0NvZGUgPT09IDQwNCAmJiBlcnIuZXJyb3IgJiYgZXJyLmVycm9yLkNvZGUgPT09ICdOb1N1Y2hMaWZlY3ljbGVDb25maWd1cmF0aW9uJykge1xuICAgICAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICAgIFJ1bGVzOiBbXSxcbiAgICAgICAgICBzdGF0dXNDb2RlOiBlcnIuc3RhdHVzQ29kZVxuICAgICAgICB9O1xuICAgICAgICBlcnIuaGVhZGVycyAmJiAocmVzdWx0LmhlYWRlcnMgPSBlcnIuaGVhZGVycyk7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIFJ1bGVzID0gW107XG5cbiAgICB0cnkge1xuICAgICAgUnVsZXMgPSBkYXRhLkxpZmVjeWNsZUNvbmZpZ3VyYXRpb24uUnVsZSB8fCBbXTtcbiAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgUnVsZXMgPSB1dGlsLmNsb25lKHV0aWwuaXNBcnJheShSdWxlcykgPyBSdWxlcyA6IFtSdWxlc10pO1xuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIFJ1bGVzOiBSdWxlcyxcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVsZXRlQnVja2V0TGlmZWN5Y2xlKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpEZWxldGVCdWNrZXRMaWZlY3ljbGUnLFxuICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBhY3Rpb246ICdsaWZlY3ljbGUnXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyICYmIGVyci5zdGF0dXNDb2RlID09PSAyMDQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIHN0YXR1c0NvZGU6IGVyci5zdGF0dXNDb2RlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwdXRCdWNrZXRWZXJzaW9uaW5nKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgaWYgKCFwYXJhbXNbJ1ZlcnNpb25pbmdDb25maWd1cmF0aW9uJ10pIHtcbiAgICBjYWxsYmFjayh1dGlsLmVycm9yKG5ldyBFcnJvcignbWlzc2luZyBwYXJhbSBWZXJzaW9uaW5nQ29uZmlndXJhdGlvbicpKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFZlcnNpb25pbmdDb25maWd1cmF0aW9uID0gcGFyYW1zWydWZXJzaW9uaW5nQ29uZmlndXJhdGlvbiddIHx8IHt9O1xuICB2YXIgeG1sID0gdXRpbC5qc29uMnhtbCh7XG4gICAgVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb246IFZlcnNpb25pbmdDb25maWd1cmF0aW9uXG4gIH0pO1xuICB2YXIgaGVhZGVycyA9IHBhcmFtcy5IZWFkZXJzO1xuICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94bWwnO1xuICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdXRpbC5iaW5hcnlCYXNlNjQodXRpbC5tZDUoeG1sKSk7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6UHV0QnVja2V0VmVyc2lvbmluZycsXG4gICAgbWV0aG9kOiAnUFVUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGJvZHk6IHhtbCxcbiAgICBhY3Rpb246ICd2ZXJzaW9uaW5nJyxcbiAgICBoZWFkZXJzOiBoZWFkZXJzXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyICYmIGVyci5zdGF0dXNDb2RlID09PSAyMDQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIHN0YXR1c0NvZGU6IGVyci5zdGF0dXNDb2RlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRCdWNrZXRWZXJzaW9uaW5nKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpHZXRCdWNrZXRWZXJzaW9uaW5nJyxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgYWN0aW9uOiAndmVyc2lvbmluZydcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmICghZXJyKSB7XG4gICAgICAhZGF0YS5WZXJzaW9uaW5nQ29uZmlndXJhdGlvbiAmJiAoZGF0YS5WZXJzaW9uaW5nQ29uZmlndXJhdGlvbiA9IHt9KTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhlcnIsIGRhdGEpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcHV0QnVja2V0UmVwbGljYXRpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgUmVwbGljYXRpb25Db25maWd1cmF0aW9uID0gdXRpbC5jbG9uZShwYXJhbXMuUmVwbGljYXRpb25Db25maWd1cmF0aW9uKTtcbiAgdmFyIHhtbCA9IHV0aWwuanNvbjJ4bWwoe1xuICAgIFJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbjogUmVwbGljYXRpb25Db25maWd1cmF0aW9uXG4gIH0pO1xuICB4bWwgPSB4bWwucmVwbGFjZSgvPChcXC8/KVJ1bGVzPi9pZywgJzwkMVJ1bGU+Jyk7XG4gIHhtbCA9IHhtbC5yZXBsYWNlKC88KFxcLz8pVGFncz4vaWcsICc8JDFUYWc+Jyk7XG4gIHZhciBoZWFkZXJzID0gcGFyYW1zLkhlYWRlcnM7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB1dGlsLmJpbmFyeUJhc2U2NCh1dGlsLm1kNSh4bWwpKTtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpQdXRCdWNrZXRSZXBsaWNhdGlvbicsXG4gICAgbWV0aG9kOiAnUFVUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGJvZHk6IHhtbCxcbiAgICBhY3Rpb246ICdyZXBsaWNhdGlvbicsXG4gICAgaGVhZGVyczogaGVhZGVyc1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzQ29kZSA9PT0gMjA0KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge1xuICAgICAgICBzdGF0dXNDb2RlOiBlcnIuc3RhdHVzQ29kZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0QnVja2V0UmVwbGljYXRpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkdldEJ1Y2tldFJlcGxpY2F0aW9uJyxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgYWN0aW9uOiAncmVwbGljYXRpb24nXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBpZiAoZXJyLnN0YXR1c0NvZGUgPT09IDQwNCAmJiBlcnIuZXJyb3IgJiYgKGVyci5lcnJvciA9PT0gJ05vdCBGb3VuZCcgfHwgZXJyLmVycm9yLkNvZGUgPT09ICdSZXBsaWNhdGlvbkNvbmZpZ3VyYXRpb25ub3RGb3VuZEVycm9yJykpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgICBSZXBsaWNhdGlvbkNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgIFJ1bGVzOiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzQ29kZTogZXJyLnN0YXR1c0NvZGVcbiAgICAgICAgfTtcbiAgICAgICAgZXJyLmhlYWRlcnMgJiYgKHJlc3VsdC5oZWFkZXJzID0gZXJyLmhlYWRlcnMpO1xuICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgICFkYXRhLlJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbiAmJiAoZGF0YS5SZXBsaWNhdGlvbkNvbmZpZ3VyYXRpb24gPSB7fSk7XG5cbiAgICBpZiAoZGF0YS5SZXBsaWNhdGlvbkNvbmZpZ3VyYXRpb24uUnVsZSkge1xuICAgICAgZGF0YS5SZXBsaWNhdGlvbkNvbmZpZ3VyYXRpb24uUnVsZXMgPSB1dGlsLm1ha2VBcnJheShkYXRhLlJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbi5SdWxlKTtcbiAgICAgIGRlbGV0ZSBkYXRhLlJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbi5SdWxlO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKGVyciwgZGF0YSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWxldGVCdWNrZXRSZXBsaWNhdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6RGVsZXRlQnVja2V0UmVwbGljYXRpb24nLFxuICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBhY3Rpb246ICdyZXBsaWNhdGlvbidcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIgJiYgZXJyLnN0YXR1c0NvZGUgPT09IDIwNCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZTogZXJyLnN0YXR1c0NvZGVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIOiuvue9riBCdWNrZXQg6Z2Z5oCB572R56uZ6YWN572u5L+h5oGvXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zLldlYnNpdGVDb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgICAgIEBwYXJhbSAge09iamVjdH0gICBXZWJzaXRlQ29uZmlndXJhdGlvbi5JbmRleERvY3VtZW50ICAgICAgICAgICAg57Si5byV5paH5qGj77yM5b+F6aG7XG4gKiAgICAgICAgIEBwYXJhbSAge09iamVjdH0gICBXZWJzaXRlQ29uZmlndXJhdGlvbi5FcnJvckRvY3VtZW50ICAgICAgICAgICAg6ZSZ6K+v5paH5qGj77yM6Z2e5b+F6aG7XG4gKiAgICAgICAgIEBwYXJhbSAge09iamVjdH0gICBXZWJzaXRlQ29uZmlndXJhdGlvbi5SZWRpcmVjdEFsbFJlcXVlc3RzVG8gICAg6YeN5a6a5ZCR5omA5pyJ6K+35rGC77yM6Z2e5b+F6aG7XG4gKiAgICAgICAgIEBwYXJhbSAge0FycmF5fSAgIHBhcmFtcy5Sb3V0aW5nUnVsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAg6YeN5a6a5ZCR6KeE5YiZ77yM6Z2e5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg6L+U5Zue5pWw5o2uXG4gKi9cblxuXG5mdW5jdGlvbiBwdXRCdWNrZXRXZWJzaXRlKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgaWYgKCFwYXJhbXNbJ1dlYnNpdGVDb25maWd1cmF0aW9uJ10pIHtcbiAgICBjYWxsYmFjayh1dGlsLmVycm9yKG5ldyBFcnJvcignbWlzc2luZyBwYXJhbSBXZWJzaXRlQ29uZmlndXJhdGlvbicpKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFdlYnNpdGVDb25maWd1cmF0aW9uID0gdXRpbC5jbG9uZShwYXJhbXNbJ1dlYnNpdGVDb25maWd1cmF0aW9uJ10gfHwge30pO1xuICB2YXIgUm91dGluZ1J1bGVzID0gV2Vic2l0ZUNvbmZpZ3VyYXRpb25bJ1JvdXRpbmdSdWxlcyddIHx8IFdlYnNpdGVDb25maWd1cmF0aW9uWydSb3V0aW5nUnVsZSddIHx8IFtdO1xuICBSb3V0aW5nUnVsZXMgPSB1dGlsLmlzQXJyYXkoUm91dGluZ1J1bGVzKSA/IFJvdXRpbmdSdWxlcyA6IFtSb3V0aW5nUnVsZXNdO1xuICBkZWxldGUgV2Vic2l0ZUNvbmZpZ3VyYXRpb24uUm91dGluZ1J1bGU7XG4gIGRlbGV0ZSBXZWJzaXRlQ29uZmlndXJhdGlvbi5Sb3V0aW5nUnVsZXM7XG4gIGlmIChSb3V0aW5nUnVsZXMubGVuZ3RoKSBXZWJzaXRlQ29uZmlndXJhdGlvbi5Sb3V0aW5nUnVsZXMgPSB7XG4gICAgUm91dGluZ1J1bGU6IFJvdXRpbmdSdWxlc1xuICB9O1xuICB2YXIgeG1sID0gdXRpbC5qc29uMnhtbCh7XG4gICAgV2Vic2l0ZUNvbmZpZ3VyYXRpb246IFdlYnNpdGVDb25maWd1cmF0aW9uXG4gIH0pO1xuICB2YXIgaGVhZGVycyA9IHBhcmFtcy5IZWFkZXJzO1xuICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94bWwnO1xuICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdXRpbC5iaW5hcnlCYXNlNjQodXRpbC5tZDUoeG1sKSk7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6UHV0QnVja2V0V2Vic2l0ZScsXG4gICAgbWV0aG9kOiAnUFVUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGJvZHk6IHhtbCxcbiAgICBhY3Rpb246ICd3ZWJzaXRlJyxcbiAgICBoZWFkZXJzOiBoZWFkZXJzXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyICYmIGVyci5zdGF0dXNDb2RlID09PSAyMDQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIHN0YXR1c0NvZGU6IGVyci5zdGF0dXNDb2RlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiDojrflj5YgQnVja2V0IOeahOmdmeaAgee9keermemFjee9ruS/oeaBr1xuICogQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gIOWcsOWfn+WQjeensO+8jOW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgIOWbnuiwg+WHveaVsO+8jOW/hemhu1xuICogQHJldHVybiAge09iamVjdH0gIGVyciAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgIOi/lOWbnuaVsOaNrlxuICovXG5cblxuZnVuY3Rpb24gZ2V0QnVja2V0V2Vic2l0ZShwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6R2V0QnVja2V0V2Vic2l0ZScsXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIEtleTogcGFyYW1zLktleSxcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBhY3Rpb246ICd3ZWJzaXRlJ1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgaWYgKGVyci5zdGF0dXNDb2RlID09PSA0MDQgJiYgZXJyLmVycm9yLkNvZGUgPT09ICdOb1N1Y2hXZWJzaXRlQ29uZmlndXJhdGlvbicpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgICBXZWJzaXRlQ29uZmlndXJhdGlvbjoge30sXG4gICAgICAgICAgc3RhdHVzQ29kZTogZXJyLnN0YXR1c0NvZGVcbiAgICAgICAgfTtcbiAgICAgICAgZXJyLmhlYWRlcnMgJiYgKHJlc3VsdC5oZWFkZXJzID0gZXJyLmhlYWRlcnMpO1xuICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBXZWJzaXRlQ29uZmlndXJhdGlvbiA9IGRhdGEuV2Vic2l0ZUNvbmZpZ3VyYXRpb24gfHwge307XG5cbiAgICBpZiAoV2Vic2l0ZUNvbmZpZ3VyYXRpb25bJ1JvdXRpbmdSdWxlcyddKSB7XG4gICAgICB2YXIgUm91dGluZ1J1bGVzID0gdXRpbC5jbG9uZShXZWJzaXRlQ29uZmlndXJhdGlvblsnUm91dGluZ1J1bGVzJ10uUm91dGluZ1J1bGUgfHwgW10pO1xuICAgICAgUm91dGluZ1J1bGVzID0gdXRpbC5tYWtlQXJyYXkoUm91dGluZ1J1bGVzKTtcbiAgICAgIFdlYnNpdGVDb25maWd1cmF0aW9uLlJvdXRpbmdSdWxlcyA9IFJvdXRpbmdSdWxlcztcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBXZWJzaXRlQ29uZmlndXJhdGlvbjogV2Vic2l0ZUNvbmZpZ3VyYXRpb24sXG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIOWIoOmZpCBCdWNrZXQg55qE6Z2Z5oCB572R56uZ6YWN572uXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAg6L+U5Zue5pWw5o2uXG4gKi9cblxuXG5mdW5jdGlvbiBkZWxldGVCdWNrZXRXZWJzaXRlKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpEZWxldGVCdWNrZXRXZWJzaXRlJyxcbiAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgYWN0aW9uOiAnd2Vic2l0ZSdcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIgJiYgZXJyLnN0YXR1c0NvZGUgPT09IDIwNCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZTogZXJyLnN0YXR1c0NvZGVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIOiuvue9riBCdWNrZXQg55qE6Ziy55uX6ZO+55m95ZCN5Y2V5oiW6ICF6buR5ZCN5Y2VXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zLlJlZmVyZXJDb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgICAgIEBwYXJhbSAge1N0cmluZ30gICBSZWZlcmVyQ29uZmlndXJhdGlvbi5TdGF0dXMgICAgICAgICAgICAgICAgICAg5piv5ZCm5byA5ZCv6Ziy55uX6ZO+77yM5p6a5Li+5YC877yaRW5hYmxlZOOAgURpc2FibGVkXG4gKiAgICAgICAgIEBwYXJhbSAge1N0cmluZ30gICBSZWZlcmVyQ29uZmlndXJhdGlvbi5SZWZlcmVyVHlwZSAgICAgICAgICAgICAg6Ziy55uX6ZO+57G75Z6L77yM5p6a5Li+5YC877yaQmxhY2stTGlzdOOAgVdoaXRlLUxpc3TvvIzlv4XpobtcbiAqICAgICAgICAgQHBhcmFtICB7QXJyYXl9ICAgUmVmZXJlckNvbmZpZ3VyYXRpb24uRG9taWFuTGlzdC5Eb21haW4gICAgICAgICDnlJ/mlYjln5/lkI3vvIzlv4XpobtcbiAqICAgICAgICAgQHBhcmFtICB7U3RyaW5nfSAgIFJlZmVyZXJDb25maWd1cmF0aW9uLkVtcHR5UmVmZXJDb25maWd1cmF0aW9uICDvvIzpnZ7lv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDov5Tlm57mlbDmja5cbiAqL1xuXG5cbmZ1bmN0aW9uIHB1dEJ1Y2tldFJlZmVyZXIocGFyYW1zLCBjYWxsYmFjaykge1xuICBpZiAoIXBhcmFtc1snUmVmZXJlckNvbmZpZ3VyYXRpb24nXSkge1xuICAgIGNhbGxiYWNrKHV0aWwuZXJyb3IobmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtIFJlZmVyZXJDb25maWd1cmF0aW9uJykpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgUmVmZXJlckNvbmZpZ3VyYXRpb24gPSB1dGlsLmNsb25lKHBhcmFtc1snUmVmZXJlckNvbmZpZ3VyYXRpb24nXSB8fCB7fSk7XG4gIHZhciBEb21haW5MaXN0ID0gUmVmZXJlckNvbmZpZ3VyYXRpb25bJ0RvbWFpbkxpc3QnXSB8fCB7fTtcbiAgdmFyIERvbWFpbnMgPSBEb21haW5MaXN0WydEb21haW5zJ10gfHwgRG9tYWluTGlzdFsnRG9tYWluJ10gfHwgW107XG4gIERvbWFpbnMgPSB1dGlsLmlzQXJyYXkoRG9tYWlucykgPyBEb21haW5zIDogW0RvbWFpbnNdO1xuICBpZiAoRG9tYWlucy5sZW5ndGgpIFJlZmVyZXJDb25maWd1cmF0aW9uLkRvbWFpbkxpc3QgPSB7XG4gICAgRG9tYWluOiBEb21haW5zXG4gIH07XG4gIHZhciB4bWwgPSB1dGlsLmpzb24yeG1sKHtcbiAgICBSZWZlcmVyQ29uZmlndXJhdGlvbjogUmVmZXJlckNvbmZpZ3VyYXRpb25cbiAgfSk7XG4gIHZhciBoZWFkZXJzID0gcGFyYW1zLkhlYWRlcnM7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB1dGlsLmJpbmFyeUJhc2U2NCh1dGlsLm1kNSh4bWwpKTtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpQdXRCdWNrZXRSZWZlcmVyJyxcbiAgICBtZXRob2Q6ICdQVVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgYm9keTogeG1sLFxuICAgIGFjdGlvbjogJ3JlZmVyZXInLFxuICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIgJiYgZXJyLnN0YXR1c0NvZGUgPT09IDIwNCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZTogZXJyLnN0YXR1c0NvZGVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIOiOt+WPliBCdWNrZXQg55qE6Ziy55uX6ZO+55m95ZCN5Y2V5oiW6ICF6buR5ZCN5Y2VXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAg6L+U5Zue5pWw5o2uXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRCdWNrZXRSZWZlcmVyKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpHZXRCdWNrZXRSZWZlcmVyJyxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgS2V5OiBwYXJhbXMuS2V5LFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgIGFjdGlvbjogJ3JlZmVyZXInXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBpZiAoZXJyLnN0YXR1c0NvZGUgPT09IDQwNCAmJiBlcnIuZXJyb3IuQ29kZSA9PT0gJ05vU3VjaFJlZmVyZXJDb25maWd1cmF0aW9uJykge1xuICAgICAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICAgIFdlYnNpdGVDb25maWd1cmF0aW9uOiB7fSxcbiAgICAgICAgICBzdGF0dXNDb2RlOiBlcnIuc3RhdHVzQ29kZVxuICAgICAgICB9O1xuICAgICAgICBlcnIuaGVhZGVycyAmJiAocmVzdWx0LmhlYWRlcnMgPSBlcnIuaGVhZGVycyk7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIFJlZmVyZXJDb25maWd1cmF0aW9uID0gZGF0YS5SZWZlcmVyQ29uZmlndXJhdGlvbiB8fCB7fTtcblxuICAgIGlmIChSZWZlcmVyQ29uZmlndXJhdGlvblsnRG9tYWluTGlzdCddKSB7XG4gICAgICB2YXIgRG9tYWlucyA9IHV0aWwubWFrZUFycmF5KFJlZmVyZXJDb25maWd1cmF0aW9uWydEb21haW5MaXN0J10uRG9tYWluIHx8IFtdKTtcbiAgICAgIFJlZmVyZXJDb25maWd1cmF0aW9uLkRvbWFpbkxpc3QgPSB7XG4gICAgICAgIERvbWFpbnM6IERvbWFpbnNcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgUmVmZXJlckNvbmZpZ3VyYXRpb246IFJlZmVyZXJDb25maWd1cmF0aW9uLFxuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiDorr7nva4gQnVja2V0IOiHquWumuS5ieWfn+WQjVxuICogQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWcsOWfn+WQjeensO+8jOW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWbnuiwg+WHveaVsO+8jOW/hemhu1xuICogQHJldHVybiAge09iamVjdH0gIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOi/lOWbnuaVsOaNrlxuICovXG5cblxuZnVuY3Rpb24gcHV0QnVja2V0RG9tYWluKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIERvbWFpbkNvbmZpZ3VyYXRpb24gPSBwYXJhbXNbJ0RvbWFpbkNvbmZpZ3VyYXRpb24nXSB8fCB7fTtcbiAgdmFyIERvbWFpblJ1bGUgPSBEb21haW5Db25maWd1cmF0aW9uLkRvbWFpblJ1bGUgfHwgcGFyYW1zLkRvbWFpblJ1bGUgfHwgW107XG4gIERvbWFpblJ1bGUgPSB1dGlsLmNsb25lKERvbWFpblJ1bGUpO1xuICB2YXIgeG1sID0gdXRpbC5qc29uMnhtbCh7XG4gICAgRG9tYWluQ29uZmlndXJhdGlvbjoge1xuICAgICAgRG9tYWluUnVsZTogRG9tYWluUnVsZVxuICAgIH1cbiAgfSk7XG4gIHZhciBoZWFkZXJzID0gcGFyYW1zLkhlYWRlcnM7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB1dGlsLmJpbmFyeUJhc2U2NCh1dGlsLm1kNSh4bWwpKTtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpQdXRCdWNrZXREb21haW4nLFxuICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBib2R5OiB4bWwsXG4gICAgYWN0aW9uOiAnZG9tYWluJyxcbiAgICBoZWFkZXJzOiBoZWFkZXJzXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyICYmIGVyci5zdGF0dXNDb2RlID09PSAyMDQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIHN0YXR1c0NvZGU6IGVyci5zdGF0dXNDb2RlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiDojrflj5YgQnVja2V0IOeahOiHquWumuS5ieWfn+WQjVxuICogQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gIOWcsOWfn+WQjeensO+8jOW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgIOWbnuiwg+WHveaVsO+8jOW/hemhu1xuICogQHJldHVybiAge09iamVjdH0gIGVyciAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgIOi/lOWbnuaVsOaNrlxuICovXG5cblxuZnVuY3Rpb24gZ2V0QnVja2V0RG9tYWluKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpHZXRCdWNrZXREb21haW4nLFxuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBhY3Rpb246ICdkb21haW4nXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB2YXIgRG9tYWluUnVsZSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIERvbWFpblJ1bGUgPSBkYXRhLkRvbWFpbkNvbmZpZ3VyYXRpb24uRG9tYWluUnVsZSB8fCBbXTtcbiAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgRG9tYWluUnVsZSA9IHV0aWwuY2xvbmUodXRpbC5pc0FycmF5KERvbWFpblJ1bGUpID8gRG9tYWluUnVsZSA6IFtEb21haW5SdWxlXSk7XG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgRG9tYWluUnVsZTogRG9tYWluUnVsZSxcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cbi8qKlxuICog5Yig6ZmkIEJ1Y2tldCDoh6rlrprkuYnln5/lkI1cbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICDov5Tlm57mlbDmja5cbiAqL1xuXG5cbmZ1bmN0aW9uIGRlbGV0ZUJ1Y2tldERvbWFpbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6RGVsZXRlQnVja2V0RG9tYWluJyxcbiAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgYWN0aW9uOiAnZG9tYWluJ1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzQ29kZSA9PT0gMjA0KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge1xuICAgICAgICBzdGF0dXNDb2RlOiBlcnIuc3RhdHVzQ29kZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cbi8qKlxuICog6K6+572uIEJ1Y2tldCDnmoTlm57mupBcbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDov5Tlm57mlbDmja5cbiAqL1xuXG5cbmZ1bmN0aW9uIHB1dEJ1Y2tldE9yaWdpbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHZhciBPcmlnaW5Db25maWd1cmF0aW9uID0gcGFyYW1zWydPcmlnaW5Db25maWd1cmF0aW9uJ10gfHwge307XG4gIHZhciBPcmlnaW5SdWxlID0gT3JpZ2luQ29uZmlndXJhdGlvbi5PcmlnaW5SdWxlIHx8IHBhcmFtcy5PcmlnaW5SdWxlIHx8IFtdO1xuICBPcmlnaW5SdWxlID0gdXRpbC5jbG9uZShPcmlnaW5SdWxlKTtcbiAgdmFyIHhtbCA9IHV0aWwuanNvbjJ4bWwoe1xuICAgIE9yaWdpbkNvbmZpZ3VyYXRpb246IHtcbiAgICAgIE9yaWdpblJ1bGU6IE9yaWdpblJ1bGVcbiAgICB9XG4gIH0pO1xuICB2YXIgaGVhZGVycyA9IHBhcmFtcy5IZWFkZXJzO1xuICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94bWwnO1xuICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdXRpbC5iaW5hcnlCYXNlNjQodXRpbC5tZDUoeG1sKSk7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6UHV0QnVja2V0T3JpZ2luJyxcbiAgICBtZXRob2Q6ICdQVVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgYm9keTogeG1sLFxuICAgIGFjdGlvbjogJ29yaWdpbicsXG4gICAgaGVhZGVyczogaGVhZGVyc1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzQ29kZSA9PT0gMjA0KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge1xuICAgICAgICBzdGF0dXNDb2RlOiBlcnIuc3RhdHVzQ29kZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cbi8qKlxuICog6I635Y+WIEJ1Y2tldCDnmoTlm57mupBcbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICDov5Tlm57mlbDmja5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEJ1Y2tldE9yaWdpbihwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6R2V0QnVja2V0T3JpZ2luJyxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgYWN0aW9uOiAnb3JpZ2luJ1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgdmFyIE9yaWdpblJ1bGUgPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICBPcmlnaW5SdWxlID0gZGF0YS5PcmlnaW5Db25maWd1cmF0aW9uLk9yaWdpblJ1bGUgfHwgW107XG4gICAgfSBjYXRjaCAoZSkge31cblxuICAgIE9yaWdpblJ1bGUgPSB1dGlsLmNsb25lKHV0aWwuaXNBcnJheShPcmlnaW5SdWxlKSA/IE9yaWdpblJ1bGUgOiBbT3JpZ2luUnVsZV0pO1xuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIE9yaWdpblJ1bGU6IE9yaWdpblJ1bGUsXG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIOWIoOmZpCBCdWNrZXQg55qE5Zue5rqQXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAg6L+U5Zue5pWw5o2uXG4gKi9cblxuXG5mdW5jdGlvbiBkZWxldGVCdWNrZXRPcmlnaW4ocGFyYW1zLCBjYWxsYmFjaykge1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkRlbGV0ZUJ1Y2tldE9yaWdpbicsXG4gICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgIGFjdGlvbjogJ29yaWdpbidcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIgJiYgZXJyLnN0YXR1c0NvZGUgPT09IDIwNCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZTogZXJyLnN0YXR1c0NvZGVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIOiuvue9riBCdWNrZXQg55qE5pel5b+X6K6w5b2VXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7KE9iamVjdHxTdHJpbmcpfSAgcGFyYW1zLkJ1Y2tldExvZ2dpbmdTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAg6K+05piO5pel5b+X6K6w5b2V6YWN572u55qE54q25oCB77yM5aaC5p6c5peg5a2Q6IqC54K55L+h5oGv5YiZ5oSP5Li65YWz6Zet5pel5b+X6K6w5b2V77yM5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg6L+U5Zue5pWw5o2uXG4gKi9cblxuXG5mdW5jdGlvbiBwdXRCdWNrZXRMb2dnaW5nKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIHhtbCA9IHV0aWwuanNvbjJ4bWwoe1xuICAgIEJ1Y2tldExvZ2dpbmdTdGF0dXM6IHBhcmFtc1snQnVja2V0TG9nZ2luZ1N0YXR1cyddIHx8ICcnXG4gIH0pO1xuICB2YXIgaGVhZGVycyA9IHBhcmFtcy5IZWFkZXJzO1xuICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94bWwnO1xuICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdXRpbC5iaW5hcnlCYXNlNjQodXRpbC5tZDUoeG1sKSk7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6UHV0QnVja2V0TG9nZ2luZycsXG4gICAgbWV0aG9kOiAnUFVUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGJvZHk6IHhtbCxcbiAgICBhY3Rpb246ICdsb2dnaW5nJyxcbiAgICBoZWFkZXJzOiBoZWFkZXJzXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyICYmIGVyci5zdGF0dXNDb2RlID09PSAyMDQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIHN0YXR1c0NvZGU6IGVyci5zdGF0dXNDb2RlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiDojrflj5YgQnVja2V0IOeahOaXpeW/l+iusOW9lVxuICogQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gIOWcsOWfn+WQjeensO+8jOW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgIOWbnuiwg+WHveaVsO+8jOW/hemhu1xuICogQHJldHVybiAge09iamVjdH0gIGVyciAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgIOi/lOWbnuaVsOaNrlxuICovXG5cblxuZnVuY3Rpb24gZ2V0QnVja2V0TG9nZ2luZyhwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6R2V0QnVja2V0TG9nZ2luZycsXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgIGFjdGlvbjogJ2xvZ2dpbmcnXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBCdWNrZXRMb2dnaW5nU3RhdHVzOiBkYXRhLkJ1Y2tldExvZ2dpbmdTdGF0dXMsXG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIOWIm+W7ui/nvJbovpEgQnVja2V0IOeahOa4heWNleS7u+WKoVxuICogQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWcsOWfn+WQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOa4heWNleS7u+WKoeeahOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcy5JbnZlbnRvcnlDb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgIOWMheWQq+a4heWNleeahOmFjee9ruWPguaVsO+8jOW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWbnuiwg+WHveaVsO+8jOW/hemhu1xuICogQHJldHVybiAge09iamVjdH0gIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOi/lOWbnuaVsOaNrlxuICovXG5cblxuZnVuY3Rpb24gcHV0QnVja2V0SW52ZW50b3J5KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIEludmVudG9yeUNvbmZpZ3VyYXRpb24gPSB1dGlsLmNsb25lKHBhcmFtc1snSW52ZW50b3J5Q29uZmlndXJhdGlvbiddKTtcblxuICBpZiAoSW52ZW50b3J5Q29uZmlndXJhdGlvbi5PcHRpb25hbEZpZWxkcykge1xuICAgIHZhciBGaWVsZCA9IEludmVudG9yeUNvbmZpZ3VyYXRpb24uT3B0aW9uYWxGaWVsZHMgfHwgW107XG4gICAgSW52ZW50b3J5Q29uZmlndXJhdGlvbi5PcHRpb25hbEZpZWxkcyA9IHtcbiAgICAgIEZpZWxkOiBGaWVsZFxuICAgIH07XG4gIH1cblxuICBpZiAoSW52ZW50b3J5Q29uZmlndXJhdGlvbi5EZXN0aW5hdGlvbiAmJiBJbnZlbnRvcnlDb25maWd1cmF0aW9uLkRlc3RpbmF0aW9uLkNPU0J1Y2tldERlc3RpbmF0aW9uICYmIEludmVudG9yeUNvbmZpZ3VyYXRpb24uRGVzdGluYXRpb24uQ09TQnVja2V0RGVzdGluYXRpb24uRW5jcnlwdGlvbikge1xuICAgIHZhciBFbmNyeXB0aW9uID0gSW52ZW50b3J5Q29uZmlndXJhdGlvbi5EZXN0aW5hdGlvbi5DT1NCdWNrZXREZXN0aW5hdGlvbi5FbmNyeXB0aW9uO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKEVuY3J5cHRpb24pLmluZGV4T2YoJ1NTRUNPUycpID4gLTEpIHtcbiAgICAgIEVuY3J5cHRpb25bJ1NTRS1DT1MnXSA9IEVuY3J5cHRpb25bJ1NTRUNPUyddO1xuICAgICAgZGVsZXRlIEVuY3J5cHRpb25bJ1NTRUNPUyddO1xuICAgIH1cbiAgfVxuXG4gIHZhciB4bWwgPSB1dGlsLmpzb24yeG1sKHtcbiAgICBJbnZlbnRvcnlDb25maWd1cmF0aW9uOiBJbnZlbnRvcnlDb25maWd1cmF0aW9uXG4gIH0pO1xuICB2YXIgaGVhZGVycyA9IHBhcmFtcy5IZWFkZXJzO1xuICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94bWwnO1xuICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdXRpbC5iaW5hcnlCYXNlNjQodXRpbC5tZDUoeG1sKSk7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6UHV0QnVja2V0SW52ZW50b3J5JyxcbiAgICBtZXRob2Q6ICdQVVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgYm9keTogeG1sLFxuICAgIGFjdGlvbjogJ2ludmVudG9yeScsXG4gICAgcXM6IHtcbiAgICAgIGlkOiBwYXJhbXNbJ0lkJ11cbiAgICB9LFxuICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIgJiYgZXJyLnN0YXR1c0NvZGUgPT09IDIwNCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZTogZXJyLnN0YXR1c0NvZGVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIOiOt+WPliBCdWNrZXQg55qE5riF5Y2V5Lu75Yqh5L+h5oGvXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLklkICAgICAg5riF5Y2V5Lu75Yqh55qE5ZCN56ew77yM5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAg6L+U5Zue5pWw5o2uXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRCdWNrZXRJbnZlbnRvcnkocGFyYW1zLCBjYWxsYmFjaykge1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkdldEJ1Y2tldEludmVudG9yeScsXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgIGFjdGlvbjogJ2ludmVudG9yeScsXG4gICAgcXM6IHtcbiAgICAgIGlkOiBwYXJhbXNbJ0lkJ11cbiAgICB9XG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB2YXIgSW52ZW50b3J5Q29uZmlndXJhdGlvbiA9IGRhdGFbJ0ludmVudG9yeUNvbmZpZ3VyYXRpb24nXTtcblxuICAgIGlmIChJbnZlbnRvcnlDb25maWd1cmF0aW9uICYmIEludmVudG9yeUNvbmZpZ3VyYXRpb24uT3B0aW9uYWxGaWVsZHMgJiYgSW52ZW50b3J5Q29uZmlndXJhdGlvbi5PcHRpb25hbEZpZWxkcy5GaWVsZCkge1xuICAgICAgdmFyIEZpZWxkID0gSW52ZW50b3J5Q29uZmlndXJhdGlvbi5PcHRpb25hbEZpZWxkcy5GaWVsZDtcblxuICAgICAgaWYgKCF1dGlsLmlzQXJyYXkoRmllbGQpKSB7XG4gICAgICAgIEZpZWxkID0gW0ZpZWxkXTtcbiAgICAgIH1cblxuICAgICAgSW52ZW50b3J5Q29uZmlndXJhdGlvbi5PcHRpb25hbEZpZWxkcyA9IEZpZWxkO1xuICAgIH1cblxuICAgIGlmIChJbnZlbnRvcnlDb25maWd1cmF0aW9uLkRlc3RpbmF0aW9uICYmIEludmVudG9yeUNvbmZpZ3VyYXRpb24uRGVzdGluYXRpb24uQ09TQnVja2V0RGVzdGluYXRpb24gJiYgSW52ZW50b3J5Q29uZmlndXJhdGlvbi5EZXN0aW5hdGlvbi5DT1NCdWNrZXREZXN0aW5hdGlvbi5FbmNyeXB0aW9uKSB7XG4gICAgICB2YXIgRW5jcnlwdGlvbiA9IEludmVudG9yeUNvbmZpZ3VyYXRpb24uRGVzdGluYXRpb24uQ09TQnVja2V0RGVzdGluYXRpb24uRW5jcnlwdGlvbjtcblxuICAgICAgaWYgKE9iamVjdC5rZXlzKEVuY3J5cHRpb24pLmluZGV4T2YoJ1NTRS1DT1MnKSA+IC0xKSB7XG4gICAgICAgIEVuY3J5cHRpb25bJ1NTRUNPUyddID0gRW5jcnlwdGlvblsnU1NFLUNPUyddO1xuICAgICAgICBkZWxldGUgRW5jcnlwdGlvblsnU1NFLUNPUyddO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIEludmVudG9yeUNvbmZpZ3VyYXRpb246IEludmVudG9yeUNvbmZpZ3VyYXRpb24sXG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIOiOt+WPliBCdWNrZXQg55qE5riF5Y2V5Lu75Yqh5L+h5oGvXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgICAgICAgICAgICAgICAgICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAgICAgICAgICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkNvbnRpbnVhdGlvblRva2VuICAgICAgIOW9kyBDT1Mg5ZON5bqU5L2T5LitIElzVHJ1bmNhdGVkIOS4uiB0cnVl77yM5LiUIE5leHRDb250aW51YXRpb25Ub2tlbiDoioLngrnkuK3lrZjlnKjlj4LmlbDlgLzml7bvvIzmgqjlj6/ku6XlsIbov5nkuKrlj4LmlbDkvZzkuLogY29udGludWF0aW9uLXRva2VuIOWPguaVsOWAvO+8jOS7peiOt+WPluS4i+S4gOmhteeahOa4heWNleS7u+WKoeS/oeaBr++8jOmdnuW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOi/lOWbnuaVsOaNrlxuICovXG5cblxuZnVuY3Rpb24gbGlzdEJ1Y2tldEludmVudG9yeShwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6TGlzdEJ1Y2tldEludmVudG9yeScsXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgIGFjdGlvbjogJ2ludmVudG9yeScsXG4gICAgcXM6IHtcbiAgICAgICdjb250aW51YXRpb24tdG9rZW4nOiBwYXJhbXNbJ0NvbnRpbnVhdGlvblRva2VuJ11cbiAgICB9XG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB2YXIgTGlzdEludmVudG9yeUNvbmZpZ3VyYXRpb25SZXN1bHQgPSBkYXRhWydMaXN0SW52ZW50b3J5Q29uZmlndXJhdGlvblJlc3VsdCddO1xuICAgIHZhciBJbnZlbnRvcnlDb25maWd1cmF0aW9ucyA9IExpc3RJbnZlbnRvcnlDb25maWd1cmF0aW9uUmVzdWx0LkludmVudG9yeUNvbmZpZ3VyYXRpb24gfHwgW107XG4gICAgSW52ZW50b3J5Q29uZmlndXJhdGlvbnMgPSB1dGlsLmlzQXJyYXkoSW52ZW50b3J5Q29uZmlndXJhdGlvbnMpID8gSW52ZW50b3J5Q29uZmlndXJhdGlvbnMgOiBbSW52ZW50b3J5Q29uZmlndXJhdGlvbnNdO1xuICAgIGRlbGV0ZSBMaXN0SW52ZW50b3J5Q29uZmlndXJhdGlvblJlc3VsdFsnSW52ZW50b3J5Q29uZmlndXJhdGlvbiddO1xuICAgIHV0aWwuZWFjaChJbnZlbnRvcnlDb25maWd1cmF0aW9ucywgZnVuY3Rpb24gKEludmVudG9yeUNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIGlmIChJbnZlbnRvcnlDb25maWd1cmF0aW9uICYmIEludmVudG9yeUNvbmZpZ3VyYXRpb24uT3B0aW9uYWxGaWVsZHMgJiYgSW52ZW50b3J5Q29uZmlndXJhdGlvbi5PcHRpb25hbEZpZWxkcy5GaWVsZCkge1xuICAgICAgICB2YXIgRmllbGQgPSBJbnZlbnRvcnlDb25maWd1cmF0aW9uLk9wdGlvbmFsRmllbGRzLkZpZWxkO1xuXG4gICAgICAgIGlmICghdXRpbC5pc0FycmF5KEZpZWxkKSkge1xuICAgICAgICAgIEZpZWxkID0gW0ZpZWxkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIEludmVudG9yeUNvbmZpZ3VyYXRpb24uT3B0aW9uYWxGaWVsZHMgPSBGaWVsZDtcbiAgICAgIH1cblxuICAgICAgaWYgKEludmVudG9yeUNvbmZpZ3VyYXRpb24uRGVzdGluYXRpb24gJiYgSW52ZW50b3J5Q29uZmlndXJhdGlvbi5EZXN0aW5hdGlvbi5DT1NCdWNrZXREZXN0aW5hdGlvbiAmJiBJbnZlbnRvcnlDb25maWd1cmF0aW9uLkRlc3RpbmF0aW9uLkNPU0J1Y2tldERlc3RpbmF0aW9uLkVuY3J5cHRpb24pIHtcbiAgICAgICAgdmFyIEVuY3J5cHRpb24gPSBJbnZlbnRvcnlDb25maWd1cmF0aW9uLkRlc3RpbmF0aW9uLkNPU0J1Y2tldERlc3RpbmF0aW9uLkVuY3J5cHRpb247XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKEVuY3J5cHRpb24pLmluZGV4T2YoJ1NTRS1DT1MnKSA+IC0xKSB7XG4gICAgICAgICAgRW5jcnlwdGlvblsnU1NFQ09TJ10gPSBFbmNyeXB0aW9uWydTU0UtQ09TJ107XG4gICAgICAgICAgZGVsZXRlIEVuY3J5cHRpb25bJ1NTRS1DT1MnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIExpc3RJbnZlbnRvcnlDb25maWd1cmF0aW9uUmVzdWx0LkludmVudG9yeUNvbmZpZ3VyYXRpb25zID0gSW52ZW50b3J5Q29uZmlndXJhdGlvbnM7XG4gICAgdXRpbC5leHRlbmQoTGlzdEludmVudG9yeUNvbmZpZ3VyYXRpb25SZXN1bHQsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICAgIGNhbGxiYWNrKG51bGwsIExpc3RJbnZlbnRvcnlDb25maWd1cmF0aW9uUmVzdWx0KTtcbiAgfSk7XG59XG4vKipcbiAqIOWIoOmZpCBCdWNrZXQg55qE5riF5Y2V5Lu75YqhXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLklkICAgICAg5riF5Y2V5Lu75Yqh55qE5ZCN56ew77yM5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAg6L+U5Zue5pWw5o2uXG4gKi9cblxuXG5mdW5jdGlvbiBkZWxldGVCdWNrZXRJbnZlbnRvcnkocGFyYW1zLCBjYWxsYmFjaykge1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkRlbGV0ZUJ1Y2tldEludmVudG9yeScsXG4gICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgIGFjdGlvbjogJ2ludmVudG9yeScsXG4gICAgcXM6IHtcbiAgICAgIGlkOiBwYXJhbXNbJ0lkJ11cbiAgICB9XG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyICYmIGVyci5zdGF0dXNDb2RlID09PSAyMDQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIHN0YXR1c0NvZGU6IGVyci5zdGF0dXNDb2RlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuLyog5YWo55CD5Yqg6YCfICovXG5cblxuZnVuY3Rpb24gcHV0QnVja2V0QWNjZWxlcmF0ZShwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGlmICghcGFyYW1zWydBY2NlbGVyYXRlQ29uZmlndXJhdGlvbiddKSB7XG4gICAgY2FsbGJhY2sodXRpbC5lcnJvcihuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW0gQWNjZWxlcmF0ZUNvbmZpZ3VyYXRpb24nKSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBjb25maWd1cmF0aW9uID0ge1xuICAgIEFjY2VsZXJhdGVDb25maWd1cmF0aW9uOiBwYXJhbXMuQWNjZWxlcmF0ZUNvbmZpZ3VyYXRpb24gfHwge31cbiAgfTtcbiAgdmFyIHhtbCA9IHV0aWwuanNvbjJ4bWwoY29uZmlndXJhdGlvbik7XG4gIHZhciBoZWFkZXJzID0ge307XG4gIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB1dGlsLmJpbmFyeUJhc2U2NCh1dGlsLm1kNSh4bWwpKTtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpQdXRCdWNrZXRBY2NlbGVyYXRlJyxcbiAgICBtZXRob2Q6ICdQVVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgYm9keTogeG1sLFxuICAgIGFjdGlvbjogJ2FjY2VsZXJhdGUnLFxuICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0QnVja2V0QWNjZWxlcmF0ZShwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6R2V0QnVja2V0QWNjZWxlcmF0ZScsXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGFjdGlvbjogJ2FjY2VsZXJhdGUnXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoIWVycikge1xuICAgICAgIWRhdGEuQWNjZWxlcmF0ZUNvbmZpZ3VyYXRpb24gJiYgKGRhdGEuQWNjZWxlcmF0ZUNvbmZpZ3VyYXRpb24gPSB7fSk7XG4gICAgfVxuXG4gICAgY2FsbGJhY2soZXJyLCBkYXRhKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHB1dEJ1Y2tldEVuY3J5cHRpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgY29uZiA9IHBhcmFtcy5TZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24gfHwge307XG4gIHZhciBSdWxlcyA9IGNvbmYuUnVsZSB8fCBjb25mLlJ1bGVzIHx8IFtdO1xuICB2YXIgeG1sID0gdXRpbC5qc29uMnhtbCh7XG4gICAgU2VydmVyU2lkZUVuY3J5cHRpb25Db25maWd1cmF0aW9uOiB7XG4gICAgICBSdWxlOiBSdWxlc1xuICAgIH1cbiAgfSk7XG4gIHZhciBoZWFkZXJzID0gcGFyYW1zLkhlYWRlcnM7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB1dGlsLmJpbmFyeUJhc2U2NCh1dGlsLm1kNSh4bWwpKTtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpQdXRCdWNrZXRFbmNyeXB0aW9uJyxcbiAgICBtZXRob2Q6ICdQVVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgYm9keTogeG1sLFxuICAgIGFjdGlvbjogJ2VuY3J5cHRpb24nLFxuICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIgJiYgZXJyLnN0YXR1c0NvZGUgPT09IDIwNCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZTogZXJyLnN0YXR1c0NvZGVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEJ1Y2tldEVuY3J5cHRpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkdldEJ1Y2tldEVuY3J5cHRpb24nLFxuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBhY3Rpb246ICdlbmNyeXB0aW9uJ1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgaWYgKGVyci5zdGF0dXNDb2RlID09PSA0MDQgJiYgZXJyLmNvZGUgPT09ICdOb1N1Y2hFbmNyeXB0aW9uQ29uZmlndXJhdGlvbicpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgICBFbmNyeXB0aW9uQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgUnVsZXM6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXNDb2RlOiBlcnIuc3RhdHVzQ29kZVxuICAgICAgICB9O1xuICAgICAgICBlcnIuaGVhZGVycyAmJiAocmVzdWx0LmhlYWRlcnMgPSBlcnIuaGVhZGVycyk7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIFJ1bGVzID0gdXRpbC5tYWtlQXJyYXkoZGF0YS5FbmNyeXB0aW9uQ29uZmlndXJhdGlvbiAmJiBkYXRhLkVuY3J5cHRpb25Db25maWd1cmF0aW9uLlJ1bGUgfHwgW10pO1xuICAgIGRhdGEuRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICBSdWxlczogUnVsZXNcbiAgICB9O1xuICAgIGNhbGxiYWNrKGVyciwgZGF0YSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWxldGVCdWNrZXRFbmNyeXB0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpEZWxldGVCdWNrZXRSZXBsaWNhdGlvbicsXG4gICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgIGFjdGlvbjogJ2VuY3J5cHRpb24nXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyICYmIGVyci5zdGF0dXNDb2RlID09PSAyMDQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIHN0YXR1c0NvZGU6IGVyci5zdGF0dXNDb2RlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufSAvLyBPYmplY3Qg55u45YWzXG5cbi8qKlxuICog5Y+W5Zue5a+55bqUT2JqZWN055qE5YWD5pWw5o2u77yMSGVhZOeahOadg+mZkOS4jkdldOeahOadg+mZkOS4gOiHtFxuICogQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgICAgICAgICAgICAgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gICAgICAgICAgICAgIOWcsOWfn+WQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5LZXkgICAgICAgICAgICAgICAgIOaWh+S7tuWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5JZk1vZGlmaWVkU2luY2UgICAgIOW9k09iamVjdOWcqOaMh+WumuaXtumXtOWQjuiiq+S/ruaUue+8jOWImei/lOWbnuWvueW6lE9iamVjdOWFg+S/oeaBr++8jOWQpuWImei/lOWbnjMwNO+8jOmdnuW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgIOWbnuiwg+WHveaVsO+8jOW/hemhu1xuICogQHJldHVybiAge09iamVjdH0gIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgIOS4uuaMh+WumiBvYmplY3Qg55qE5YWD5pWw5o2u77yM5aaC5p6c6K6+572u5LqGIElmTW9kaWZpZWRTaW5jZSDvvIzkuJTmlofku7bmnKrkv67mlLnvvIzliJnov5Tlm57kuIDkuKrlr7nosaHvvIxOb3RNb2RpZmllZCDlsZ7mgKfkuLogdHJ1ZVxuICogICAgIEByZXR1cm4gIHtCb29sZWFufSAgZGF0YS5Ob3RNb2RpZmllZCAgICAgICAgIOaYr+WQpuWcqCBJZk1vZGlmaWVkU2luY2Ug5pe26Ze054K55LmL5ZCO5pyq5L+u5pS56K+lIG9iamVjdO+8jOWImeS4uiB0cnVlXG4gKi9cblxuXG5mdW5jdGlvbiBoZWFkT2JqZWN0KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpIZWFkT2JqZWN0JyxcbiAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIEtleTogcGFyYW1zLktleSxcbiAgICBWZXJzaW9uSWQ6IHBhcmFtcy5WZXJzaW9uSWQsXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnNcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHZhciBzdGF0dXNDb2RlID0gZXJyLnN0YXR1c0NvZGU7XG5cbiAgICAgIGlmIChwYXJhbXMuSGVhZGVyc1snSWYtTW9kaWZpZWQtU2luY2UnXSAmJiBzdGF0dXNDb2RlICYmIHN0YXR1c0NvZGUgPT09IDMwNCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgIE5vdE1vZGlmaWVkOiB0cnVlLFxuICAgICAgICAgIHN0YXR1c0NvZGU6IHN0YXR1c0NvZGVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIGRhdGEuRVRhZyA9IHV0aWwuYXR0cihkYXRhLmhlYWRlcnMsICdldGFnJywgJycpO1xuICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbGlzdE9iamVjdFZlcnNpb25zKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIHJlcVBhcmFtcyA9IHt9O1xuICByZXFQYXJhbXNbJ3ByZWZpeCddID0gcGFyYW1zWydQcmVmaXgnXSB8fCAnJztcbiAgcmVxUGFyYW1zWydkZWxpbWl0ZXInXSA9IHBhcmFtc1snRGVsaW1pdGVyJ107XG4gIHJlcVBhcmFtc1sna2V5LW1hcmtlciddID0gcGFyYW1zWydLZXlNYXJrZXInXTtcbiAgcmVxUGFyYW1zWyd2ZXJzaW9uLWlkLW1hcmtlciddID0gcGFyYW1zWydWZXJzaW9uSWRNYXJrZXInXTtcbiAgcmVxUGFyYW1zWydtYXgta2V5cyddID0gcGFyYW1zWydNYXhLZXlzJ107XG4gIHJlcVBhcmFtc1snZW5jb2RpbmctdHlwZSddID0gcGFyYW1zWydFbmNvZGluZ1R5cGUnXTtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpHZXRCdWNrZXRPYmplY3RWZXJzaW9ucycsXG4gICAgUmVzb3VyY2VLZXk6IHJlcVBhcmFtc1sncHJlZml4J10sXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgIHFzOiByZXFQYXJhbXMsXG4gICAgYWN0aW9uOiAndmVyc2lvbnMnXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB2YXIgTGlzdFZlcnNpb25zUmVzdWx0ID0gZGF0YS5MaXN0VmVyc2lvbnNSZXN1bHQgfHwge307XG4gICAgdmFyIERlbGV0ZU1hcmtlcnMgPSBMaXN0VmVyc2lvbnNSZXN1bHQuRGVsZXRlTWFya2VyIHx8IFtdO1xuICAgIERlbGV0ZU1hcmtlcnMgPSB1dGlsLmlzQXJyYXkoRGVsZXRlTWFya2VycykgPyBEZWxldGVNYXJrZXJzIDogW0RlbGV0ZU1hcmtlcnNdO1xuICAgIHZhciBWZXJzaW9ucyA9IExpc3RWZXJzaW9uc1Jlc3VsdC5WZXJzaW9uIHx8IFtdO1xuICAgIFZlcnNpb25zID0gdXRpbC5pc0FycmF5KFZlcnNpb25zKSA/IFZlcnNpb25zIDogW1ZlcnNpb25zXTtcbiAgICB2YXIgcmVzdWx0ID0gdXRpbC5jbG9uZShMaXN0VmVyc2lvbnNSZXN1bHQpO1xuICAgIGRlbGV0ZSByZXN1bHQuRGVsZXRlTWFya2VyO1xuICAgIGRlbGV0ZSByZXN1bHQuVmVyc2lvbjtcbiAgICB1dGlsLmV4dGVuZChyZXN1bHQsIHtcbiAgICAgIERlbGV0ZU1hcmtlcnM6IERlbGV0ZU1hcmtlcnMsXG4gICAgICBWZXJzaW9uczogVmVyc2lvbnMsXG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICB9KTtcbn1cbi8qKlxuICog5LiL6L29IG9iamVjdFxuICogQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgICAgICAgICAgICAgICAgICAgICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAgICAgICAgICAgICAgICAgIOWcsOWfn+WQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5LZXkgICAgICAgICAgICAgICAgICAgICAgICAg5paH5Lu25ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7V3JpdGVTdHJlYW19ICBwYXJhbXMuT3V0cHV0ICAgICAgICAgICAgICAgICDmlofku7blhpnlhaXmtYHvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuSWZNb2RpZmllZFNpbmNlICAgICAgICAgICAgIOW9k09iamVjdOWcqOaMh+WumuaXtumXtOWQjuiiq+S/ruaUue+8jOWImei/lOWbnuWvueW6lE9iamVjdOWFg+S/oeaBr++8jOWQpuWImei/lOWbnjMwNO+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5JZlVubW9kaWZpZWRTaW5jZSAgICAgICAgICAg5aaC5p6c5paH5Lu25L+u5pS55pe26Ze05pep5LqO5oiW562J5LqO5oyH5a6a5pe26Ze077yM5omN6L+U5Zue5paH5Lu25YaF5a6544CC5ZCm5YiZ6L+U5ZueIDQxMiAocHJlY29uZGl0aW9uIGZhaWxlZCnvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuSWZNYXRjaCAgICAgICAgICAgICAgICAgICAgIOW9kyBFVGFnIOS4juaMh+WumueahOWGheWuueS4gOiHtO+8jOaJjei/lOWbnuaWh+S7tuOAguWQpuWImei/lOWbniA0MTIgKHByZWNvbmRpdGlvbiBmYWlsZWQp77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLklmTm9uZU1hdGNoICAgICAgICAgICAgICAgICDlvZMgRVRhZyDkuI7mjIflrprnmoTlhoXlrrnkuI3kuIDoh7TvvIzmiY3ov5Tlm57mlofku7bjgILlkKbliJnov5Tlm54zMDQgKG5vdCBtb2RpZmllZCnvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVzcG9uc2VDb250ZW50VHlwZSAgICAgICAgIOiuvue9rui/lOWbnuWktOmDqOS4reeahCBDb250ZW50LVR5cGUg5Y+C5pWw77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlc3BvbnNlQ29udGVudExhbmd1YWdlICAgICDorr7nva7ov5Tlm57lpLTpg6jkuK3nmoQgQ29udGVudC1MYW5ndWFnZSDlj4LmlbDvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVzcG9uc2VFeHBpcmVzICAgICAgICAgICAgIOiuvue9rui/lOWbnuWktOmDqOS4reeahCBDb250ZW50LUV4cGlyZXMg5Y+C5pWw77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlc3BvbnNlQ2FjaGVDb250cm9sICAgICAgICDorr7nva7ov5Tlm57lpLTpg6jkuK3nmoQgQ2FjaGUtQ29udHJvbCDlj4LmlbDvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVzcG9uc2VDb250ZW50RGlzcG9zaXRpb24gIOiuvue9rui/lOWbnuWktOmDqOS4reeahCBDb250ZW50LURpc3Bvc2l0aW9uIOWPguaVsO+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZXNwb25zZUNvbnRlbnRFbmNvZGluZyAgICAg6K6+572u6L+U5Zue5aS06YOo5Lit55qEIENvbnRlbnQtRW5jb2Rpbmcg5Y+C5pWw77yM6Z2e5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEBwYXJhbSAge09iamVjdH0gIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHBhcmFtICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Li65a+55bqU55qEIG9iamVjdCDmlbDmja7vvIzljIXmi6wgYm9keSDlkowgaGVhZGVyc1xuICovXG5cblxuZnVuY3Rpb24gZ2V0T2JqZWN0KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIHJlcVBhcmFtcyA9IHBhcmFtcy5RdWVyeSB8fCB7fTtcbiAgdmFyIHJlcVBhcmFtc1N0ciA9IHBhcmFtcy5RdWVyeVN0cmluZyB8fCAnJztcbiAgdmFyIG9uUHJvZ3Jlc3MgPSB1dGlsLnRocm90dGxlT25Qcm9ncmVzcy5jYWxsKHRoaXMsIDAsIHBhcmFtcy5vblByb2dyZXNzKTtcbiAgdmFyIHRyYWNrZXIgPSBwYXJhbXMudHJhY2tlcjtcbiAgdHJhY2tlciAmJiB0cmFja2VyLnNldFBhcmFtcyh7XG4gICAgc2lnblN0YXJ0VGltZTogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgfSk7XG4gIHJlcVBhcmFtc1sncmVzcG9uc2UtY29udGVudC10eXBlJ10gPSBwYXJhbXNbJ1Jlc3BvbnNlQ29udGVudFR5cGUnXTtcbiAgcmVxUGFyYW1zWydyZXNwb25zZS1jb250ZW50LWxhbmd1YWdlJ10gPSBwYXJhbXNbJ1Jlc3BvbnNlQ29udGVudExhbmd1YWdlJ107XG4gIHJlcVBhcmFtc1sncmVzcG9uc2UtZXhwaXJlcyddID0gcGFyYW1zWydSZXNwb25zZUV4cGlyZXMnXTtcbiAgcmVxUGFyYW1zWydyZXNwb25zZS1jYWNoZS1jb250cm9sJ10gPSBwYXJhbXNbJ1Jlc3BvbnNlQ2FjaGVDb250cm9sJ107XG4gIHJlcVBhcmFtc1sncmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbiddID0gcGFyYW1zWydSZXNwb25zZUNvbnRlbnREaXNwb3NpdGlvbiddO1xuICByZXFQYXJhbXNbJ3Jlc3BvbnNlLWNvbnRlbnQtZW5jb2RpbmcnXSA9IHBhcmFtc1snUmVzcG9uc2VDb250ZW50RW5jb2RpbmcnXTsgLy8g5aaC5p6c55So5oi36Ieq5bex5Lyg5YWl5LqGIG91dHB1dFxuXG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6R2V0T2JqZWN0JyxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgS2V5OiBwYXJhbXMuS2V5LFxuICAgIFZlcnNpb25JZDogcGFyYW1zLlZlcnNpb25JZCxcbiAgICBEYXRhVHlwZTogcGFyYW1zLkRhdGFUeXBlLFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgIHFzOiByZXFQYXJhbXMsXG4gICAgcXNTdHI6IHJlcVBhcmFtc1N0cixcbiAgICByYXdCb2R5OiB0cnVlLFxuICAgIG9uRG93bmxvYWRQcm9ncmVzczogb25Qcm9ncmVzcyxcbiAgICB0cmFja2VyOiB0cmFja2VyXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBvblByb2dyZXNzKG51bGwsIHRydWUpO1xuXG4gICAgaWYgKGVycikge1xuICAgICAgdmFyIHN0YXR1c0NvZGUgPSBlcnIuc3RhdHVzQ29kZTtcblxuICAgICAgaWYgKHBhcmFtcy5IZWFkZXJzWydJZi1Nb2RpZmllZC1TaW5jZSddICYmIHN0YXR1c0NvZGUgJiYgc3RhdHVzQ29kZSA9PT0gMzA0KSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgICAgTm90TW9kaWZpZWQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIEJvZHk6IGRhdGEuYm9keSxcbiAgICAgIEVUYWc6IHV0aWwuYXR0cihkYXRhLmhlYWRlcnMsICdldGFnJywgJycpLFxuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiDkuIrkvKAgb2JqZWN0XG4gKiBAcGFyYW0gIHtPYmplY3R9IHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLktleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOaWh+S7tuWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge0ZpbGUgfHwgQmxvYiB8fCBTdHJpbmd9ICBwYXJhbXMuQm9keSAgICAgICAgICAgICAgICDkuIrkvKDmlofku7blr7nosaHmiJblrZfnrKbkuLLvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQ2FjaGVDb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgUkZDIDI2MTYg5Lit5a6a5LmJ55qE57yT5a2Y562W55Wl77yM5bCG5L2c5Li6IE9iamVjdCDlhYPmlbDmja7kv53lrZjvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQ29udGVudERpc3Bvc2l0aW9uICAgICAgICAgICAgICAgICAgUkZDIDI2MTYg5Lit5a6a5LmJ55qE5paH5Lu25ZCN56ew77yM5bCG5L2c5Li6IE9iamVjdCDlhYPmlbDmja7kv53lrZjvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQ29udGVudEVuY29kaW5nICAgICAgICAgICAgICAgICAgICAgUkZDIDI2MTYg5Lit5a6a5LmJ55qE57yW56CB5qC85byP77yM5bCG5L2c5Li6IE9iamVjdCDlhYPmlbDmja7kv53lrZjvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQ29udGVudExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgUkZDIDI2MTYg5Lit5a6a5LmJ55qEIEhUVFAg6K+35rGC5YaF5a656ZW/5bqm77yI5a2X6IqC77yJ77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkNvbnRlbnRUeXBlICAgICAgICAgICAgICAgICAgICAgICAgIFJGQyAyNjE2IOS4reWumuS5ieeahOWGheWuueexu+Wei++8iE1JTUXvvInvvIzlsIbkvZzkuLogT2JqZWN0IOWFg+aVsOaNruS/neWtmO+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5FeHBlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlvZPkvb/nlKggRXhwZWN0OiAxMDAtY29udGludWUg5pe277yM5Zyo5pS25Yiw5pyN5Yqh56uv56Gu6K6k5ZCO77yM5omN5Lya5Y+R6YCB6K+35rGC5YaF5a6577yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkV4cGlyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJGQyAyNjE2IOS4reWumuS5ieeahOi/h+acn+aXtumXtO+8jOWwhuS9nOS4uiBPYmplY3Qg5YWD5pWw5o2u5L+d5a2Y77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkFDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWFgeiuuOeUqOaIt+iHquWumuS5ieaWh+S7tuadg+mZkO+8jOacieaViOWAvO+8mnByaXZhdGUgfCBwdWJsaWMtcmVhZO+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5HcmFudFJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICDotYvkuojooqvmjojmnYPogIXor7vlj5blr7nosaHnmoTmnYPpmZDvvIzmoLzlvI/vvJppZD1cIltPd25lclVpbl1cIu+8jOWPr+S9v+eUqOWNiuinkumAl+WPt++8iCzvvInliIbpmpTlpJrnu4TooqvmjojmnYPogIXvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuR3JhbnRSZWFkQWNwICAgICAgICAgICAgICAgICAgICAgICAg6LWL5LqI6KKr5o6I5p2D6ICF6K+75Y+W5a+56LGh55qE6K6/6Zeu5o6n5Yi25YiX6KGo77yIQUNM77yJ55qE5p2D6ZmQ77yM5qC85byP77yaaWQ9XCJbT3duZXJVaW5dXCLvvIzlj6/kvb/nlKjljYrop5LpgJflj7fvvIgs77yJ5YiG6ZqU5aSa57uE6KKr5o6I5p2D6ICF77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkdyYW50V3JpdGVBY3AgICAgICAgICAgICAgICAgICAgICAgIOi1i+S6iOiiq+aOiOadg+iAheWGmeWFpeWvueixoeeahOiuv+mXruaOp+WItuWIl+ihqO+8iEFDTO+8ieeahOadg+mZkO+8jOagvOW8j++8mmlkPVwiW093bmVyVWluXVwi77yM5Y+v5L2/55So5Y2K6KeS6YCX5Y+377yILO+8ieWIhumalOWkmue7hOiiq+aOiOadg+iAhe+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5HcmFudEZ1bGxDb250cm9sICAgICAgICAgICAgICAgICAgICDotYvkuojooqvmjojmnYPogIXmk43kvZzlr7nosaHnmoTmiYDmnInmnYPpmZDvvIzmoLzlvI/vvJppZD1cIltPd25lclVpbl1cIu+8jOWPr+S9v+eUqOWNiuinkumAl+WPt++8iCzvvInliIbpmpTlpJrnu4TooqvmjojmnYPogIXvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuU3RvcmFnZUNsYXNzICAgICAgICAgICAgICAgICAgICAgICAg6K6+572u5a+56LGh55qE5a2Y5YKo57qn5Yir77yM5p6a5Li+5YC877yaU1RBTkRBUkTjgIFTVEFOREFSRF9JQeOAgUFSQ0hJVkXvvIzpu5jorqTlgLzvvJpTVEFOREFSRO+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy54LWNvcy1tZXRhLSogICAgICAgICAgICAgICAgICAgICAgICDlhYHorrjnlKjmiLfoh6rlrprkuYnnmoTlpLTpg6jkv6Hmga/vvIzlsIbkvZzkuLrlr7nosaHnmoTlhYPmlbDmja7kv53lrZjjgILlpKflsI/pmZDliLYyS0LvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQ29udGVudFNoYTEgICAgICAgICAgICAgICAgICAgICAgICAgUkZDIDMxNzQg5Lit5a6a5LmJ55qEIDE2MC1iaXQg5YaF5a65IFNIQS0xIOeul+azleagoemqjO+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5TZXJ2ZXJTaWRlRW5jcnlwdGlvbiAgICAgICAgICAgICAgICDmlK/mjIHmjInnhafmjIflrprnmoTliqDlr4bnrpfms5Xov5vooYzmnI3liqHnq6/mlbDmja7liqDlr4bvvIzmoLzlvI8geC1jb3Mtc2VydmVyLXNpZGUtZW5jcnlwdGlvbjogXCJBRVMyNTZcIu+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge0Z1bmN0aW9ufSAgcGFyYW1zLm9uUHJvZ3Jlc3MgICAgICAgICAgICAgICAgICAgICAgICDkuIrkvKDov5vluqblm57osIPlh73mlbBcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDkuLrlr7nlupTnmoQgb2JqZWN0IOaVsOaNrlxuICogICAgIEByZXR1cm4gIHtTdHJpbmd9ICBkYXRhLkVUYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDkuLrlr7nlupTkuIrkvKDmlofku7bnmoQgRVRhZyDlgLxcbiAqL1xuXG5cbmZ1bmN0aW9uIHB1dE9iamVjdChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIEZpbGVTaXplID0gcGFyYW1zLkNvbnRlbnRMZW5ndGg7XG4gIHZhciBvblByb2dyZXNzID0gdXRpbC50aHJvdHRsZU9uUHJvZ3Jlc3MuY2FsbChzZWxmLCBGaWxlU2l6ZSwgcGFyYW1zLm9uUHJvZ3Jlc3MpOyAvLyDnibnmrorlpITnkIYgQ2FjaGUtQ29udHJvbOOAgUNvbnRlbnQtVHlwZe+8jOmBv+WFjeS7o+eQhuabtOaUuei/meS4pOS4quWtl+auteWvvOiHtOWGmeWFpeWIsCBPYmplY3Qg5bGe5oCn6YeMXG5cbiAgdmFyIGhlYWRlcnMgPSBwYXJhbXMuSGVhZGVycztcbiAgaWYgKCFoZWFkZXJzWydDYWNoZS1Db250cm9sJ10gJiYgIWhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSkgaGVhZGVyc1snQ2FjaGUtQ29udHJvbCddID0gJyc7XG4gIGlmICghaGVhZGVyc1snQ29udGVudC1UeXBlJ10gJiYgIWhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IHBhcmFtcy5Cb2R5ICYmIHBhcmFtcy5Cb2R5LnR5cGUgfHwgJyc7XG4gIHZhciBuZWVkQ2FsY01kNSA9IHBhcmFtcy5VcGxvYWRBZGRNZXRhTWQ1IHx8IHNlbGYub3B0aW9ucy5VcGxvYWRBZGRNZXRhTWQ1IHx8IHNlbGYub3B0aW9ucy5VcGxvYWRDaGVja0NvbnRlbnRNZDU7XG4gIHZhciB0cmFja2VyID0gcGFyYW1zLnRyYWNrZXI7XG4gIG5lZWRDYWxjTWQ1ICYmIHRyYWNrZXIgJiYgdHJhY2tlci5zZXRQYXJhbXMoe1xuICAgIG1kNVN0YXJ0VGltZTogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgfSk7XG4gIHV0aWwuZ2V0Qm9keU1kNShuZWVkQ2FsY01kNSwgcGFyYW1zLkJvZHksIGZ1bmN0aW9uIChtZDUpIHtcbiAgICBpZiAobWQ1KSB7XG4gICAgICB0cmFja2VyICYmIHRyYWNrZXIuc2V0UGFyYW1zKHtcbiAgICAgICAgbWQ1RW5kVGltZTogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgIH0pO1xuICAgICAgaWYgKHNlbGYub3B0aW9ucy5VcGxvYWRDaGVja0NvbnRlbnRNZDUpIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB1dGlsLmJpbmFyeUJhc2U2NChtZDUpO1xuICAgICAgaWYgKHBhcmFtcy5VcGxvYWRBZGRNZXRhTWQ1IHx8IHNlbGYub3B0aW9ucy5VcGxvYWRBZGRNZXRhTWQ1KSBoZWFkZXJzWyd4LWNvcy1tZXRhLW1kNSddID0gbWQ1O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuQ29udGVudExlbmd0aCAhPT0gdW5kZWZpbmVkKSBoZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gcGFyYW1zLkNvbnRlbnRMZW5ndGg7XG4gICAgb25Qcm9ncmVzcyhudWxsLCB0cnVlKTsgLy8g5Lu75Yqh54q25oCB5byA5aeLIHVwbG9hZGluZ1xuXG4gICAgc3VibWl0UmVxdWVzdC5jYWxsKHNlbGYsIHtcbiAgICAgIEFjdGlvbjogJ25hbWUvY29zOlB1dE9iamVjdCcsXG4gICAgICBUYXNrSWQ6IHBhcmFtcy5UYXNrSWQsXG4gICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgICAgS2V5OiBwYXJhbXMuS2V5LFxuICAgICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgICBxczogcGFyYW1zLlF1ZXJ5LFxuICAgICAgYm9keTogcGFyYW1zLkJvZHksXG4gICAgICBvblByb2dyZXNzOiBvblByb2dyZXNzLFxuICAgICAgdHJhY2tlcjogdHJhY2tlclxuICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgb25Qcm9ncmVzcyhudWxsLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG5cbiAgICAgIG9uUHJvZ3Jlc3Moe1xuICAgICAgICBsb2FkZWQ6IEZpbGVTaXplLFxuICAgICAgICB0b3RhbDogRmlsZVNpemVcbiAgICAgIH0sIHRydWUpO1xuICAgICAgdmFyIHVybCA9IGdldFVybCh7XG4gICAgICAgIEZvcmNlUGF0aFN0eWxlOiBzZWxmLm9wdGlvbnMuRm9yY2VQYXRoU3R5bGUsXG4gICAgICAgIHByb3RvY29sOiBzZWxmLm9wdGlvbnMuUHJvdG9jb2wsXG4gICAgICAgIGRvbWFpbjogc2VsZi5vcHRpb25zLkRvbWFpbixcbiAgICAgICAgYnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgICAgICByZWdpb246ICFzZWxmLm9wdGlvbnMuVXNlQWNjZWxlcmF0ZSA/IHBhcmFtcy5SZWdpb24gOiAnYWNjZWxlcmF0ZScsXG4gICAgICAgIG9iamVjdDogcGFyYW1zLktleVxuICAgICAgfSk7XG4gICAgICB1cmwgPSB1cmwuc3Vic3RyKHVybC5pbmRleE9mKCc6Ly8nKSArIDMpO1xuICAgICAgZGF0YS5Mb2NhdGlvbiA9IHVybDtcbiAgICAgIGRhdGEuRVRhZyA9IHV0aWwuYXR0cihkYXRhLmhlYWRlcnMsICdldGFnJywgJycpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgfSk7XG4gIH0sIHBhcmFtcy5vbkhhc2hQcm9ncmVzcyk7XG59XG4vKipcbiAqIOWIoOmZpCBvYmplY3RcbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgICAgICAgICAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAgICAgICAgICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuS2V5ICAgICAgICAgICAgIG9iamVjdOWQjeensO+8jOW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcGFyYW0gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEBwYXJhbSAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgICAgICAgICAgIOWIoOmZpOaTjeS9nOaIkOWKn+S5i+WQjui/lOWbnueahOaVsOaNrlxuICovXG5cblxuZnVuY3Rpb24gZGVsZXRlT2JqZWN0KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpEZWxldGVPYmplY3QnLFxuICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBLZXk6IHBhcmFtcy5LZXksXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgVmVyc2lvbklkOiBwYXJhbXMuVmVyc2lvbklkLFxuICAgIGFjdGlvbjogcGFyYW1zLlJlY3Vyc2l2ZSA/ICdyZWN1cnNpdmUnIDogJydcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHZhciBzdGF0dXNDb2RlID0gZXJyLnN0YXR1c0NvZGU7XG5cbiAgICAgIGlmIChzdGF0dXNDb2RlICYmIHN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgIEJ1Y2tldE5vdEZvdW5kOiB0cnVlLFxuICAgICAgICAgIHN0YXR1c0NvZGU6IHN0YXR1c0NvZGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIOiOt+WPliBvYmplY3Qg55qEIOadg+mZkOWIl+ihqFxuICogQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgICAgICAgICAgICAgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gICAgICAgICAgICAgIOWcsOWfn+WQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5LZXkgICAgICAgICAgICAgICAgIG9iamVjdOWQjeensO+8jOW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgIOWbnuiwg+WHveaVsO+8jOW/hemhu1xuICogQHJldHVybiAge09iamVjdH0gIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgIOi/lOWbnueahOaVsOaNrlxuICogICAgIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhLkFjY2Vzc0NvbnRyb2xQb2xpY3kgIOadg+mZkOWIl+ihqFxuICovXG5cblxuZnVuY3Rpb24gZ2V0T2JqZWN0QWNsKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpHZXRPYmplY3RBQ0wnLFxuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBLZXk6IHBhcmFtcy5LZXksXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgYWN0aW9uOiAnYWNsJ1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgdmFyIEFjY2Vzc0NvbnRyb2xQb2xpY3kgPSBkYXRhLkFjY2Vzc0NvbnRyb2xQb2xpY3kgfHwge307XG4gICAgdmFyIE93bmVyID0gQWNjZXNzQ29udHJvbFBvbGljeS5Pd25lciB8fCB7fTtcbiAgICB2YXIgR3JhbnQgPSBBY2Nlc3NDb250cm9sUG9saWN5LkFjY2Vzc0NvbnRyb2xMaXN0ICYmIEFjY2Vzc0NvbnRyb2xQb2xpY3kuQWNjZXNzQ29udHJvbExpc3QuR3JhbnQgfHwgW107XG4gICAgR3JhbnQgPSB1dGlsLmlzQXJyYXkoR3JhbnQpID8gR3JhbnQgOiBbR3JhbnRdO1xuICAgIHZhciByZXN1bHQgPSBkZWNvZGVBY2woQWNjZXNzQ29udHJvbFBvbGljeSk7XG4gICAgZGVsZXRlIHJlc3VsdC5HcmFudFdyaXRlO1xuXG4gICAgaWYgKGRhdGEuaGVhZGVycyAmJiBkYXRhLmhlYWRlcnNbJ3gtY29zLWFjbCddKSB7XG4gICAgICByZXN1bHQuQUNMID0gZGF0YS5oZWFkZXJzWyd4LWNvcy1hY2wnXTtcbiAgICB9XG5cbiAgICByZXN1bHQgPSB1dGlsLmV4dGVuZChyZXN1bHQsIHtcbiAgICAgIE93bmVyOiBPd25lcixcbiAgICAgIEdyYW50czogR3JhbnQsXG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICB9KTtcbn1cbi8qKlxuICog6K6+572uIG9iamVjdCDnmoQg5p2D6ZmQ5YiX6KGoXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLktleSAgICAgb2JqZWN05ZCN56ew77yM5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAg6L+U5Zue55qE5pWw5o2uXG4gKi9cblxuXG5mdW5jdGlvbiBwdXRPYmplY3RBY2wocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgaGVhZGVycyA9IHBhcmFtcy5IZWFkZXJzO1xuICB2YXIgeG1sID0gJyc7XG5cbiAgaWYgKHBhcmFtc1snQWNjZXNzQ29udHJvbFBvbGljeSddKSB7XG4gICAgdmFyIEFjY2Vzc0NvbnRyb2xQb2xpY3kgPSB1dGlsLmNsb25lKHBhcmFtc1snQWNjZXNzQ29udHJvbFBvbGljeSddIHx8IHt9KTtcbiAgICB2YXIgR3JhbnRzID0gQWNjZXNzQ29udHJvbFBvbGljeS5HcmFudHMgfHwgQWNjZXNzQ29udHJvbFBvbGljeS5HcmFudDtcbiAgICBHcmFudHMgPSB1dGlsLmlzQXJyYXkoR3JhbnRzKSA/IEdyYW50cyA6IFtHcmFudHNdO1xuICAgIGRlbGV0ZSBBY2Nlc3NDb250cm9sUG9saWN5LkdyYW50O1xuICAgIGRlbGV0ZSBBY2Nlc3NDb250cm9sUG9saWN5LkdyYW50cztcbiAgICBBY2Nlc3NDb250cm9sUG9saWN5LkFjY2Vzc0NvbnRyb2xMaXN0ID0ge1xuICAgICAgR3JhbnQ6IEdyYW50c1xuICAgIH07XG4gICAgeG1sID0gdXRpbC5qc29uMnhtbCh7XG4gICAgICBBY2Nlc3NDb250cm9sUG9saWN5OiBBY2Nlc3NDb250cm9sUG9saWN5XG4gICAgfSk7XG4gICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veG1sJztcbiAgICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdXRpbC5iaW5hcnlCYXNlNjQodXRpbC5tZDUoeG1sKSk7XG4gIH0gLy8gR3JhbnQgSGVhZGVyIOWOu+mHjVxuXG5cbiAgdXRpbC5lYWNoKGhlYWRlcnMsIGZ1bmN0aW9uICh2YWwsIGtleSkge1xuICAgIGlmIChrZXkuaW5kZXhPZigneC1jb3MtZ3JhbnQtJykgPT09IDApIHtcbiAgICAgIGhlYWRlcnNba2V5XSA9IHVuaXFHcmFudChoZWFkZXJzW2tleV0pO1xuICAgIH1cbiAgfSk7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6UHV0T2JqZWN0QUNMJyxcbiAgICBtZXRob2Q6ICdQVVQnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgS2V5OiBwYXJhbXMuS2V5LFxuICAgIGFjdGlvbjogJ2FjbCcsXG4gICAgaGVhZGVyczogaGVhZGVycyxcbiAgICBib2R5OiB4bWxcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cbi8qKlxuICogT3B0aW9ucyBPYmplY3Tor7fmsYLlrp7njrDot6jln5/orr/pl67nmoTpooTor7fmsYLjgILljbPlj5Hlh7rkuIDkuKogT1BUSU9OUyDor7fmsYLnu5nmnI3liqHlmajku6Xnoa7orqTmmK/lkKblj6/ku6Xov5vooYzot6jln5/mk43kvZzjgIJcbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuS2V5ICAgICBvYmplY3TlkI3np7DvvIzlv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICDov5Tlm57nmoTmlbDmja5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9wdGlvbnNPYmplY3QocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgaGVhZGVycyA9IHBhcmFtcy5IZWFkZXJzO1xuICBoZWFkZXJzWydPcmlnaW4nXSA9IHBhcmFtc1snT3JpZ2luJ107XG4gIGhlYWRlcnNbJ0FjY2Vzcy1Db250cm9sLVJlcXVlc3QtTWV0aG9kJ10gPSBwYXJhbXNbJ0FjY2Vzc0NvbnRyb2xSZXF1ZXN0TWV0aG9kJ107XG4gIGhlYWRlcnNbJ0FjY2Vzcy1Db250cm9sLVJlcXVlc3QtSGVhZGVycyddID0gcGFyYW1zWydBY2Nlc3NDb250cm9sUmVxdWVzdEhlYWRlcnMnXTtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpPcHRpb25zT2JqZWN0JyxcbiAgICBtZXRob2Q6ICdPUFRJT05TJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIEtleTogcGFyYW1zLktleSxcbiAgICBoZWFkZXJzOiBoZWFkZXJzXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBpZiAoZXJyLnN0YXR1c0NvZGUgJiYgZXJyLnN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgIE9wdGlvbnNGb3JiaWRkZW46IHRydWUsXG4gICAgICAgICAgc3RhdHVzQ29kZTogZXJyLnN0YXR1c0NvZGVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIHZhciBoZWFkZXJzID0gZGF0YS5oZWFkZXJzIHx8IHt9O1xuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIEFjY2Vzc0NvbnRyb2xBbGxvd09yaWdpbjogaGVhZGVyc1snYWNjZXNzLWNvbnRyb2wtYWxsb3ctb3JpZ2luJ10sXG4gICAgICBBY2Nlc3NDb250cm9sQWxsb3dNZXRob2RzOiBoZWFkZXJzWydhY2Nlc3MtY29udHJvbC1hbGxvdy1tZXRob2RzJ10sXG4gICAgICBBY2Nlc3NDb250cm9sQWxsb3dIZWFkZXJzOiBoZWFkZXJzWydhY2Nlc3MtY29udHJvbC1hbGxvdy1oZWFkZXJzJ10sXG4gICAgICBBY2Nlc3NDb250cm9sRXhwb3NlSGVhZGVyczogaGVhZGVyc1snYWNjZXNzLWNvbnRyb2wtZXhwb3NlLWhlYWRlcnMnXSxcbiAgICAgIEFjY2Vzc0NvbnRyb2xNYXhBZ2U6IGhlYWRlcnNbJ2FjY2Vzcy1jb250cm9sLW1heC1hZ2UnXSxcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cbi8qKlxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlj4LmlbDliJfooahcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBCdWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V0IOWQjeensFxuICogICAgIEBwYXJhbSAge1N0cmluZ30gIFJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICAgICDlnLDln5/lkI3np7BcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBLZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAg5paH5Lu25ZCN56ewXG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgQ29weVNvdXJjZSAgICAgICAgICAgICAgICAgICAgIOa6kOaWh+S7tlVSTOe7neWvuei3r+W+hO+8jOWPr+S7pemAmui/h3ZlcnNpb25pZOWtkOi1hOa6kOaMh+WumuWOhuWPsueJiOacrFxuICogICAgIEBwYXJhbSAge1N0cmluZ30gIEFDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICDlhYHorrjnlKjmiLfoh6rlrprkuYnmlofku7bmnYPpmZDjgILmnInmlYjlgLzvvJpwcml2YXRl77yMcHVibGljLXJlYWTpu5jorqTlgLzvvJpwcml2YXRl44CCXG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgR3JhbnRSZWFkICAgICAgICAgICAgICAgICAgICAgIOi1i+S6iOiiq+aOiOadg+iAheivu+eahOadg+mZkO+8jOagvOW8jyB4LWNvcy1ncmFudC1yZWFkOiB1aW49XCIgXCIsdWluPVwiIFwi77yM5b2T6ZyA6KaB57uZ5a2Q6LSm5oi35o6I5p2D5pe277yMdWluPVwiUm9vdEFjb3VudElEL1N1YkFjY291bnRJRFwi77yM5b2T6ZyA6KaB57uZ5qC56LSm5oi35o6I5p2D5pe277yMdWluPVwiUm9vdEFjb3VudElEXCLjgIJcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBHcmFudFdyaXRlICAgICAgICAgICAgICAgICAgICAg6LWL5LqI6KKr5o6I5p2D6ICF5YaZ55qE5p2D6ZmQ77yM5qC85byPIHgtY29zLWdyYW50LXdyaXRlOiB1aW49XCIgXCIsdWluPVwiIFwi77yM5b2T6ZyA6KaB57uZ5a2Q6LSm5oi35o6I5p2D5pe277yMdWluPVwiUm9vdEFjb3VudElEL1N1YkFjY291bnRJRFwi77yM5b2T6ZyA6KaB57uZ5qC56LSm5oi35o6I5p2D5pe277yMdWluPVwiUm9vdEFjb3VudElEXCLjgIJcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBHcmFudEZ1bGxDb250cm9sICAgICAgICAgICAgICAg6LWL5LqI6KKr5o6I5p2D6ICF6K+75YaZ5p2D6ZmQ77yM5qC85byPIHgtY29zLWdyYW50LWZ1bGwtY29udHJvbDogdWluPVwiIFwiLHVpbj1cIiBcIu+8jOW9k+mcgOimgee7meWtkOi0puaIt+aOiOadg+aXtu+8jHVpbj1cIlJvb3RBY291bnRJRC9TdWJBY2NvdW50SURcIu+8jOW9k+mcgOimgee7meaguei0puaIt+aOiOadg+aXtu+8jHVpbj1cIlJvb3RBY291bnRJRFwi44CCXG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgTWV0YWRhdGFEaXJlY3RpdmUgICAgICAgICAgICAgIOaYr+WQpuaLt+i0neWFg+aVsOaNru+8jOaemuS4vuWAvO+8mkNvcHksIFJlcGxhY2Vk77yM6buY6K6k5YC8Q29weeOAguWBh+Wmguagh+iusOS4ukNvcHnvvIzlv73nlaVIZWFkZXLkuK3nmoTnlKjmiLflhYPmlbDmja7kv6Hmga/nm7TmjqXlpI3liLbvvJvlgYflpoLmoIforrDkuLpSZXBsYWNlZO+8jOaMiUhlYWRlcuS/oeaBr+S/ruaUueWFg+aVsOaNruOAguW9k+ebruagh+i3r+W+hOWSjOWOn+i3r+W+hOS4gOiHtO+8jOWNs+eUqOaIt+ivleWbvuS/ruaUueWFg+aVsOaNruaXtu+8jOW/hemhu+S4ulJlcGxhY2VkXG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgQ29weVNvdXJjZUlmTW9kaWZpZWRTaW5jZSAgICAgIOW9k09iamVjdOWcqOaMh+WumuaXtumXtOWQjuiiq+S/ruaUue+8jOWImeaJp+ihjOaTjeS9nO+8jOWQpuWImei/lOWbnjQxMuOAguWPr+S4jngtY29zLWNvcHktc291cmNlLUlmLU5vbmUtTWF0Y2jkuIDotbfkvb/nlKjvvIzkuI7lhbbku5bmnaHku7bogZTlkIjkvb/nlKjov5Tlm57lhrLnqoHjgIJcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBDb3B5U291cmNlSWZVbm1vZGlmaWVkU2luY2UgICAg5b2TT2JqZWN05Zyo5oyH5a6a5pe26Ze05ZCO5pyq6KKr5L+u5pS577yM5YiZ5omn6KGM5pON5L2c77yM5ZCm5YiZ6L+U5ZueNDEy44CC5Y+v5LiOeC1jb3MtY29weS1zb3VyY2UtSWYtTWF0Y2jkuIDotbfkvb/nlKjvvIzkuI7lhbbku5bmnaHku7bogZTlkIjkvb/nlKjov5Tlm57lhrLnqoHjgIJcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBDb3B5U291cmNlSWZNYXRjaCAgICAgICAgICAgICAg5b2TT2JqZWN055qERVRhZ+WSjOe7meWumuS4gOiHtOaXtu+8jOWImeaJp+ihjOaTjeS9nO+8jOWQpuWImei/lOWbnjQxMuOAguWPr+S4jngtY29zLWNvcHktc291cmNlLUlmLVVubW9kaWZpZWQtU2luY2XkuIDotbfkvb/nlKjvvIzkuI7lhbbku5bmnaHku7bogZTlkIjkvb/nlKjov5Tlm57lhrLnqoHjgIJcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBDb3B5U291cmNlSWZOb25lTWF0Y2ggICAgICAgICAg5b2TT2JqZWN055qERVRhZ+WSjOe7meWumuS4jeS4gOiHtOaXtu+8jOWImeaJp+ihjOaTjeS9nO+8jOWQpuWImei/lOWbnjQxMuOAguWPr+S4jngtY29zLWNvcHktc291cmNlLUlmLU1vZGlmaWVkLVNpbmNl5LiA6LW35L2/55So77yM5LiO5YW25LuW5p2h5Lu26IGU5ZCI5L2/55So6L+U5Zue5Yay56qB44CCXG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgU3RvcmFnZUNsYXNzICAgICAgICAgICAgICAgICAgIOWtmOWCqOe6p+WIq++8jOaemuS4vuWAvO+8muWtmOWCqOe6p+WIq++8jOaemuS4vuWAvO+8mlN0YW5kYXJkLCBTdGFuZGFyZF9JQe+8jEFyY2hpdmXvvJvpu5jorqTlgLzvvJpTdGFuZGFyZFxuICogICAgIEBwYXJhbSAge1N0cmluZ30gIENhY2hlQ29udHJvbCAgICAgICAgICAgICAgICAgICDmjIflrprmiYDmnInnvJPlrZjmnLrliLblnKjmlbTkuKror7fmsYIv5ZON5bqU6ZO+5Lit5b+F6aG75pyN5LuO55qE5oyH5Luk44CCXG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgQ29udGVudERpc3Bvc2l0aW9uICAgICAgICAgICAgIE1JTUUg5Y2P6K6u55qE5omp5bGV77yMTUlNRSDljY/orq7mjIfnpLogTUlNRSDnlKjmiLfku6PnkIblpoLkvZXmmL7npLrpmYTliqDnmoTmlofku7ZcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBDb250ZW50RW5jb2RpbmcgICAgICAgICAgICAgICAgSFRUUCDkuK3nlKjmnaXlr7njgIzph4fnlKjkvZXnp43nvJbnoIHmoLzlvI/kvKDovpPmraPmlofjgI3ov5vooYzljY/lrprnmoTkuIDlr7nlpLTpg6jlrZfmrrVcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBDb250ZW50TGVuZ3RoICAgICAgICAgICAgICAgICAg6K6+572u5ZON5bqU5raI5oGv55qE5a6e5L2T5YaF5a6555qE5aSn5bCP77yM5Y2V5L2N5Li65a2X6IqCXG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgQ29udGVudFR5cGUgICAgICAgICAgICAgICAgICAgIFJGQyAyNjE2IOS4reWumuS5ieeahCBIVFRQIOivt+axguWGheWuueexu+Wei++8iE1JTUXvvInvvIzkvovlpoJ0ZXh0L3BsYWluXG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgRXhwZWN0ICAgICAgICAgICAgICAgICAgICAgICAgIOivt+axgueahOeJueWumueahOacjeWKoeWZqOihjOS4ulxuICogICAgIEBwYXJhbSAge1N0cmluZ30gIEV4cGlyZXMgICAgICAgICAgICAgICAgICAgICAgICDlk43lupTov4fmnJ/nmoTml6XmnJ/lkozml7bpl7RcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuU2VydmVyU2lkZUVuY3J5cHRpb24gICDmlK/mjIHmjInnhafmjIflrprnmoTliqDlr4bnrpfms5Xov5vooYzmnI3liqHnq6/mlbDmja7liqDlr4bvvIzmoLzlvI8geC1jb3Mtc2VydmVyLXNpZGUtZW5jcnlwdGlvbjogXCJBRVMyNTZcIu+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIENvbnRlbnRMYW5ndWFnZSAgICAgICAgICAgICAgICDmjIflrprlhoXlrrnor63oqIBcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICB4LWNvcy1tZXRhLSogICAgICAgICAgICAgICAgICAg5YWB6K6455So5oi36Ieq5a6a5LmJ55qE5aS06YOo5L+h5oGv77yM5bCG5L2c5Li6IE9iamVjdCDlhYPmlbDmja7ov5Tlm57jgILlpKflsI/pmZDliLYyS+OAglxuICovXG5cblxuZnVuY3Rpb24gcHV0T2JqZWN0Q29weShwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIC8vIOeJueauiuWkhOeQhiBDYWNoZS1Db250cm9sXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGhlYWRlcnMgPSBwYXJhbXMuSGVhZGVycztcbiAgaWYgKCFoZWFkZXJzWydDYWNoZS1Db250cm9sJ10gJiYgIWhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSkgaGVhZGVyc1snQ2FjaGUtQ29udHJvbCddID0gJyc7XG4gIHZhciBDb3B5U291cmNlID0gcGFyYW1zLkNvcHlTb3VyY2UgfHwgJyc7XG4gIHZhciBtID0gdXRpbC5nZXRTb3VyY2VQYXJhbXMuY2FsbCh0aGlzLCBDb3B5U291cmNlKTtcblxuICBpZiAoIW0pIHtcbiAgICBjYWxsYmFjayh1dGlsLmVycm9yKG5ldyBFcnJvcignQ29weVNvdXJjZSBmb3JtYXQgZXJyb3InKSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBTb3VyY2VCdWNrZXQgPSBtWzFdO1xuICB2YXIgU291cmNlUmVnaW9uID0gbVszXTtcbiAgdmFyIFNvdXJjZUtleSA9IGRlY29kZVVSSUNvbXBvbmVudChtWzRdKTtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBTY29wZTogW3tcbiAgICAgIGFjdGlvbjogJ25hbWUvY29zOkdldE9iamVjdCcsXG4gICAgICBidWNrZXQ6IFNvdXJjZUJ1Y2tldCxcbiAgICAgIHJlZ2lvbjogU291cmNlUmVnaW9uLFxuICAgICAgcHJlZml4OiBTb3VyY2VLZXlcbiAgICB9LCB7XG4gICAgICBhY3Rpb246ICduYW1lL2NvczpQdXRPYmplY3QnLFxuICAgICAgYnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgICAgcmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgICAgcHJlZml4OiBwYXJhbXMuS2V5XG4gICAgfV0sXG4gICAgbWV0aG9kOiAnUFVUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIEtleTogcGFyYW1zLktleSxcbiAgICBWZXJzaW9uSWQ6IHBhcmFtcy5WZXJzaW9uSWQsXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnNcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIHZhciByZXN1bHQgPSB1dGlsLmNsb25lKGRhdGEuQ29weU9iamVjdFJlc3VsdCB8fCB7fSk7XG4gICAgdmFyIHVybCA9IGdldFVybCh7XG4gICAgICBGb3JjZVBhdGhTdHlsZTogc2VsZi5vcHRpb25zLkZvcmNlUGF0aFN0eWxlLFxuICAgICAgcHJvdG9jb2w6IHNlbGYub3B0aW9ucy5Qcm90b2NvbCxcbiAgICAgIGRvbWFpbjogc2VsZi5vcHRpb25zLkRvbWFpbixcbiAgICAgIGJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICAgIHJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICAgIG9iamVjdDogcGFyYW1zLktleSxcbiAgICAgIGlzTG9jYXRpb246IHRydWVcbiAgICB9KTtcbiAgICB1dGlsLmV4dGVuZChyZXN1bHQsIHtcbiAgICAgIExvY2F0aW9uOiB1cmwsXG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdXBsb2FkUGFydENvcHkocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgQ29weVNvdXJjZSA9IHBhcmFtcy5Db3B5U291cmNlIHx8ICcnO1xuICB2YXIgbSA9IHV0aWwuZ2V0U291cmNlUGFyYW1zLmNhbGwodGhpcywgQ29weVNvdXJjZSk7XG5cbiAgaWYgKCFtKSB7XG4gICAgY2FsbGJhY2sodXRpbC5lcnJvcihuZXcgRXJyb3IoJ0NvcHlTb3VyY2UgZm9ybWF0IGVycm9yJykpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgU291cmNlQnVja2V0ID0gbVsxXTtcbiAgdmFyIFNvdXJjZVJlZ2lvbiA9IG1bM107XG4gIHZhciBTb3VyY2VLZXkgPSBkZWNvZGVVUklDb21wb25lbnQobVs0XSk7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgU2NvcGU6IFt7XG4gICAgICBhY3Rpb246ICduYW1lL2NvczpHZXRPYmplY3QnLFxuICAgICAgYnVja2V0OiBTb3VyY2VCdWNrZXQsXG4gICAgICByZWdpb246IFNvdXJjZVJlZ2lvbixcbiAgICAgIHByZWZpeDogU291cmNlS2V5XG4gICAgfSwge1xuICAgICAgYWN0aW9uOiAnbmFtZS9jb3M6UHV0T2JqZWN0JyxcbiAgICAgIGJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICAgIHJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICAgIHByZWZpeDogcGFyYW1zLktleVxuICAgIH1dLFxuICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBLZXk6IHBhcmFtcy5LZXksXG4gICAgVmVyc2lvbklkOiBwYXJhbXMuVmVyc2lvbklkLFxuICAgIHFzOiB7XG4gICAgICBwYXJ0TnVtYmVyOiBwYXJhbXNbJ1BhcnROdW1iZXInXSxcbiAgICAgIHVwbG9hZElkOiBwYXJhbXNbJ1VwbG9hZElkJ11cbiAgICB9LFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB2YXIgcmVzdWx0ID0gdXRpbC5jbG9uZShkYXRhLkNvcHlQYXJ0UmVzdWx0IHx8IHt9KTtcbiAgICB1dGlsLmV4dGVuZChyZXN1bHQsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWxldGVNdWx0aXBsZU9iamVjdChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHZhciBPYmplY3RzID0gcGFyYW1zLk9iamVjdHMgfHwgW107XG4gIHZhciBRdWlldCA9IHBhcmFtcy5RdWlldDtcbiAgT2JqZWN0cyA9IHV0aWwuaXNBcnJheShPYmplY3RzKSA/IE9iamVjdHMgOiBbT2JqZWN0c107XG4gIHZhciB4bWwgPSB1dGlsLmpzb24yeG1sKHtcbiAgICBEZWxldGU6IHtcbiAgICAgIE9iamVjdDogT2JqZWN0cyxcbiAgICAgIFF1aWV0OiBRdWlldCB8fCBmYWxzZVxuICAgIH1cbiAgfSk7XG4gIHZhciBoZWFkZXJzID0gcGFyYW1zLkhlYWRlcnM7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gIGhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10gPSB1dGlsLmJpbmFyeUJhc2U2NCh1dGlsLm1kNSh4bWwpKTtcbiAgdmFyIFNjb3BlID0gdXRpbC5tYXAoT2JqZWN0cywgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnbmFtZS9jb3M6RGVsZXRlT2JqZWN0JyxcbiAgICAgIGJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICAgIHJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICAgIHByZWZpeDogdi5LZXlcbiAgICB9O1xuICB9KTtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBTY29wZTogU2NvcGUsXG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBib2R5OiB4bWwsXG4gICAgYWN0aW9uOiAnZGVsZXRlJyxcbiAgICBoZWFkZXJzOiBoZWFkZXJzXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB2YXIgRGVsZXRlUmVzdWx0ID0gZGF0YS5EZWxldGVSZXN1bHQgfHwge307XG4gICAgdmFyIERlbGV0ZWQgPSBEZWxldGVSZXN1bHQuRGVsZXRlZCB8fCBbXTtcbiAgICB2YXIgRXJyb3JzID0gRGVsZXRlUmVzdWx0LkVycm9yIHx8IFtdO1xuICAgIERlbGV0ZWQgPSB1dGlsLmlzQXJyYXkoRGVsZXRlZCkgPyBEZWxldGVkIDogW0RlbGV0ZWRdO1xuICAgIEVycm9ycyA9IHV0aWwuaXNBcnJheShFcnJvcnMpID8gRXJyb3JzIDogW0Vycm9yc107XG4gICAgdmFyIHJlc3VsdCA9IHV0aWwuY2xvbmUoRGVsZXRlUmVzdWx0KTtcbiAgICB1dGlsLmV4dGVuZChyZXN1bHQsIHtcbiAgICAgIEVycm9yOiBFcnJvcnMsXG4gICAgICBEZWxldGVkOiBEZWxldGVkLFxuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVPYmplY3QocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgaGVhZGVycyA9IHBhcmFtcy5IZWFkZXJzO1xuXG4gIGlmICghcGFyYW1zWydSZXN0b3JlUmVxdWVzdCddKSB7XG4gICAgY2FsbGJhY2sodXRpbC5lcnJvcihuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW0gUmVzdG9yZVJlcXVlc3QnKSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBSZXN0b3JlUmVxdWVzdCA9IHBhcmFtcy5SZXN0b3JlUmVxdWVzdCB8fCB7fTtcbiAgdmFyIHhtbCA9IHV0aWwuanNvbjJ4bWwoe1xuICAgIFJlc3RvcmVSZXF1ZXN0OiBSZXN0b3JlUmVxdWVzdFxuICB9KTtcbiAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veG1sJztcbiAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHV0aWwuYmluYXJ5QmFzZTY0KHV0aWwubWQ1KHhtbCkpO1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOlJlc3RvcmVPYmplY3QnLFxuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgS2V5OiBwYXJhbXMuS2V5LFxuICAgIFZlcnNpb25JZDogcGFyYW1zLlZlcnNpb25JZCxcbiAgICBib2R5OiB4bWwsXG4gICAgYWN0aW9uOiAncmVzdG9yZScsXG4gICAgaGVhZGVyczogaGVhZGVyc1xuICB9LCBjYWxsYmFjayk7XG59XG4vKipcbiAqIOiuvue9riBPYmplY3Qg55qE5qCH562+XG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgT2JqZWN05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7QXJyYXl9ICAgcGFyYW1zLlRhZ1NldCAg5qCH562+6K6+572u77yM5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi80Mjk5OFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgIOi/lOWbnuaVsOaNrlxuICovXG5cblxuZnVuY3Rpb24gcHV0T2JqZWN0VGFnZ2luZyhwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHZhciBUYWdnaW5nID0gcGFyYW1zWydUYWdnaW5nJ10gfHwge307XG4gIHZhciBUYWdzID0gVGFnZ2luZy5UYWdTZXQgfHwgVGFnZ2luZy5UYWdzIHx8IHBhcmFtc1snVGFncyddIHx8IFtdO1xuICBUYWdzID0gdXRpbC5jbG9uZSh1dGlsLmlzQXJyYXkoVGFncykgPyBUYWdzIDogW1RhZ3NdKTtcbiAgdmFyIHhtbCA9IHV0aWwuanNvbjJ4bWwoe1xuICAgIFRhZ2dpbmc6IHtcbiAgICAgIFRhZ1NldDoge1xuICAgICAgICBUYWc6IFRhZ3NcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB2YXIgaGVhZGVycyA9IHBhcmFtcy5IZWFkZXJzO1xuICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94bWwnO1xuICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdXRpbC5iaW5hcnlCYXNlNjQodXRpbC5tZDUoeG1sKSk7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6UHV0T2JqZWN0VGFnZ2luZycsXG4gICAgbWV0aG9kOiAnUFVUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgS2V5OiBwYXJhbXMuS2V5LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBib2R5OiB4bWwsXG4gICAgYWN0aW9uOiAndGFnZ2luZycsXG4gICAgaGVhZGVyczogaGVhZGVycyxcbiAgICBWZXJzaW9uSWQ6IHBhcmFtcy5WZXJzaW9uSWRcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIgJiYgZXJyLnN0YXR1c0NvZGUgPT09IDIwNCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZTogZXJyLnN0YXR1c0NvZGVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIOiOt+WPliBPYmplY3Qg55qE5qCH562+6K6+572uXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi80Mjk5OFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgIOi/lOWbnuaVsOaNrlxuICovXG5cblxuZnVuY3Rpb24gZ2V0T2JqZWN0VGFnZ2luZyhwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6R2V0T2JqZWN0VGFnZ2luZycsXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBLZXk6IHBhcmFtcy5LZXksXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBhY3Rpb246ICd0YWdnaW5nJyxcbiAgICBWZXJzaW9uSWQ6IHBhcmFtcy5WZXJzaW9uSWRcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGlmIChlcnIuc3RhdHVzQ29kZSA9PT0gNDA0ICYmIGVyci5lcnJvciAmJiAoZXJyLmVycm9yID09PSBcIk5vdCBGb3VuZFwiIHx8IGVyci5lcnJvci5Db2RlID09PSAnTm9TdWNoVGFnU2V0JykpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgICBUYWdzOiBbXSxcbiAgICAgICAgICBzdGF0dXNDb2RlOiBlcnIuc3RhdHVzQ29kZVxuICAgICAgICB9O1xuICAgICAgICBlcnIuaGVhZGVycyAmJiAocmVzdWx0LmhlYWRlcnMgPSBlcnIuaGVhZGVycyk7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIFRhZ3MgPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICBUYWdzID0gZGF0YS5UYWdnaW5nLlRhZ1NldC5UYWcgfHwgW107XG4gICAgfSBjYXRjaCAoZSkge31cblxuICAgIFRhZ3MgPSB1dGlsLmNsb25lKHV0aWwuaXNBcnJheShUYWdzKSA/IFRhZ3MgOiBbVGFnc10pO1xuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIFRhZ3M6IFRhZ3MsXG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIOWIoOmZpCBPYmplY3Qg55qEIOagh+etvuiuvue9rlxuICogQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgIE9iamVjdOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gIOWcsOWfn+WQjeensO+8jOW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgIOWbnuiwg+WHveaVsO+8jOW/hemhu1xuICogQHJldHVybiAge09iamVjdH0gIGVyciAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNDI5OThcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICDov5Tlm57nmoTmlbDmja5cbiAqL1xuXG5cbmZ1bmN0aW9uIGRlbGV0ZU9iamVjdFRhZ2dpbmcocGFyYW1zLCBjYWxsYmFjaykge1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkRlbGV0ZU9iamVjdFRhZ2dpbmcnLFxuICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBLZXk6IHBhcmFtcy5LZXksXG4gICAgaGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgYWN0aW9uOiAndGFnZ2luZycsXG4gICAgVmVyc2lvbklkOiBwYXJhbXMuVmVyc2lvbklkXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyICYmIGVyci5zdGF0dXNDb2RlID09PSAyMDQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIHN0YXR1c0NvZGU6IGVyci5zdGF0dXNDb2RlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiDkvb/nlKggU1FMIOivreWPpeS7juaMh+WumuWvueixoe+8iENTViDmoLzlvI/miJbogIUgSlNPTiDmoLzlvI/vvInkuK3mo4DntKLlhoXlrrlcbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICAgICAgICBPYmplY3TlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAgICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMuU2VsZWN0UmVxdWVzdCDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2LzQyOTk4XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAgICAgICAg6L+U5Zue55qE5pWw5o2uXG4gKi9cblxuXG5mdW5jdGlvbiBzZWxlY3RPYmplY3RDb250ZW50KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIFNlbGVjdFR5cGUgPSBwYXJhbXNbJ1NlbGVjdFR5cGUnXTtcbiAgaWYgKCFTZWxlY3RUeXBlKSByZXR1cm4gY2FsbGJhY2sodXRpbC5lcnJvcihuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW0gU2VsZWN0VHlwZScpKSk7XG4gIHZhciBTZWxlY3RSZXF1ZXN0ID0gcGFyYW1zWydTZWxlY3RSZXF1ZXN0J10gfHwge307XG4gIHZhciB4bWwgPSB1dGlsLmpzb24yeG1sKHtcbiAgICBTZWxlY3RSZXF1ZXN0OiBTZWxlY3RSZXF1ZXN0XG4gIH0pO1xuICB2YXIgaGVhZGVycyA9IHBhcmFtcy5IZWFkZXJzO1xuICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94bWwnO1xuICBoZWFkZXJzWydDb250ZW50LU1ENSddID0gdXRpbC5iaW5hcnlCYXNlNjQodXRpbC5tZDUoeG1sKSk7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6R2V0T2JqZWN0JyxcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIEtleTogcGFyYW1zLktleSxcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBhY3Rpb246ICdzZWxlY3QnLFxuICAgIHFzOiB7XG4gICAgICAnc2VsZWN0LXR5cGUnOiBwYXJhbXNbJ1NlbGVjdFR5cGUnXVxuICAgIH0sXG4gICAgVmVyc2lvbklkOiBwYXJhbXMuVmVyc2lvbklkLFxuICAgIGJvZHk6IHhtbCxcbiAgICBEYXRhVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICByYXdCb2R5OiB0cnVlXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyICYmIGVyci5zdGF0dXNDb2RlID09PSAyMDQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIHN0YXR1c0NvZGU6IGVyci5zdGF0dXNDb2RlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IHV0aWwucGFyc2VTZWxlY3RQYXlsb2FkKGRhdGEuYm9keSk7XG4gICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzLFxuICAgICAgQm9keTogcmVzdWx0LmJvZHksXG4gICAgICBQYXlsb2FkOiByZXN1bHQucGF5bG9hZFxuICAgIH0pO1xuICB9KTtcbn0gLy8g5YiG5Z2X5LiK5LygXG5cbi8qKlxuICog5Yid5aeL5YyW5YiG5Z2X5LiK5LygXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLktleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlVwbG9hZElkICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkNhY2hlQ29udHJvbCAgICAgICAgICAgICAgICAgICAgUkZDIDI2MTYg5Lit5a6a5LmJ55qE57yT5a2Y562W55Wl77yM5bCG5L2c5Li6IE9iamVjdCDlhYPmlbDmja7kv53lrZjvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQ29udGVudERpc3Bvc2l0aW9uICAgICAgICAgICAgICBSRkMgMjYxNiDkuK3lrprkuYnnmoTmlofku7blkI3np7DvvIzlsIbkvZzkuLogT2JqZWN0IOWFg+aVsOaNruS/neWtmCAgICDvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQ29udGVudEVuY29kaW5nICAgICAgICAgICAgICAgICBSRkMgMjYxNiDkuK3lrprkuYnnmoTnvJbnoIHmoLzlvI/vvIzlsIbkvZzkuLogT2JqZWN0IOWFg+aVsOaNruS/neWtmO+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5Db250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgIFJGQyAyNjE2IOS4reWumuS5ieeahOWGheWuueexu+Wei++8iE1JTUXvvInvvIzlsIbkvZzkuLogT2JqZWN0IOWFg+aVsOaNruS/neWtmO+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5FeHBpcmVzICAgICAgICAgICAgICAgICAgICAgICAgIFJGQyAyNjE2IOS4reWumuS5ieeahOi/h+acn+aXtumXtO+8jOWwhuS9nOS4uiBPYmplY3Qg5YWD5pWw5o2u5L+d5a2Y77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkFDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5YWB6K6455So5oi36Ieq5a6a5LmJ5paH5Lu25p2D6ZmQ77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkdyYW50UmVhZCAgICAgICAgICAgICAgICAgICAgICAg6LWL5LqI6KKr5o6I5p2D6ICF6K+755qE5p2D6ZmQIO+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5HcmFudFdyaXRlICAgICAgICAgICAgICAgICAgICAgIOi1i+S6iOiiq+aOiOadg+iAheWGmeeahOadg+mZkCDvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuR3JhbnRGdWxsQ29udHJvbCAgICAgICAgICAgICAgICDotYvkuojooqvmjojmnYPogIXor7vlhpnmnYPpmZAg77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlN0b3JhZ2VDbGFzcyAgICAgICAgICAgICAgICAgICAg6K6+572uT2JqZWN055qE5a2Y5YKo57qn5Yir77yM5p6a5Li+5YC877yaU3RhbmRhcmTvvIxTdGFuZGFyZF9JQe+8jEFyY2hpdmXvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuU2VydmVyU2lkZUVuY3J5cHRpb24gICAgICAgICAgIOaUr+aMgeaMieeFp+aMh+WumueahOWKoOWvhueul+azlei/m+ihjOacjeWKoeerr+aVsOaNruWKoOWvhu+8jOagvOW8jyB4LWNvcy1zZXJ2ZXItc2lkZS1lbmNyeXB0aW9uOiBcIkFFUzI1Nlwi77yM6Z2e5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg6L+U5Zue55qE5pWw5o2uXG4gKi9cblxuXG5mdW5jdGlvbiBtdWx0aXBhcnRJbml0KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzOyAvLyDnibnmrorlpITnkIYgQ2FjaGUtQ29udHJvbFxuXG4gIHZhciBoZWFkZXJzID0gcGFyYW1zLkhlYWRlcnM7XG4gIHZhciB0cmFja2VyID0gcGFyYW1zLnRyYWNrZXI7IC8vIOeJueauiuWkhOeQhiBDYWNoZS1Db250cm9s44CBQ29udGVudC1UeXBlXG5cbiAgaWYgKCFoZWFkZXJzWydDYWNoZS1Db250cm9sJ10gJiYgIWhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSkgaGVhZGVyc1snQ2FjaGUtQ29udHJvbCddID0gJyc7XG4gIGlmICghaGVhZGVyc1snQ29udGVudC1UeXBlJ10gJiYgIWhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IHBhcmFtcy5Cb2R5ICYmIHBhcmFtcy5Cb2R5LnR5cGUgfHwgJyc7XG4gIHZhciBuZWVkQ2FsY01kNSA9IHBhcmFtcy5Cb2R5ICYmIChwYXJhbXMuVXBsb2FkQWRkTWV0YU1kNSB8fCBzZWxmLm9wdGlvbnMuVXBsb2FkQWRkTWV0YU1kNSk7XG4gIG5lZWRDYWxjTWQ1ICYmIHRyYWNrZXIgJiYgdHJhY2tlci5zZXRQYXJhbXMoe1xuICAgIG1kNVN0YXJ0VGltZTogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgfSk7XG4gIHV0aWwuZ2V0Qm9keU1kNShuZWVkQ2FsY01kNSwgcGFyYW1zLkJvZHksIGZ1bmN0aW9uIChtZDUpIHtcbiAgICBpZiAobWQ1KSBwYXJhbXMuSGVhZGVyc1sneC1jb3MtbWV0YS1tZDUnXSA9IG1kNTtcbiAgICBuZWVkQ2FsY01kNSAmJiB0cmFja2VyICYmIHRyYWNrZXIuc2V0UGFyYW1zKHtcbiAgICAgIG1kNUVuZFRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgfSk7XG4gICAgc3VibWl0UmVxdWVzdC5jYWxsKHNlbGYsIHtcbiAgICAgIEFjdGlvbjogJ25hbWUvY29zOkluaXRpYXRlTXVsdGlwYXJ0VXBsb2FkJyxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgICAgS2V5OiBwYXJhbXMuS2V5LFxuICAgICAgYWN0aW9uOiAndXBsb2FkcycsXG4gICAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICAgIHFzOiBwYXJhbXMuUXVlcnksXG4gICAgICB0cmFja2VyOiB0cmFja2VyXG4gICAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICB0cmFja2VyICYmIHRyYWNrZXIucGFyZW50ICYmIHRyYWNrZXIucGFyZW50LnNldFBhcmFtcyh7XG4gICAgICAgICAgZXJyb3JOb2RlOiAnbXVsdGlwYXJ0SW5pdCdcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgfVxuXG4gICAgICBkYXRhID0gdXRpbC5jbG9uZShkYXRhIHx8IHt9KTtcblxuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5Jbml0aWF0ZU11bHRpcGFydFVwbG9hZFJlc3VsdCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgdXRpbC5leHRlbmQoZGF0YS5Jbml0aWF0ZU11bHRpcGFydFVwbG9hZFJlc3VsdCwge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICB9KTtcbiAgfSwgcGFyYW1zLm9uSGFzaFByb2dyZXNzKTtcbn1cbi8qKlxuICog5YiG5Z2X5LiK5LygXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICAgICAgICAgICAgICAgICAgICAgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gICAgICAgICAgICAgICAgICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLktleSAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3TlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtGaWxlIHx8IEJsb2IgfHwgU3RyaW5nfSAgcGFyYW1zLkJvZHkgICAgICAgIOS4iuS8oOaWh+S7tuWvueixoeaIluWtl+espuS4slxuICogICAgIEBwYXJhbSAge1N0cmluZ30gcGFyYW1zLkNvbnRlbnRMZW5ndGggICAgICAgICAgICAgICAgUkZDIDI2MTYg5Lit5a6a5LmJ55qEIEhUVFAg6K+35rGC5YaF5a656ZW/5bqm77yI5a2X6IqC77yJ77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSBwYXJhbXMuRXhwZWN0ICAgICAgICAgICAgICAgICAgICAgICDlvZPkvb/nlKggRXhwZWN0OiAxMDAtY29udGludWUg5pe277yM5Zyo5pS25Yiw5pyN5Yqh56uv56Gu6K6k5ZCO77yM5omN5Lya5Y+R6YCB6K+35rGC5YaF5a6577yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSBwYXJhbXMuU2VydmVyU2lkZUVuY3J5cHRpb24gICAgICAgICDmlK/mjIHmjInnhafmjIflrprnmoTliqDlr4bnrpfms5Xov5vooYzmnI3liqHnq6/mlbDmja7liqDlr4bvvIzmoLzlvI8geC1jb3Mtc2VydmVyLXNpZGUtZW5jcnlwdGlvbjogXCJBRVMyNTZcIu+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gcGFyYW1zLkNvbnRlbnRTaGExICAgICAgICAgICAgICAgICAgUkZDIDMxNzQg5Lit5a6a5LmJ55qEIDE2MC1iaXQg5YaF5a65IFNIQS0xIOeul+azleagoemqjOWAvO+8jOmdnuW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiAgICAgQHJldHVybiAge09iamVjdH0gIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqICAgICBAcmV0dXJuICB7T2JqZWN0fSAgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOi/lOWbnueahOaVsOaNrlxuICogICAgIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhLkVUYWcgICAgICAgICAgICAgICAgICAgICAgICAg6L+U5Zue55qE5paH5Lu25YiG5Z2XIHNoYTEg5YC8XG4gKi9cblxuXG5mdW5jdGlvbiBtdWx0aXBhcnRVcGxvYWQocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHV0aWwuZ2V0RmlsZVNpemUoJ211bHRpcGFydFVwbG9hZCcsIHBhcmFtcywgZnVuY3Rpb24gKCkge1xuICAgIHZhciB0cmFja2VyID0gcGFyYW1zLnRyYWNrZXI7XG4gICAgdmFyIG5lZWRDYWxjTWQ1ID0gc2VsZi5vcHRpb25zLlVwbG9hZENoZWNrQ29udGVudE1kNTtcbiAgICBuZWVkQ2FsY01kNSAmJiB0cmFja2VyICYmIHRyYWNrZXIuc2V0UGFyYW1zKHtcbiAgICAgIG1kNVN0YXJ0VGltZTogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICB9KTtcbiAgICB1dGlsLmdldEJvZHlNZDUobmVlZENhbGNNZDUsIHBhcmFtcy5Cb2R5LCBmdW5jdGlvbiAobWQ1KSB7XG4gICAgICBpZiAobWQ1KSBwYXJhbXMuSGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHV0aWwuYmluYXJ5QmFzZTY0KG1kNSk7XG4gICAgICBuZWVkQ2FsY01kNSAmJiB0cmFja2VyICYmIHRyYWNrZXIuc2V0UGFyYW1zKHtcbiAgICAgICAgbWQ1RW5kVGltZTogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgIH0pO1xuICAgICAgdHJhY2tlciAmJiB0cmFja2VyLnNldFBhcmFtcyh7XG4gICAgICAgIHBhcnROdW1iZXI6IHBhcmFtcy5QYXJ0TnVtYmVyXG4gICAgICB9KTtcbiAgICAgIHN1Ym1pdFJlcXVlc3QuY2FsbChzZWxmLCB7XG4gICAgICAgIEFjdGlvbjogJ25hbWUvY29zOlVwbG9hZFBhcnQnLFxuICAgICAgICBUYXNrSWQ6IHBhcmFtcy5UYXNrSWQsXG4gICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICAgICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgICAgICBLZXk6IHBhcmFtcy5LZXksXG4gICAgICAgIHFzOiB7XG4gICAgICAgICAgcGFydE51bWJlcjogcGFyYW1zWydQYXJ0TnVtYmVyJ10sXG4gICAgICAgICAgdXBsb2FkSWQ6IHBhcmFtc1snVXBsb2FkSWQnXVxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICAgICAgb25Qcm9ncmVzczogcGFyYW1zLm9uUHJvZ3Jlc3MsXG4gICAgICAgIGJvZHk6IHBhcmFtcy5Cb2R5IHx8IG51bGwsXG4gICAgICAgIHRyYWNrZXI6IHRyYWNrZXJcbiAgICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHRyYWNrZXIgJiYgdHJhY2tlci5wYXJlbnQgJiYgdHJhY2tlci5wYXJlbnQuc2V0UGFyYW1zKHtcbiAgICAgICAgICAgIGVycm9yTm9kZTogJ211bHRpcGFydFVwbG9hZCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgICBFVGFnOiB1dGlsLmF0dHIoZGF0YS5oZWFkZXJzLCAnZXRhZycsICcnKSxcbiAgICAgICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiDlrozmiJDliIblnZfkuIrkvKBcbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgICAgICAgICAgICAgICAgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gICAgICAgICAgICAgICAgICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuS2V5ICAgICAgICAgICAgICAgICAgICAgb2JqZWN05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7QXJyYXl9ICAgcGFyYW1zLlBhcnRzICAgICAgICAgICAgICAgICAgIOWIhuWdl+S/oeaBr+WIl+ihqO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5QYXJ0c1tpXS5QYXJ0TnVtYmVyICAgICDlnZfnvJblj7fvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUGFydHNbaV0uRVRhZyAgICAgICAgICAg5YiG5Z2X55qEIHNoYTEg5qCh6aqM5YC8XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgIOWbnuiwg+WHveaVsO+8jOW/hemhu1xuICogQHJldHVybiAge09iamVjdH0gIGVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg6L+U5Zue55qE5pWw5o2uXG4gKiAgICAgQHJldHVybiAge09iamVjdH0gIGRhdGEuQ29tcGxldGVNdWx0aXBhcnRVcGxvYWQgIOWujOaIkOWIhuWdl+S4iuS8oOWQjueahOaWh+S7tuS/oeaBr++8jOWMheaLrExvY2F0aW9uLCBCdWNrZXQsIEtleSDlkowgRVRhZ1xuICovXG5cblxuZnVuY3Rpb24gbXVsdGlwYXJ0Q29tcGxldGUocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBVcGxvYWRJZCA9IHBhcmFtcy5VcGxvYWRJZDtcbiAgdmFyIFBhcnRzID0gcGFyYW1zWydQYXJ0cyddO1xuICB2YXIgdHJhY2tlciA9IHBhcmFtcy50cmFja2VyO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBQYXJ0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChQYXJ0c1tpXVsnRVRhZyddICYmIFBhcnRzW2ldWydFVGFnJ10uaW5kZXhPZignXCInKSA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgUGFydHNbaV1bJ0VUYWcnXSA9ICdcIicgKyBQYXJ0c1tpXVsnRVRhZyddICsgJ1wiJztcbiAgfVxuXG4gIHZhciB4bWwgPSB1dGlsLmpzb24yeG1sKHtcbiAgICBDb21wbGV0ZU11bHRpcGFydFVwbG9hZDoge1xuICAgICAgUGFydDogUGFydHNcbiAgICB9XG4gIH0pOyAvLyBDU1AvY2VwaCBDb21wbGV0ZU11bHRpcGFydFVwbG9hZCDmjqXlj6MgYm9keSDlhpnmrbvkuobpmZDliLYgMU1C77yM6L+Z6YeM6YaJ5YCSIDEwMDAwIOeJh+aXtu+8jHhtbCDlrZfnrKbkuLLljrvmjonnqbrmoLw4NTNLQlxuXG4gIHhtbCA9IHhtbC5yZXBsYWNlKC9cXG5cXHMqL2csICcnKTtcbiAgdmFyIGhlYWRlcnMgPSBwYXJhbXMuSGVhZGVycztcbiAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veG1sJztcbiAgaGVhZGVyc1snQ29udGVudC1NRDUnXSA9IHV0aWwuYmluYXJ5QmFzZTY0KHV0aWwubWQ1KHhtbCkpO1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkJyxcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIEtleTogcGFyYW1zLktleSxcbiAgICBxczoge1xuICAgICAgdXBsb2FkSWQ6IFVwbG9hZElkXG4gICAgfSxcbiAgICBib2R5OiB4bWwsXG4gICAgaGVhZGVyczogaGVhZGVycyxcbiAgICB0cmFja2VyOiB0cmFja2VyXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICB0cmFja2VyICYmIHRyYWNrZXIucGFyZW50ICYmIHRyYWNrZXIucGFyZW50LnNldFBhcmFtcyh7XG4gICAgICAgIGVycm9yTm9kZTogJ211bHRpcGFydENvbXBsZXRlJ1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG5cbiAgICB2YXIgdXJsID0gZ2V0VXJsKHtcbiAgICAgIEZvcmNlUGF0aFN0eWxlOiBzZWxmLm9wdGlvbnMuRm9yY2VQYXRoU3R5bGUsXG4gICAgICBwcm90b2NvbDogc2VsZi5vcHRpb25zLlByb3RvY29sLFxuICAgICAgZG9tYWluOiBzZWxmLm9wdGlvbnMuRG9tYWluLFxuICAgICAgYnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgICAgcmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgICAgb2JqZWN0OiBwYXJhbXMuS2V5LFxuICAgICAgaXNMb2NhdGlvbjogdHJ1ZVxuICAgIH0pO1xuICAgIHZhciByZXMgPSBkYXRhLkNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkUmVzdWx0IHx8IHt9O1xuXG4gICAgaWYgKHJlcy5Qcm9jZXNzUmVzdWx0cykge1xuICAgICAgaWYgKHJlcyAmJiByZXMuUHJvY2Vzc1Jlc3VsdHMpIHtcbiAgICAgICAgcmVzLlVwbG9hZFJlc3VsdCA9IHtcbiAgICAgICAgICBPcmlnaW5hbEluZm86IHtcbiAgICAgICAgICAgIEtleTogcmVzLktleSxcbiAgICAgICAgICAgIExvY2F0aW9uOiB1cmwsXG4gICAgICAgICAgICBFVGFnOiByZXMuRVRhZyxcbiAgICAgICAgICAgIEltYWdlSW5mbzogcmVzLkltYWdlSW5mb1xuICAgICAgICAgIH0sXG4gICAgICAgICAgUHJvY2Vzc1Jlc3VsdHM6IHJlcy5Qcm9jZXNzUmVzdWx0c1xuICAgICAgICB9O1xuICAgICAgICBkZWxldGUgcmVzLkltYWdlSW5mbztcbiAgICAgICAgZGVsZXRlIHJlcy5Qcm9jZXNzUmVzdWx0cztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0gdXRpbC5leHRlbmQocmVzLCB7XG4gICAgICBMb2NhdGlvbjogdXJsLFxuICAgICAgc3RhdHVzQ29kZTogZGF0YS5zdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogZGF0YS5oZWFkZXJzXG4gICAgfSk7XG4gICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgfSk7XG59XG4vKipcbiAqIOWIhuWdl+S4iuS8oOS7u+WKoeWIl+ihqOafpeivolxuICogQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgICAgICAgICAgICAgICAgICAgICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAgICAgICAgICAgICAgICAgIOWcsOWfn+WQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5EZWxpbWl0ZXIgICAgICAgICAgICAgICAgICAg5a6a55WM56ym5Li65LiA5Liq56ym5Y+377yM5aaC5p6c5pyJUHJlZml477yM5YiZ5bCGUHJlZml45YiwZGVsaW1pdGVy5LmL6Ze055qE55u45ZCM6Lev5b6E5b2S5Li65LiA57G777yM5a6a5LmJ5Li6Q29tbW9uIFByZWZpeO+8jOeEtuWQjuWIl+WHuuaJgOaciUNvbW1vbiBQcmVmaXjjgILlpoLmnpzmsqHmnIlQcmVmaXjvvIzliJnku47ot6/lvoTotbfngrnlvIDlp4vvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuRW5jb2RpbmdUeXBlICAgICAgICAgICAgICAgIOinhOWumui/lOWbnuWAvOeahOe8lueggeaWueW8j++8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5QcmVmaXggICAgICAgICAgICAgICAgICAgICAg5YmN57yA5Yy56YWN77yM55So5p2l6KeE5a6a6L+U5Zue55qE5paH5Lu25YmN57yA5Zyw5Z2A77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLk1heFVwbG9hZHMgICAgICAgICAgICAgICAgICDljZXmrKHov5Tlm57mnIDlpKfnmoTmnaHnm67mlbDph4/vvIzpu5jorqQxMDAw77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLktleU1hcmtlciAgICAgICAgICAgICAgICAgICDkuI51cGxvYWQtaWQtbWFya2Vy5LiA6LW35L2/55SoIDwvQnI+5b2TdXBsb2FkLWlkLW1hcmtlcuacquiiq+aMh+WumuaXtu+8jE9iamVjdE5hbWXlrZfmr43pobrluo/lpKfkuo5rZXktbWFya2Vy55qE5p2h55uu5bCG6KKr5YiX5Ye6IDwvQnI+5b2TdXBsb2FkLWlkLW1hcmtlcuiiq+aMh+WumuaXtu+8jE9iamVjdE5hbWXlrZfmr43pobrluo/lpKfkuo5rZXktbWFya2Vy55qE5p2h55uu6KKr5YiX5Ye677yMT2JqZWN0TmFtZeWtl+avjemhuuW6j+etieS6jmtleS1tYXJrZXLlkIzml7ZVcGxvYWRJZOWkp+S6jnVwbG9hZC1pZC1tYXJrZXLnmoTmnaHnm67lsIbooqvliJflh7rvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuVXBsb2FkSWRNYXJrZXIgICAgICAgICAgICAgIOS4jmtleS1tYXJrZXLkuIDotbfkvb/nlKggPC9Ccj7lvZNrZXktbWFya2Vy5pyq6KKr5oyH5a6a5pe277yMdXBsb2FkLWlkLW1hcmtlcuWwhuiiq+W/veeVpSA8L0JyPuW9k2tleS1tYXJrZXLooqvmjIflrprml7bvvIxPYmplY3ROYW1l5a2X5q+N6aG65bqP5aSn5LqOa2V5LW1hcmtlcueahOadoeebruiiq+WIl+WHuu+8jE9iamVjdE5hbWXlrZfmr43pobrluo/nrYnkuo5rZXktbWFya2Vy5ZCM5pe2VXBsb2FkSWTlpKfkuo51cGxvYWQtaWQtbWFya2Vy55qE5p2h55uu5bCG6KKr5YiX5Ye677yM6Z2e5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg6L+U5Zue55qE5pWw5o2uXG4gKiAgICAgQHJldHVybiAge09iamVjdH0gIGRhdGEuTGlzdE11bHRpcGFydFVwbG9hZHNSZXN1bHQgICDliIblnZfkuIrkvKDku7vliqHkv6Hmga9cbiAqL1xuXG5cbmZ1bmN0aW9uIG11bHRpcGFydExpc3QocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgcmVxUGFyYW1zID0ge307XG4gIHJlcVBhcmFtc1snZGVsaW1pdGVyJ10gPSBwYXJhbXNbJ0RlbGltaXRlciddO1xuICByZXFQYXJhbXNbJ2VuY29kaW5nLXR5cGUnXSA9IHBhcmFtc1snRW5jb2RpbmdUeXBlJ107XG4gIHJlcVBhcmFtc1sncHJlZml4J10gPSBwYXJhbXNbJ1ByZWZpeCddIHx8ICcnO1xuICByZXFQYXJhbXNbJ21heC11cGxvYWRzJ10gPSBwYXJhbXNbJ01heFVwbG9hZHMnXTtcbiAgcmVxUGFyYW1zWydrZXktbWFya2VyJ10gPSBwYXJhbXNbJ0tleU1hcmtlciddO1xuICByZXFQYXJhbXNbJ3VwbG9hZC1pZC1tYXJrZXInXSA9IHBhcmFtc1snVXBsb2FkSWRNYXJrZXInXTtcbiAgcmVxUGFyYW1zID0gdXRpbC5jbGVhcktleShyZXFQYXJhbXMpO1xuICB2YXIgdHJhY2tlciA9IHBhcmFtcy50cmFja2VyO1xuICB0cmFja2VyICYmIHRyYWNrZXIuc2V0UGFyYW1zKHtcbiAgICBzaWduU3RhcnRUaW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICB9KTtcbiAgc3VibWl0UmVxdWVzdC5jYWxsKHRoaXMsIHtcbiAgICBBY3Rpb246ICduYW1lL2NvczpMaXN0TXVsdGlwYXJ0VXBsb2FkcycsXG4gICAgUmVzb3VyY2VLZXk6IHJlcVBhcmFtc1sncHJlZml4J10sXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgIHFzOiByZXFQYXJhbXMsXG4gICAgYWN0aW9uOiAndXBsb2FkcycsXG4gICAgdHJhY2tlcjogdHJhY2tlclxuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgdHJhY2tlciAmJiB0cmFja2VyLnBhcmVudCAmJiB0cmFja2VyLnBhcmVudC5zZXRQYXJhbXMoe1xuICAgICAgICBlcnJvck5vZGU6ICdtdWx0aXBhcnRMaXN0J1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLkxpc3RNdWx0aXBhcnRVcGxvYWRzUmVzdWx0KSB7XG4gICAgICB2YXIgVXBsb2FkID0gZGF0YS5MaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdC5VcGxvYWQgfHwgW107XG4gICAgICBVcGxvYWQgPSB1dGlsLmlzQXJyYXkoVXBsb2FkKSA/IFVwbG9hZCA6IFtVcGxvYWRdO1xuICAgICAgZGF0YS5MaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdC5VcGxvYWQgPSBVcGxvYWQ7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IHV0aWwuY2xvbmUoZGF0YS5MaXN0TXVsdGlwYXJ0VXBsb2Fkc1Jlc3VsdCB8fCB7fSk7XG4gICAgdXRpbC5leHRlbmQocmVzdWx0LCB7XG4gICAgICBzdGF0dXNDb2RlOiBkYXRhLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiBkYXRhLmhlYWRlcnNcbiAgICB9KTtcbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICB9KTtcbn1cbi8qKlxuICog5LiK5Lyg55qE5YiG5Z2X5YiX6KGo5p+l6K+iXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICAgICAgICAgICAgICAgICAgICAgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gICAgICAgICAgICAgICAgICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLktleSAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3TlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuVXBsb2FkSWQgICAgICAgICAgICAgICAgICAgIOagh+ekuuacrOasoeWIhuWdl+S4iuS8oOeahElE77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkVuY29kaW5nVHlwZSAgICAgICAgICAgICAgICDop4Tlrprov5Tlm57lgLznmoTnvJbnoIHmlrnlvI/vvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuTWF4UGFydHMgICAgICAgICAgICAgICAgICAgIOWNleasoei/lOWbnuacgOWkp+eahOadoeebruaVsOmHj++8jOm7mOiupDEwMDDvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUGFydE51bWJlck1hcmtlciAgICAgICAgICAgIOm7mOiupOS7pVVURi045LqM6L+b5Yi26aG65bqP5YiX5Ye65p2h55uu77yM5omA5pyJ5YiX5Ye65p2h55uu5LuObWFya2Vy5byA5aeL77yM6Z2e5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqIEByZXR1cm4gIHtPYmplY3R9ICBlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogQHJldHVybiAge09iamVjdH0gIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg6L+U5Zue55qE5pWw5o2uXG4gKiAgICAgQHJldHVybiAge09iamVjdH0gIGRhdGEuTGlzdE11bHRpcGFydFVwbG9hZHNSZXN1bHQgICDliIblnZfkv6Hmga9cbiAqL1xuXG5cbmZ1bmN0aW9uIG11bHRpcGFydExpc3RQYXJ0KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIHJlcVBhcmFtcyA9IHt9O1xuICByZXFQYXJhbXNbJ3VwbG9hZElkJ10gPSBwYXJhbXNbJ1VwbG9hZElkJ107XG4gIHJlcVBhcmFtc1snZW5jb2RpbmctdHlwZSddID0gcGFyYW1zWydFbmNvZGluZ1R5cGUnXTtcbiAgcmVxUGFyYW1zWydtYXgtcGFydHMnXSA9IHBhcmFtc1snTWF4UGFydHMnXTtcbiAgcmVxUGFyYW1zWydwYXJ0LW51bWJlci1tYXJrZXInXSA9IHBhcmFtc1snUGFydE51bWJlck1hcmtlciddO1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkxpc3RQYXJ0cycsXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIEtleTogcGFyYW1zLktleSxcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBxczogcmVxUGFyYW1zXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICB0cmFja2VyICYmIHRyYWNrZXIucGFyZW50ICYmIHRyYWNrZXIucGFyZW50LnNldFBhcmFtcyh7XG4gICAgICAgIGVycm9yTm9kZTogJ211bHRpcGFydExpc3RQYXJ0J1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG5cbiAgICB2YXIgTGlzdFBhcnRzUmVzdWx0ID0gZGF0YS5MaXN0UGFydHNSZXN1bHQgfHwge307XG4gICAgdmFyIFBhcnQgPSBMaXN0UGFydHNSZXN1bHQuUGFydCB8fCBbXTtcbiAgICBQYXJ0ID0gdXRpbC5pc0FycmF5KFBhcnQpID8gUGFydCA6IFtQYXJ0XTtcbiAgICBMaXN0UGFydHNSZXN1bHQuUGFydCA9IFBhcnQ7XG4gICAgdmFyIHJlc3VsdCA9IHV0aWwuY2xvbmUoTGlzdFBhcnRzUmVzdWx0KTtcbiAgICB1dGlsLmV4dGVuZChyZXN1bHQsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gIH0pO1xufVxuLyoqXG4gKiDmipvlvIPliIblnZfkuIrkvKBcbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICAgICAg5Y+C5pWw5a+56LGh77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkJ1Y2tldCAgICAgIEJ1Y2tldOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5SZWdpb24gICAgICDlnLDln5/lkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuS2V5ICAgICAgICAgb2JqZWN05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlVwbG9hZElkICAgIOagh+ekuuacrOasoeWIhuWdl+S4iuS8oOeahElE77yM5b+F6aG7XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgICAgICAgIOWbnuiwg+WHveaVsO+8jOW/hemhu1xuICogICAgIEByZXR1cm4gIHtPYmplY3R9ICAgIGVyciAgICAgICAgICAgICDor7fmsYLlpLHotKXnmoTplJnor6/vvIzlpoLmnpzor7fmsYLmiJDlip/vvIzliJnkuLrnqbrjgIJodHRwczovL2Nsb3VkLnRlbmNlbnQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3MzBcbiAqICAgICBAcmV0dXJuICB7T2JqZWN0fSAgICBkYXRhICAgICAgICAgICAg6L+U5Zue55qE5pWw5o2uXG4gKi9cblxuXG5mdW5jdGlvbiBtdWx0aXBhcnRBYm9ydChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHZhciByZXFQYXJhbXMgPSB7fTtcbiAgcmVxUGFyYW1zWyd1cGxvYWRJZCddID0gcGFyYW1zWydVcGxvYWRJZCddO1xuICBzdWJtaXRSZXF1ZXN0LmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogJ25hbWUvY29zOkFib3J0TXVsdGlwYXJ0VXBsb2FkJyxcbiAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgS2V5OiBwYXJhbXMuS2V5LFxuICAgIGhlYWRlcnM6IHBhcmFtcy5IZWFkZXJzLFxuICAgIHFzOiByZXFQYXJhbXNcbiAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGU6IGRhdGEuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IGRhdGEuaGVhZGVyc1xuICAgIH0pO1xuICB9KTtcbn1cbi8qKlxuICog5oqb5byD5YiG5Z2X5LiK5LygXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgICAgICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLktleSAgICAgICAgIG9iamVjdOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5VcGxvYWRJZCAgICDmoIfnpLrmnKzmrKHliIblnZfkuIrkvKDnmoRJRO+8jOW/hemhu1xuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqICAgICBAcmV0dXJuICB7T2JqZWN0fSAgICBlcnIgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiAgICAgQHJldHVybiAge09iamVjdH0gICAgZGF0YSAgICAgICAgICAgIOi/lOWbnueahOaVsOaNrlxuICovXG5cblxuZnVuY3Rpb24gcmVxdWVzdChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgbWV0aG9kOiBwYXJhbXMuTWV0aG9kLFxuICAgIEJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgS2V5OiBwYXJhbXMuS2V5LFxuICAgIGFjdGlvbjogcGFyYW1zLkFjdGlvbixcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVycyxcbiAgICBxczogcGFyYW1zLlF1ZXJ5LFxuICAgIGJvZHk6IHBhcmFtcy5Cb2R5LFxuICAgIFVybDogcGFyYW1zLlVybCxcbiAgICByYXdCb2R5OiBwYXJhbXMuUmF3Qm9keSxcbiAgICBEYXRhVHlwZTogcGFyYW1zLkRhdGFUeXBlXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgIGlmIChkYXRhICYmIGRhdGEuYm9keSkge1xuICAgICAgZGF0YS5Cb2R5ID0gZGF0YS5ib2R5O1xuICAgICAgZGVsZXRlIGRhdGEuYm9keTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhlcnIsIGRhdGEpO1xuICB9KTtcbn1cbi8qKlxuICog6L+95Yqg5LiK5LygXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWPguaVsOWvueixoe+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5CdWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXTlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuUmVnaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Zyw5Z+f5ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLktleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdOWQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge0ZpbGUgfHwgQmxvYiB8fCBTdHJpbmd9ICBwYXJhbXMuQm9keSAgICAgICAgICAgICAgICDkuIrkvKDmlofku7blr7nosaHmiJblrZfnrKbkuLJcbiAqICAgICBAcGFyYW0gIHtOdW1iZXJ9ICBwYXJhbXMuUG9zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAg6L+95Yqg5pON5L2c55qE6LW35aeL54K577yM5Y2V5L2N5Li65a2X6IqC77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkNhY2hlQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgIFJGQyAyNjE2IOS4reWumuS5ieeahOe8k+WtmOetlueVpe+8jOWwhuS9nOS4uiBPYmplY3Qg5YWD5pWw5o2u5L+d5a2Y77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkNvbnRlbnREaXNwb3NpdGlvbiAgICAgICAgICAgICAgICAgIFJGQyAyNjE2IOS4reWumuS5ieeahOaWh+S7tuWQjeensO+8jOWwhuS9nOS4uiBPYmplY3Qg5YWD5pWw5o2u5L+d5a2Y77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkNvbnRlbnRFbmNvZGluZyAgICAgICAgICAgICAgICAgICAgIFJGQyAyNjE2IOS4reWumuS5ieeahOe8lueggeagvOW8j++8jOWwhuS9nOS4uiBPYmplY3Qg5YWD5pWw5o2u5L+d5a2Y77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkNvbnRlbnRMZW5ndGggICAgICAgICAgICAgICAgICAgICAgIFJGQyAyNjE2IOS4reWumuS5ieeahCBIVFRQIOivt+axguWGheWuuemVv+W6pu+8iOWtl+iKgu+8ie+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5Db250ZW50VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBSRkMgMjYxNiDkuK3lrprkuYnnmoTlhoXlrrnnsbvlnovvvIhNSU1F77yJ77yM5bCG5L2c5Li6IE9iamVjdCDlhYPmlbDmja7kv53lrZjvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuRXhwZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5b2T5L2/55SoIEV4cGVjdDogMTAwLWNvbnRpbnVlIOaXtu+8jOWcqOaUtuWIsOacjeWKoeerr+ehruiupOWQju+8jOaJjeS8muWPkemAgeivt+axguWGheWuue+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5FeHBpcmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRkMgMjYxNiDkuK3lrprkuYnnmoTov4fmnJ/ml7bpl7TvvIzlsIbkvZzkuLogT2JqZWN0IOWFg+aVsOaNruS/neWtmO+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5BQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlhYHorrjnlKjmiLfoh6rlrprkuYnmlofku7bmnYPpmZDvvIzmnInmlYjlgLzvvJpwcml2YXRlIHwgcHVibGljLXJlYWTvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuR3JhbnRSZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAg6LWL5LqI6KKr5o6I5p2D6ICF6K+75Y+W5a+56LGh55qE5p2D6ZmQ77yM5qC85byP77yaaWQ9XCJbT3duZXJVaW5dXCLvvIzlj6/kvb/nlKjljYrop5LpgJflj7fvvIgs77yJ5YiG6ZqU5aSa57uE6KKr5o6I5p2D6ICF77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkdyYW50UmVhZEFjcCAgICAgICAgICAgICAgICAgICAgICAgIOi1i+S6iOiiq+aOiOadg+iAheivu+WPluWvueixoeeahOiuv+mXruaOp+WItuWIl+ihqO+8iEFDTO+8ieeahOadg+mZkO+8jOagvOW8j++8mmlkPVwiW093bmVyVWluXVwi77yM5Y+v5L2/55So5Y2K6KeS6YCX5Y+377yILO+8ieWIhumalOWkmue7hOiiq+aOiOadg+iAhe+8jOmdnuW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5HcmFudFdyaXRlQWNwICAgICAgICAgICAgICAgICAgICAgICDotYvkuojooqvmjojmnYPogIXlhpnlhaXlr7nosaHnmoTorr/pl67mjqfliLbliJfooajvvIhBQ0zvvInnmoTmnYPpmZDvvIzmoLzlvI/vvJppZD1cIltPd25lclVpbl1cIu+8jOWPr+S9v+eUqOWNiuinkumAl+WPt++8iCzvvInliIbpmpTlpJrnu4TooqvmjojmnYPogIXvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuR3JhbnRGdWxsQ29udHJvbCAgICAgICAgICAgICAgICAgICAg6LWL5LqI6KKr5o6I5p2D6ICF5pON5L2c5a+56LGh55qE5omA5pyJ5p2D6ZmQ77yM5qC85byP77yaaWQ9XCJbT3duZXJVaW5dXCLvvIzlj6/kvb/nlKjljYrop5LpgJflj7fvvIgs77yJ5YiG6ZqU5aSa57uE6KKr5o6I5p2D6ICF77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlN0b3JhZ2VDbGFzcyAgICAgICAgICAgICAgICAgICAgICAgIOiuvue9ruWvueixoeeahOWtmOWCqOe6p+WIq++8jOaemuS4vuWAvO+8mlNUQU5EQVJE44CBU1RBTkRBUkRfSUHjgIFBUkNISVZF77yM6buY6K6k5YC877yaU1RBTkRBUkTvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMueC1jb3MtbWV0YS0qICAgICAgICAgICAgICAgICAgICAgICAg5YWB6K6455So5oi36Ieq5a6a5LmJ55qE5aS06YOo5L+h5oGv77yM5bCG5L2c5Li65a+56LGh55qE5YWD5pWw5o2u5L+d5a2Y44CC5aSn5bCP6ZmQ5Yi2MktC77yM6Z2e5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkNvbnRlbnRTaGExICAgICAgICAgICAgICAgICAgICAgICAgIFJGQyAzMTc0IOS4reWumuS5ieeahCAxNjAtYml0IOWGheWuuSBTSEEtMSDnrpfms5XmoKHpqozvvIzpnZ7lv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuU2VydmVyU2lkZUVuY3J5cHRpb24gICAgICAgICAgICAgICAg5pSv5oyB5oyJ54Wn5oyH5a6a55qE5Yqg5a+G566X5rOV6L+b6KGM5pyN5Yqh56uv5pWw5o2u5Yqg5a+G77yM5qC85byPIHgtY29zLXNlcnZlci1zaWRlLWVuY3J5cHRpb246IFwiQUVTMjU2XCLvvIzpnZ7lv4XpobtcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Zue6LCD5Ye95pWw77yM5b+F6aG7XG4gKiAgICAgQHJldHVybiAge09iamVjdH0gICAgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOivt+axguWksei0peeahOmUmeivr++8jOWmguaenOivt+axguaIkOWKn++8jOWImeS4uuepuuOAgmh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNzczMFxuICogICAgIEByZXR1cm4gIHtPYmplY3R9ICAgIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDov5Tlm57nmoTmlbDmja5cbiAqL1xuXG5cbmZ1bmN0aW9uIGFwcGVuZE9iamVjdChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIC8vIOeJueauiuWkhOeQhiBDYWNoZS1Db250cm9s44CBQ29udGVudC1UeXBl77yM6YG/5YWN5Luj55CG5pu05pS56L+Z5Lik5Liq5a2X5q615a+86Ie05YaZ5YWl5YiwIE9iamVjdCDlsZ7mgKfph4xcbiAgdmFyIGhlYWRlcnMgPSBwYXJhbXMuSGVhZGVycztcbiAgaWYgKCFoZWFkZXJzWydDYWNoZS1Db250cm9sJ10gJiYgIWhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSkgaGVhZGVyc1snQ2FjaGUtQ29udHJvbCddID0gJyc7XG4gIGlmICghaGVhZGVyc1snQ29udGVudC1UeXBlJ10gJiYgIWhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IHBhcmFtcy5Cb2R5ICYmIHBhcmFtcy5Cb2R5LnR5cGUgfHwgJyc7XG4gIHN1Ym1pdFJlcXVlc3QuY2FsbCh0aGlzLCB7XG4gICAgQWN0aW9uOiAnbmFtZS9jb3M6QXBwZW5kT2JqZWN0JyxcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIGFjdGlvbjogJ2FwcGVuZCcsXG4gICAgS2V5OiBwYXJhbXMuS2V5LFxuICAgIGJvZHk6IHBhcmFtcy5Cb2R5LFxuICAgIHFzOiB7XG4gICAgICBwb3NpdGlvbjogcGFyYW1zLlBvc2l0aW9uXG4gICAgfSxcbiAgICBoZWFkZXJzOiBwYXJhbXMuSGVhZGVyc1xuICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gIH0pO1xufVxuLyoqXG4gKiDojrflj5bnrb7lkI1cbiAqIEBwYXJhbSAge09iamVjdH0gIHBhcmFtcyAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuTWV0aG9kICDor7fmsYLmlrnms5XvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuS2V5ICAgICBvYmplY3TlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuRXhwaXJlcyDlkI3otoXml7bml7bpl7TvvIzljZXkvY3np5LvvIzlj6/pgIlcbiAqIEByZXR1cm4gIHtTdHJpbmd9ICBkYXRhICAgICAgICAgICAgICDov5Tlm57nrb7lkI3lrZfnrKbkuLJcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEF1dGgocGFyYW1zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHV0aWwuZ2V0QXV0aCh7XG4gICAgU2VjcmV0SWQ6IHBhcmFtcy5TZWNyZXRJZCB8fCB0aGlzLm9wdGlvbnMuU2VjcmV0SWQgfHwgJycsXG4gICAgU2VjcmV0S2V5OiBwYXJhbXMuU2VjcmV0S2V5IHx8IHRoaXMub3B0aW9ucy5TZWNyZXRLZXkgfHwgJycsXG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBNZXRob2Q6IHBhcmFtcy5NZXRob2QsXG4gICAgS2V5OiBwYXJhbXMuS2V5LFxuICAgIFF1ZXJ5OiBwYXJhbXMuUXVlcnksXG4gICAgSGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgRXhwaXJlczogcGFyYW1zLkV4cGlyZXMsXG4gICAgVXNlUmF3S2V5OiBzZWxmLm9wdGlvbnMuVXNlUmF3S2V5LFxuICAgIFN5c3RlbUNsb2NrT2Zmc2V0OiBzZWxmLm9wdGlvbnMuU3lzdGVtQ2xvY2tPZmZzZXRcbiAgfSk7XG59XG4vKipcbiAqIOiOt+WPluaWh+S7tuS4i+i9vemTvuaOpVxuICogQHBhcmFtICB7T2JqZWN0fSAgcGFyYW1zICAgICAgICAgICAgICAgICDlj4LmlbDlr7nosaHvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuQnVja2V0ICAgICAgQnVja2V05ZCN56ew77yM5b+F6aG7XG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLlJlZ2lvbiAgICAgIOWcsOWfn+WQjeensO+8jOW/hemhu1xuICogICAgIEBwYXJhbSAge1N0cmluZ30gIHBhcmFtcy5LZXkgICAgICAgICBvYmplY3TlkI3np7DvvIzlv4XpobtcbiAqICAgICBAcGFyYW0gIHtTdHJpbmd9ICBwYXJhbXMuTWV0aG9kICAgICAg6K+35rGC55qE5pa55rOV77yM5Y+v6YCJXG4gKiAgICAgQHBhcmFtICB7U3RyaW5nfSAgcGFyYW1zLkV4cGlyZXMgICAgIOetvuWQjei2heaXtuaXtumXtO+8jOWNleS9jeenku+8jOWPr+mAiVxuICogQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgICAgICAgICAgICDlm57osIPlh73mlbDvvIzlv4XpobtcbiAqICAgICBAcmV0dXJuICB7T2JqZWN0fSAgICBlcnIgICAgICAgICAgICAg6K+35rGC5aSx6LSl55qE6ZSZ6K+v77yM5aaC5p6c6K+35rGC5oiQ5Yqf77yM5YiZ5Li656m644CCaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83NzMwXG4gKiAgICAgQHJldHVybiAge09iamVjdH0gICAgZGF0YSAgICAgICAgICAgIOi/lOWbnueahOaVsOaNrlxuICovXG5cblxuZnVuY3Rpb24gZ2V0T2JqZWN0VXJsKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdXNlQWNjZWxlcmF0ZSA9IHBhcmFtcy5Vc2VBY2NlbGVyYXRlID09PSB1bmRlZmluZWQgPyBzZWxmLm9wdGlvbnMuVXNlQWNjZWxlcmF0ZSA6IHBhcmFtcy5Vc2VBY2NlbGVyYXRlO1xuICB2YXIgdXJsID0gZ2V0VXJsKHtcbiAgICBGb3JjZVBhdGhTdHlsZTogc2VsZi5vcHRpb25zLkZvcmNlUGF0aFN0eWxlLFxuICAgIHByb3RvY29sOiBwYXJhbXMuUHJvdG9jb2wgfHwgc2VsZi5vcHRpb25zLlByb3RvY29sLFxuICAgIGRvbWFpbjogcGFyYW1zLkRvbWFpbiB8fCBzZWxmLm9wdGlvbnMuRG9tYWluLFxuICAgIGJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICByZWdpb246IHVzZUFjY2VsZXJhdGUgPyAnYWNjZWxlcmF0ZScgOiBwYXJhbXMuUmVnaW9uLFxuICAgIG9iamVjdDogcGFyYW1zLktleVxuICB9KTtcbiAgdmFyIHF1ZXJ5UGFyYW1zU3RyID0gJyc7XG5cbiAgaWYgKHBhcmFtcy5RdWVyeSkge1xuICAgIHF1ZXJ5UGFyYW1zU3RyICs9IHV0aWwub2JqMnN0cihwYXJhbXMuUXVlcnkpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5RdWVyeVN0cmluZykge1xuICAgIHF1ZXJ5UGFyYW1zU3RyICs9IChxdWVyeVBhcmFtc1N0ciA/ICcmJyA6ICcnKSArIHBhcmFtcy5RdWVyeVN0cmluZztcbiAgfVxuXG4gIHZhciBzeW5jVXJsID0gdXJsO1xuXG4gIGlmIChwYXJhbXMuU2lnbiAhPT0gdW5kZWZpbmVkICYmICFwYXJhbXMuU2lnbikge1xuICAgIHF1ZXJ5UGFyYW1zU3RyICYmIChzeW5jVXJsICs9ICc/JyArIHF1ZXJ5UGFyYW1zU3RyKTtcbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICBVcmw6IHN5bmNVcmxcbiAgICB9KTtcbiAgICByZXR1cm4gc3luY1VybDtcbiAgfSAvLyDnrb7lkI3liqDkuIogSG9zdO+8jOmBv+WFjei3qOahtuiuv+mXrlxuXG5cbiAgdmFyIFNpZ25Ib3N0ID0gZ2V0U2lnbkhvc3QuY2FsbCh0aGlzLCB7XG4gICAgQnVja2V0OiBwYXJhbXMuQnVja2V0LFxuICAgIFJlZ2lvbjogcGFyYW1zLlJlZ2lvbixcbiAgICBVc2VBY2NlbGVyYXRlOiBwYXJhbXMuVXNlQWNjZWxlcmF0ZSxcbiAgICBVcmw6IHVybFxuICB9KTtcbiAgdmFyIEF1dGhEYXRhID0gZ2V0QXV0aG9yaXphdGlvbkFzeW5jLmNhbGwodGhpcywge1xuICAgIEFjdGlvbjogKHBhcmFtcy5NZXRob2QgfHwgJycpLnRvVXBwZXJDYXNlKCkgPT09ICdQVVQnID8gJ25hbWUvY29zOlB1dE9iamVjdCcgOiAnbmFtZS9jb3M6R2V0T2JqZWN0JyxcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQgfHwgJycsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uIHx8ICcnLFxuICAgIE1ldGhvZDogcGFyYW1zLk1ldGhvZCB8fCAnZ2V0JyxcbiAgICBLZXk6IHBhcmFtcy5LZXksXG4gICAgRXhwaXJlczogcGFyYW1zLkV4cGlyZXMsXG4gICAgSGVhZGVyczogcGFyYW1zLkhlYWRlcnMsXG4gICAgUXVlcnk6IHBhcmFtcy5RdWVyeSxcbiAgICBTaWduSG9zdDogU2lnbkhvc3QsXG4gICAgRm9yY2VTaWduSG9zdDogcGFyYW1zLkZvcmNlU2lnbkhvc3QgPT09IGZhbHNlID8gZmFsc2UgOiBzZWxmLm9wdGlvbnMuRm9yY2VTaWduSG9zdCAvLyBnZXRPYmplY3RVcmzmlK/mjIHkvKDlj4JGb3JjZVNpZ25Ib3N0XG5cbiAgfSwgZnVuY3Rpb24gKGVyciwgQXV0aERhdGEpIHtcbiAgICBpZiAoIWNhbGxiYWNrKSByZXR1cm47XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8g5YW85a655LiH6LGhdXJsIHFVcmxQYXJhbUxpc3TpnIDopoHlho1lbmNvZGXkuIDmrKFcblxuXG4gICAgdmFyIHJlcGxhY2VVcmxQYXJhbUxpc3QgPSBmdW5jdGlvbiByZXBsYWNlVXJsUGFyYW1MaXN0KHVybCkge1xuICAgICAgdmFyIHVybFBhcmFtcyA9IHVybC5tYXRjaCgvcS11cmwtcGFyYW0tbGlzdC4qPyg/PSYpL2cpWzBdO1xuICAgICAgdmFyIGVuY29kZWRQYXJhbXMgPSAncS11cmwtcGFyYW0tbGlzdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHVybFBhcmFtcy5yZXBsYWNlKC9xLXVybC1wYXJhbS1saXN0PS8sICcnKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciByZWcgPSBuZXcgUmVnRXhwKHVybFBhcmFtcywgJ2cnKTtcbiAgICAgIHZhciByZXBsYWNlZFVybCA9IHVybC5yZXBsYWNlKHJlZywgZW5jb2RlZFBhcmFtcyk7XG4gICAgICByZXR1cm4gcmVwbGFjZWRVcmw7XG4gICAgfTtcblxuICAgIHZhciBzaWduVXJsID0gdXJsO1xuICAgIHNpZ25VcmwgKz0gJz8nICsgKEF1dGhEYXRhLkF1dGhvcml6YXRpb24uaW5kZXhPZigncS1zaWduYXR1cmUnKSA+IC0xID8gcmVwbGFjZVVybFBhcmFtTGlzdChBdXRoRGF0YS5BdXRob3JpemF0aW9uKSA6ICdzaWduPScgKyBlbmNvZGVVUklDb21wb25lbnQoQXV0aERhdGEuQXV0aG9yaXphdGlvbikpO1xuICAgIEF1dGhEYXRhLlNlY3VyaXR5VG9rZW4gJiYgKHNpZ25VcmwgKz0gJyZ4LWNvcy1zZWN1cml0eS10b2tlbj0nICsgQXV0aERhdGEuU2VjdXJpdHlUb2tlbik7XG4gICAgQXV0aERhdGEuQ2xpZW50SVAgJiYgKHNpZ25VcmwgKz0gJyZjbGllbnRJUD0nICsgQXV0aERhdGEuQ2xpZW50SVApO1xuICAgIEF1dGhEYXRhLkNsaWVudFVBICYmIChzaWduVXJsICs9ICcmY2xpZW50VUE9JyArIEF1dGhEYXRhLkNsaWVudFVBKTtcbiAgICBBdXRoRGF0YS5Ub2tlbiAmJiAoc2lnblVybCArPSAnJnRva2VuPScgKyBBdXRoRGF0YS5Ub2tlbik7XG4gICAgcXVlcnlQYXJhbXNTdHIgJiYgKHNpZ25VcmwgKz0gJyYnICsgcXVlcnlQYXJhbXNTdHIpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICBVcmw6IHNpZ25VcmxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBpZiAoQXV0aERhdGEpIHtcbiAgICBzeW5jVXJsICs9ICc/JyArIEF1dGhEYXRhLkF1dGhvcml6YXRpb24gKyAoQXV0aERhdGEuU2VjdXJpdHlUb2tlbiA/ICcmeC1jb3Mtc2VjdXJpdHktdG9rZW49JyArIEF1dGhEYXRhLlNlY3VyaXR5VG9rZW4gOiAnJyk7XG4gICAgcXVlcnlQYXJhbXNTdHIgJiYgKHN5bmNVcmwgKz0gJyYnICsgcXVlcnlQYXJhbXNTdHIpO1xuICB9IGVsc2Uge1xuICAgIHF1ZXJ5UGFyYW1zU3RyICYmIChzeW5jVXJsICs9ICc/JyArIHF1ZXJ5UGFyYW1zU3RyKTtcbiAgfVxuXG4gIHJldHVybiBzeW5jVXJsO1xufVxuLyoqXG4gKiDnp4HmnInmlrnms5VcbiAqL1xuXG5cbmZ1bmN0aW9uIGRlY29kZUFjbChBY2Nlc3NDb250cm9sUG9saWN5KSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgR3JhbnRGdWxsQ29udHJvbDogW10sXG4gICAgR3JhbnRXcml0ZTogW10sXG4gICAgR3JhbnRSZWFkOiBbXSxcbiAgICBHcmFudFJlYWRBY3A6IFtdLFxuICAgIEdyYW50V3JpdGVBY3A6IFtdLFxuICAgIEFDTDogJydcbiAgfTtcbiAgdmFyIEdyYW50TWFwID0ge1xuICAgICdGVUxMX0NPTlRST0wnOiAnR3JhbnRGdWxsQ29udHJvbCcsXG4gICAgJ1dSSVRFJzogJ0dyYW50V3JpdGUnLFxuICAgICdSRUFEJzogJ0dyYW50UmVhZCcsXG4gICAgJ1JFQURfQUNQJzogJ0dyYW50UmVhZEFjcCcsXG4gICAgJ1dSSVRFX0FDUCc6ICdHcmFudFdyaXRlQWNwJ1xuICB9O1xuICB2YXIgQWNjZXNzQ29udHJvbExpc3QgPSBBY2Nlc3NDb250cm9sUG9saWN5ICYmIEFjY2Vzc0NvbnRyb2xQb2xpY3kuQWNjZXNzQ29udHJvbExpc3QgfHwge307XG4gIHZhciBHcmFudCA9IEFjY2Vzc0NvbnRyb2xMaXN0LkdyYW50O1xuXG4gIGlmIChHcmFudCkge1xuICAgIEdyYW50ID0gdXRpbC5pc0FycmF5KEdyYW50KSA/IEdyYW50IDogW0dyYW50XTtcbiAgfVxuXG4gIHZhciBQdWJsaWNBY2wgPSB7XG4gICAgUkVBRDogMCxcbiAgICBXUklURTogMCxcbiAgICBGVUxMX0NPTlRST0w6IDBcbiAgfTtcbiAgR3JhbnQgJiYgR3JhbnQubGVuZ3RoICYmIHV0aWwuZWFjaChHcmFudCwgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAoaXRlbS5HcmFudGVlLklEID09PSAncWNzOjpjYW06OmFueW9uZTphbnlvbmUnIHx8IGl0ZW0uR3JhbnRlZS5VUkkgPT09ICdodHRwOi8vY2FtLnFjbG91ZC5jb20vZ3JvdXBzL2dsb2JhbC9BbGxVc2VycycpIHtcbiAgICAgIFB1YmxpY0FjbFtpdGVtLlBlcm1pc3Npb25dID0gMTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0uR3JhbnRlZS5JRCAhPT0gQWNjZXNzQ29udHJvbFBvbGljeS5Pd25lci5JRCkge1xuICAgICAgcmVzdWx0W0dyYW50TWFwW2l0ZW0uUGVybWlzc2lvbl1dLnB1c2goJ2lkPVwiJyArIGl0ZW0uR3JhbnRlZS5JRCArICdcIicpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKFB1YmxpY0FjbC5GVUxMX0NPTlRST0wgfHwgUHVibGljQWNsLldSSVRFICYmIFB1YmxpY0FjbC5SRUFEKSB7XG4gICAgcmVzdWx0LkFDTCA9ICdwdWJsaWMtcmVhZC13cml0ZSc7XG4gIH0gZWxzZSBpZiAoUHVibGljQWNsLlJFQUQpIHtcbiAgICByZXN1bHQuQUNMID0gJ3B1YmxpYy1yZWFkJztcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQuQUNMID0gJ3ByaXZhdGUnO1xuICB9XG5cbiAgdXRpbC5lYWNoKEdyYW50TWFwLCBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJlc3VsdFtpdGVtXSA9IHVuaXFHcmFudChyZXN1bHRbaXRlbV0uam9pbignLCcpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59IC8vIEdyYW50IOWOu+mHjVxuXG5cbmZ1bmN0aW9uIHVuaXFHcmFudChzdHIpIHtcbiAgdmFyIGFyciA9IHN0ci5zcGxpdCgnLCcpO1xuICB2YXIgZXhpc3QgPSB7fTtcbiAgdmFyIGksIGl0ZW07XG5cbiAgZm9yIChpID0gMDsgaSA8IGFyci5sZW5ndGg7KSB7XG4gICAgaXRlbSA9IGFycltpXS50cmltKCk7XG5cbiAgICBpZiAoZXhpc3RbaXRlbV0pIHtcbiAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0W2l0ZW1dID0gdHJ1ZTtcbiAgICAgIGFycltpXSA9IGl0ZW07XG4gICAgICBpKys7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFyci5qb2luKCcsJyk7XG59IC8vIOeUn+aIkOaTjeS9nCB1cmxcblxuXG5mdW5jdGlvbiBnZXRVcmwocGFyYW1zKSB7XG4gIHZhciByZWdpb24gPSBwYXJhbXMucmVnaW9uIHx8ICcnO1xuICB2YXIgbG9uZ0J1Y2tldCA9IHBhcmFtcy5idWNrZXQgfHwgJyc7XG4gIHZhciBzaG9ydEJ1Y2tldCA9IGxvbmdCdWNrZXQuc3Vic3RyKDAsIGxvbmdCdWNrZXQubGFzdEluZGV4T2YoJy0nKSk7XG4gIHZhciBhcHBJZCA9IGxvbmdCdWNrZXQuc3Vic3RyKGxvbmdCdWNrZXQubGFzdEluZGV4T2YoJy0nKSArIDEpO1xuICB2YXIgZG9tYWluID0gcGFyYW1zLmRvbWFpbjtcbiAgdmFyIG9iamVjdCA9IHBhcmFtcy5vYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBkb21haW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICBkb21haW4gPSBkb21haW4oe1xuICAgICAgQnVja2V0OiBsb25nQnVja2V0LFxuICAgICAgUmVnaW9uOiByZWdpb25cbiAgICB9KTtcbiAgfVxuXG4gIHZhciBwcm90b2NvbCA9IHBhcmFtcy5wcm90b2NvbCB8fCAodXRpbC5pc0Jyb3dzZXIgJiYgbG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwOicgPyAnaHR0cDonIDogJ2h0dHBzOicpO1xuXG4gIGlmICghZG9tYWluKSB7XG4gICAgaWYgKFsnY24tc291dGgnLCAnY24tc291dGgtMicsICdjbi1ub3J0aCcsICdjbi1lYXN0JywgJ2NuLXNvdXRod2VzdCcsICdzZyddLmluZGV4T2YocmVnaW9uKSA+IC0xKSB7XG4gICAgICBkb21haW4gPSAne1JlZ2lvbn0ubXlxY2xvdWQuY29tJztcbiAgICB9IGVsc2Uge1xuICAgICAgZG9tYWluID0gJ2Nvcy57UmVnaW9ufS5teXFjbG91ZC5jb20nO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLkZvcmNlUGF0aFN0eWxlKSB7XG4gICAgICBkb21haW4gPSAne0J1Y2tldH0uJyArIGRvbWFpbjtcbiAgICB9XG4gIH1cblxuICBkb21haW4gPSBkb21haW4ucmVwbGFjZSgvXFx7XFx7QXBwSWRcXH1cXH0vaWcsIGFwcElkKS5yZXBsYWNlKC9cXHtcXHtCdWNrZXRcXH1cXH0vaWcsIHNob3J0QnVja2V0KS5yZXBsYWNlKC9cXHtcXHtSZWdpb25cXH1cXH0vaWcsIHJlZ2lvbikucmVwbGFjZSgvXFx7XFx7Lio/XFx9XFx9L2lnLCAnJyk7XG4gIGRvbWFpbiA9IGRvbWFpbi5yZXBsYWNlKC9cXHtBcHBJZFxcfS9pZywgYXBwSWQpLnJlcGxhY2UoL1xce0J1Y2tldE5hbWVcXH0vaWcsIHNob3J0QnVja2V0KS5yZXBsYWNlKC9cXHtCdWNrZXRcXH0vaWcsIGxvbmdCdWNrZXQpLnJlcGxhY2UoL1xce1JlZ2lvblxcfS9pZywgcmVnaW9uKS5yZXBsYWNlKC9cXHsuKj9cXH0vaWcsICcnKTtcblxuICBpZiAoIS9eW2EtekEtWl0rOlxcL1xcLy8udGVzdChkb21haW4pKSB7XG4gICAgZG9tYWluID0gcHJvdG9jb2wgKyAnLy8nICsgZG9tYWluO1xuICB9IC8vIOWOu+aOieWfn+WQjeacgOWQjueahOaWnOadhlxuXG5cbiAgaWYgKGRvbWFpbi5zbGljZSgtMSkgPT09ICcvJykge1xuICAgIGRvbWFpbiA9IGRvbWFpbi5zbGljZSgwLCAtMSk7XG4gIH1cblxuICB2YXIgdXJsID0gZG9tYWluO1xuXG4gIGlmIChwYXJhbXMuRm9yY2VQYXRoU3R5bGUpIHtcbiAgICB1cmwgKz0gJy8nICsgbG9uZ0J1Y2tldDtcbiAgfVxuXG4gIHVybCArPSAnLyc7XG5cbiAgaWYgKG9iamVjdCkge1xuICAgIHVybCArPSB1dGlsLmNhbVNhZmVVcmxFbmNvZGUob2JqZWN0KS5yZXBsYWNlKC8lMkYvZywgJy8nKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuaXNMb2NhdGlvbikge1xuICAgIHVybCA9IHVybC5yZXBsYWNlKC9eaHR0cHM/OlxcL1xcLy8sICcnKTtcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59XG5cbnZhciBnZXRTaWduSG9zdCA9IGZ1bmN0aW9uIGdldFNpZ25Ib3N0KG9wdCkge1xuICBpZiAoIW9wdC5CdWNrZXQgfHwgIW9wdC5SZWdpb24pIHJldHVybiAnJztcbiAgdmFyIHVzZUFjY2VsZXJhdGUgPSBvcHQuVXNlQWNjZWxlcmF0ZSA9PT0gdW5kZWZpbmVkID8gdGhpcy5vcHRpb25zLlVzZUFjY2VsZXJhdGUgOiBvcHQuVXNlQWNjZWxlcmF0ZTtcbiAgdmFyIHVybCA9IG9wdC5VcmwgfHwgZ2V0VXJsKHtcbiAgICBGb3JjZVBhdGhTdHlsZTogdGhpcy5vcHRpb25zLkZvcmNlUGF0aFN0eWxlLFxuICAgIHByb3RvY29sOiB0aGlzLm9wdGlvbnMuUHJvdG9jb2wsXG4gICAgZG9tYWluOiB0aGlzLm9wdGlvbnMuRG9tYWluLFxuICAgIGJ1Y2tldDogb3B0LkJ1Y2tldCxcbiAgICByZWdpb246IHVzZUFjY2VsZXJhdGUgPyAnYWNjZWxlcmF0ZScgOiBvcHQuUmVnaW9uXG4gIH0pO1xuICB2YXIgdXJsSG9zdCA9IHVybC5yZXBsYWNlKC9eaHR0cHM/OlxcL1xcLyhbXi9dKykoXFwvLiopPyQvLCAnJDEnKTtcbiAgdmFyIHN0YW5kYXJkSG9zdFJlZyA9IG5ldyBSZWdFeHAoJ14oW2EtelxcXFxkLV0rLVxcXFxkK1xcXFwuKT8oY29zfGNvc3Y2fGNpfHBpYylcXFxcLihbYS16XFxcXGQtXSspXFxcXC5teXFjbG91ZFxcXFwuY29tJCcpO1xuICBpZiAoc3RhbmRhcmRIb3N0UmVnLnRlc3QodXJsSG9zdCkpIHJldHVybiB1cmxIb3N0O1xuICByZXR1cm4gJyc7XG59OyAvLyDlvILmraXojrflj5bnrb7lkI1cblxuXG5mdW5jdGlvbiBnZXRBdXRob3JpemF0aW9uQXN5bmMocGFyYW1zLCBjYWxsYmFjaykge1xuICB2YXIgaGVhZGVycyA9IHV0aWwuY2xvbmUocGFyYW1zLkhlYWRlcnMpO1xuICB2YXIgaGVhZGVySG9zdCA9ICcnO1xuICB1dGlsLmVhY2goaGVhZGVycywgZnVuY3Rpb24gKHYsIGspIHtcbiAgICAodiA9PT0gJycgfHwgWydjb250ZW50LXR5cGUnLCAnY2FjaGUtY29udHJvbCcsICdleHBpcmVzJ10uaW5kZXhPZihrLnRvTG93ZXJDYXNlKCkpID4gLTEpICYmIGRlbGV0ZSBoZWFkZXJzW2tdO1xuICAgIGlmIChrLnRvTG93ZXJDYXNlKCkgPT09ICdob3N0JykgaGVhZGVySG9zdCA9IHY7XG4gIH0pOyAvLyBGb3JjZVNpZ25Ib3N05piO56Gu5Lyg5YWlZmFsc2XmiY3kuI3liqDlhaVob3N0562+5ZCNXG5cbiAgdmFyIGZvcmNlU2lnbkhvc3QgPSBwYXJhbXMuRm9yY2VTaWduSG9zdCA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWU7IC8vIEhvc3Qg5Yqg5YWl562+5ZCN6K6h566XXG5cbiAgaWYgKCFoZWFkZXJIb3N0ICYmIHBhcmFtcy5TaWduSG9zdCAmJiBmb3JjZVNpZ25Ib3N0KSBoZWFkZXJzLkhvc3QgPSBwYXJhbXMuU2lnbkhvc3Q7IC8vIOiOt+WPluWHreivgeeahOWbnuiwg++8jOmBv+WFjeeUqOaItyBjYWxsYmFjayDlpJrmrKFcblxuICB2YXIgY2JEb25lID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gZnVuY3Rpb24gY2IoZXJyLCBBdXRoRGF0YSkge1xuICAgIGlmIChjYkRvbmUpIHJldHVybjtcbiAgICBjYkRvbmUgPSB0cnVlO1xuXG4gICAgaWYgKEF1dGhEYXRhICYmIEF1dGhEYXRhLlhDb3NTZWN1cml0eVRva2VuICYmICFBdXRoRGF0YS5TZWN1cml0eVRva2VuKSB7XG4gICAgICBBdXRoRGF0YSA9IHV0aWwuY2xvbmUoQXV0aERhdGEpO1xuICAgICAgQXV0aERhdGEuU2VjdXJpdHlUb2tlbiA9IEF1dGhEYXRhLlhDb3NTZWN1cml0eVRva2VuO1xuICAgICAgZGVsZXRlIEF1dGhEYXRhLlhDb3NTZWN1cml0eVRva2VuO1xuICAgIH1cblxuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGVyciwgQXV0aERhdGEpO1xuICB9O1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIEJ1Y2tldCA9IHBhcmFtcy5CdWNrZXQgfHwgJyc7XG4gIHZhciBSZWdpb24gPSBwYXJhbXMuUmVnaW9uIHx8ICcnOyAvLyBQYXRoTmFtZVxuXG4gIHZhciBLZXlOYW1lID0gcGFyYW1zLktleSB8fCAnJztcblxuICBpZiAoc2VsZi5vcHRpb25zLkZvcmNlUGF0aFN0eWxlICYmIEJ1Y2tldCkge1xuICAgIEtleU5hbWUgPSBCdWNrZXQgKyAnLycgKyBLZXlOYW1lO1xuICB9XG5cbiAgdmFyIFBhdGhuYW1lID0gJy8nICsgS2V5TmFtZTsgLy8gQWN0aW9u44CBUmVzb3VyY2VLZXlcblxuICB2YXIgU3RzRGF0YSA9IHt9O1xuICB2YXIgU2NvcGUgPSBwYXJhbXMuU2NvcGU7XG5cbiAgaWYgKCFTY29wZSkge1xuICAgIHZhciBBY3Rpb24gPSBwYXJhbXMuQWN0aW9uIHx8ICcnO1xuICAgIHZhciBSZXNvdXJjZUtleSA9IHBhcmFtcy5SZXNvdXJjZUtleSB8fCBwYXJhbXMuS2V5IHx8ICcnO1xuICAgIFNjb3BlID0gcGFyYW1zLlNjb3BlIHx8IFt7XG4gICAgICBhY3Rpb246IEFjdGlvbixcbiAgICAgIGJ1Y2tldDogQnVja2V0LFxuICAgICAgcmVnaW9uOiBSZWdpb24sXG4gICAgICBwcmVmaXg6IFJlc291cmNlS2V5XG4gICAgfV07XG4gIH1cblxuICB2YXIgU2NvcGVLZXkgPSB1dGlsLm1kNShKU09OLnN0cmluZ2lmeShTY29wZSkpOyAvLyBTVFNcblxuICBzZWxmLl9TdHNDYWNoZSA9IHNlbGYuX1N0c0NhY2hlIHx8IFtdO1xuXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGksIEF1dGhEYXRhO1xuXG4gICAgZm9yIChpID0gc2VsZi5fU3RzQ2FjaGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIEF1dGhEYXRhID0gc2VsZi5fU3RzQ2FjaGVbaV07XG4gICAgICB2YXIgY29tcGFyZVRpbWUgPSBNYXRoLnJvdW5kKHV0aWwuZ2V0U2tld1RpbWUoc2VsZi5vcHRpb25zLlN5c3RlbUNsb2NrT2Zmc2V0KSAvIDEwMDApICsgMzA7XG5cbiAgICAgIGlmIChBdXRoRGF0YS5TdGFydFRpbWUgJiYgY29tcGFyZVRpbWUgPCBBdXRoRGF0YS5TdGFydFRpbWUgfHwgY29tcGFyZVRpbWUgPj0gQXV0aERhdGEuRXhwaXJlZFRpbWUpIHtcbiAgICAgICAgc2VsZi5fU3RzQ2FjaGUuc3BsaWNlKGksIDEpO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIUF1dGhEYXRhLlNjb3BlTGltaXQgfHwgQXV0aERhdGEuU2NvcGVMaW1pdCAmJiBBdXRoRGF0YS5TY29wZUtleSA9PT0gU2NvcGVLZXkpIHtcbiAgICAgICAgU3RzRGF0YSA9IEF1dGhEYXRhO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0pKCk7XG5cbiAgdmFyIGNhbGNBdXRoQnlUbXBLZXkgPSBmdW5jdGlvbiBjYWxjQXV0aEJ5VG1wS2V5KCkge1xuICAgIHZhciBLZXlUaW1lID0gJyc7XG4gICAgaWYgKFN0c0RhdGEuU3RhcnRUaW1lICYmIHBhcmFtcy5FeHBpcmVzKSBLZXlUaW1lID0gU3RzRGF0YS5TdGFydFRpbWUgKyAnOycgKyAoU3RzRGF0YS5TdGFydFRpbWUgKyBwYXJhbXMuRXhwaXJlcyAqIDEpO2Vsc2UgaWYgKFN0c0RhdGEuU3RhcnRUaW1lICYmIFN0c0RhdGEuRXhwaXJlZFRpbWUpIEtleVRpbWUgPSBTdHNEYXRhLlN0YXJ0VGltZSArICc7JyArIFN0c0RhdGEuRXhwaXJlZFRpbWU7XG4gICAgdmFyIEF1dGhvcml6YXRpb24gPSB1dGlsLmdldEF1dGgoe1xuICAgICAgU2VjcmV0SWQ6IFN0c0RhdGEuVG1wU2VjcmV0SWQsXG4gICAgICBTZWNyZXRLZXk6IFN0c0RhdGEuVG1wU2VjcmV0S2V5LFxuICAgICAgTWV0aG9kOiBwYXJhbXMuTWV0aG9kLFxuICAgICAgUGF0aG5hbWU6IFBhdGhuYW1lLFxuICAgICAgUXVlcnk6IHBhcmFtcy5RdWVyeSxcbiAgICAgIEhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBFeHBpcmVzOiBwYXJhbXMuRXhwaXJlcyxcbiAgICAgIFVzZVJhd0tleTogc2VsZi5vcHRpb25zLlVzZVJhd0tleSxcbiAgICAgIFN5c3RlbUNsb2NrT2Zmc2V0OiBzZWxmLm9wdGlvbnMuU3lzdGVtQ2xvY2tPZmZzZXQsXG4gICAgICBLZXlUaW1lOiBLZXlUaW1lLFxuICAgICAgRm9yY2VTaWduSG9zdDogZm9yY2VTaWduSG9zdFxuICAgIH0pO1xuICAgIHZhciBBdXRoRGF0YSA9IHtcbiAgICAgIEF1dGhvcml6YXRpb246IEF1dGhvcml6YXRpb24sXG4gICAgICBTZWN1cml0eVRva2VuOiBTdHNEYXRhLlNlY3VyaXR5VG9rZW4gfHwgU3RzRGF0YS5YQ29zU2VjdXJpdHlUb2tlbiB8fCAnJyxcbiAgICAgIFRva2VuOiBTdHNEYXRhLlRva2VuIHx8ICcnLFxuICAgICAgQ2xpZW50SVA6IFN0c0RhdGEuQ2xpZW50SVAgfHwgJycsXG4gICAgICBDbGllbnRVQTogU3RzRGF0YS5DbGllbnRVQSB8fCAnJ1xuICAgIH07XG4gICAgY2IobnVsbCwgQXV0aERhdGEpO1xuICB9O1xuXG4gIHZhciBjaGVja0F1dGhFcnJvciA9IGZ1bmN0aW9uIGNoZWNrQXV0aEVycm9yKEF1dGhEYXRhKSB7XG4gICAgaWYgKEF1dGhEYXRhLkF1dGhvcml6YXRpb24pIHtcbiAgICAgIC8vIOajgOafpeetvuWQjeagvOW8j1xuICAgICAgdmFyIGZvcm1hdEFsbG93ID0gZmFsc2U7XG4gICAgICB2YXIgYXV0aCA9IEF1dGhEYXRhLkF1dGhvcml6YXRpb247XG5cbiAgICAgIGlmIChhdXRoKSB7XG4gICAgICAgIGlmIChhdXRoLmluZGV4T2YoJyAnKSA+IC0xKSB7XG4gICAgICAgICAgZm9ybWF0QWxsb3cgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChhdXRoLmluZGV4T2YoJ3Etc2lnbi1hbGdvcml0aG09JykgPiAtMSAmJiBhdXRoLmluZGV4T2YoJ3EtYWs9JykgPiAtMSAmJiBhdXRoLmluZGV4T2YoJ3Etc2lnbi10aW1lPScpID4gLTEgJiYgYXV0aC5pbmRleE9mKCdxLWtleS10aW1lPScpID4gLTEgJiYgYXV0aC5pbmRleE9mKCdxLXVybC1wYXJhbS1saXN0PScpID4gLTEpIHtcbiAgICAgICAgICBmb3JtYXRBbGxvdyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF1dGggPSBhdG9iKGF1dGgpO1xuXG4gICAgICAgICAgICBpZiAoYXV0aC5pbmRleE9mKCdhPScpID4gLTEgJiYgYXV0aC5pbmRleE9mKCdrPScpID4gLTEgJiYgYXV0aC5pbmRleE9mKCd0PScpID4gLTEgJiYgYXV0aC5pbmRleE9mKCdyPScpID4gLTEgJiYgYXV0aC5pbmRleE9mKCdiPScpID4gLTEpIHtcbiAgICAgICAgICAgICAgZm9ybWF0QWxsb3cgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFmb3JtYXRBbGxvdykgcmV0dXJuIHV0aWwuZXJyb3IobmV3IEVycm9yKCdnZXRBdXRob3JpemF0aW9uIGNhbGxiYWNrIHBhcmFtcyBmb3JtYXQgZXJyb3InKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghQXV0aERhdGEuVG1wU2VjcmV0SWQpIHJldHVybiB1dGlsLmVycm9yKG5ldyBFcnJvcignZ2V0QXV0aG9yaXphdGlvbiBjYWxsYmFjayBwYXJhbXMgbWlzc2luZyBcIlRtcFNlY3JldElkXCInKSk7XG4gICAgICBpZiAoIUF1dGhEYXRhLlRtcFNlY3JldEtleSkgcmV0dXJuIHV0aWwuZXJyb3IobmV3IEVycm9yKCdnZXRBdXRob3JpemF0aW9uIGNhbGxiYWNrIHBhcmFtcyBtaXNzaW5nIFwiVG1wU2VjcmV0S2V5XCInKSk7XG4gICAgICBpZiAoIUF1dGhEYXRhLlNlY3VyaXR5VG9rZW4gJiYgIUF1dGhEYXRhLlhDb3NTZWN1cml0eVRva2VuKSByZXR1cm4gdXRpbC5lcnJvcihuZXcgRXJyb3IoJ2dldEF1dGhvcml6YXRpb24gY2FsbGJhY2sgcGFyYW1zIG1pc3NpbmcgXCJTZWN1cml0eVRva2VuXCInKSk7XG4gICAgICBpZiAoIUF1dGhEYXRhLkV4cGlyZWRUaW1lKSByZXR1cm4gdXRpbC5lcnJvcihuZXcgRXJyb3IoJ2dldEF1dGhvcml6YXRpb24gY2FsbGJhY2sgcGFyYW1zIG1pc3NpbmcgXCJFeHBpcmVkVGltZVwiJykpO1xuICAgICAgaWYgKEF1dGhEYXRhLkV4cGlyZWRUaW1lICYmIEF1dGhEYXRhLkV4cGlyZWRUaW1lLnRvU3RyaW5nKCkubGVuZ3RoICE9PSAxMCkgcmV0dXJuIHV0aWwuZXJyb3IobmV3IEVycm9yKCdnZXRBdXRob3JpemF0aW9uIGNhbGxiYWNrIHBhcmFtcyBcIkV4cGlyZWRUaW1lXCIgc2hvdWxkIGJlIDEwIGRpZ2l0cycpKTtcbiAgICAgIGlmIChBdXRoRGF0YS5TdGFydFRpbWUgJiYgQXV0aERhdGEuU3RhcnRUaW1lLnRvU3RyaW5nKCkubGVuZ3RoICE9PSAxMCkgcmV0dXJuIHV0aWwuZXJyb3IobmV3IEVycm9yKCdnZXRBdXRob3JpemF0aW9uIGNhbGxiYWNrIHBhcmFtcyBcIlN0YXJ0VGltZVwiIHNob3VsZCBiZSAxMCBTdGFydFRpbWUnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9OyAvLyDlhYjliKTmlq3mmK/lkKbmnInkuLTml7blr4bpkqVcblxuXG4gIGlmIChTdHNEYXRhLkV4cGlyZWRUaW1lICYmIFN0c0RhdGEuRXhwaXJlZFRpbWUgLSB1dGlsLmdldFNrZXdUaW1lKHNlbGYub3B0aW9ucy5TeXN0ZW1DbG9ja09mZnNldCkgLyAxMDAwID4gNjApIHtcbiAgICAvLyDlpoLmnpznvJPlrZjnmoTkuLTml7blr4bpkqXmnInmlYjvvIzlubbov5jmnInotoXov4c2MOenkuacieaViOacn+WwseebtOaOpeS9v+eUqFxuICAgIGNhbGNBdXRoQnlUbXBLZXkoKTtcbiAgfSBlbHNlIGlmIChzZWxmLm9wdGlvbnMuZ2V0QXV0aG9yaXphdGlvbikge1xuICAgIC8vIOWklumDqOiuoeeul+etvuWQjeaIluiOt+WPluS4tOaXtuWvhumSpVxuICAgIHNlbGYub3B0aW9ucy5nZXRBdXRob3JpemF0aW9uLmNhbGwoc2VsZiwge1xuICAgICAgQnVja2V0OiBCdWNrZXQsXG4gICAgICBSZWdpb246IFJlZ2lvbixcbiAgICAgIE1ldGhvZDogcGFyYW1zLk1ldGhvZCxcbiAgICAgIEtleTogS2V5TmFtZSxcbiAgICAgIFBhdGhuYW1lOiBQYXRobmFtZSxcbiAgICAgIFF1ZXJ5OiBwYXJhbXMuUXVlcnksXG4gICAgICBIZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgU2NvcGU6IFNjb3BlLFxuICAgICAgU3lzdGVtQ2xvY2tPZmZzZXQ6IHNlbGYub3B0aW9ucy5TeXN0ZW1DbG9ja09mZnNldCxcbiAgICAgIEZvcmNlU2lnbkhvc3Q6IGZvcmNlU2lnbkhvc3RcbiAgICB9LCBmdW5jdGlvbiAoQXV0aERhdGEpIHtcbiAgICAgIGlmICh0eXBlb2YgQXV0aERhdGEgPT09ICdzdHJpbmcnKSBBdXRoRGF0YSA9IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogQXV0aERhdGFcbiAgICAgIH07XG4gICAgICB2YXIgQXV0aEVycm9yID0gY2hlY2tBdXRoRXJyb3IoQXV0aERhdGEpO1xuICAgICAgaWYgKEF1dGhFcnJvcikgcmV0dXJuIGNiKEF1dGhFcnJvcik7XG5cbiAgICAgIGlmIChBdXRoRGF0YS5BdXRob3JpemF0aW9uKSB7XG4gICAgICAgIGNiKG51bGwsIEF1dGhEYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFN0c0RhdGEgPSBBdXRoRGF0YSB8fCB7fTtcbiAgICAgICAgU3RzRGF0YS5TY29wZSA9IFNjb3BlO1xuICAgICAgICBTdHNEYXRhLlNjb3BlS2V5ID0gU2NvcGVLZXk7XG5cbiAgICAgICAgc2VsZi5fU3RzQ2FjaGUucHVzaChTdHNEYXRhKTtcblxuICAgICAgICBjYWxjQXV0aEJ5VG1wS2V5KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc2VsZi5vcHRpb25zLmdldFNUUykge1xuICAgIC8vIOWklumDqOiOt+WPluS4tOaXtuWvhumSpVxuICAgIHNlbGYub3B0aW9ucy5nZXRTVFMuY2FsbChzZWxmLCB7XG4gICAgICBCdWNrZXQ6IEJ1Y2tldCxcbiAgICAgIFJlZ2lvbjogUmVnaW9uXG4gICAgfSwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIFN0c0RhdGEgPSBkYXRhIHx8IHt9O1xuICAgICAgU3RzRGF0YS5TY29wZSA9IFNjb3BlO1xuICAgICAgU3RzRGF0YS5TY29wZUtleSA9IFNjb3BlS2V5O1xuICAgICAgaWYgKCFTdHNEYXRhLlRtcFNlY3JldElkKSBTdHNEYXRhLlRtcFNlY3JldElkID0gU3RzRGF0YS5TZWNyZXRJZDtcbiAgICAgIGlmICghU3RzRGF0YS5UbXBTZWNyZXRLZXkpIFN0c0RhdGEuVG1wU2VjcmV0S2V5ID0gU3RzRGF0YS5TZWNyZXRLZXk7XG4gICAgICB2YXIgQXV0aEVycm9yID0gY2hlY2tBdXRoRXJyb3IoU3RzRGF0YSk7XG4gICAgICBpZiAoQXV0aEVycm9yKSByZXR1cm4gY2IoQXV0aEVycm9yKTtcblxuICAgICAgc2VsZi5fU3RzQ2FjaGUucHVzaChTdHNEYXRhKTtcblxuICAgICAgY2FsY0F1dGhCeVRtcEtleSgpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIOWGhemDqOiuoeeul+iOt+WPluetvuWQjVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgQXV0aG9yaXphdGlvbiA9IHV0aWwuZ2V0QXV0aCh7XG4gICAgICAgIFNlY3JldElkOiBwYXJhbXMuU2VjcmV0SWQgfHwgc2VsZi5vcHRpb25zLlNlY3JldElkLFxuICAgICAgICBTZWNyZXRLZXk6IHBhcmFtcy5TZWNyZXRLZXkgfHwgc2VsZi5vcHRpb25zLlNlY3JldEtleSxcbiAgICAgICAgTWV0aG9kOiBwYXJhbXMuTWV0aG9kLFxuICAgICAgICBQYXRobmFtZTogUGF0aG5hbWUsXG4gICAgICAgIFF1ZXJ5OiBwYXJhbXMuUXVlcnksXG4gICAgICAgIEhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgIEV4cGlyZXM6IHBhcmFtcy5FeHBpcmVzLFxuICAgICAgICBVc2VSYXdLZXk6IHNlbGYub3B0aW9ucy5Vc2VSYXdLZXksXG4gICAgICAgIFN5c3RlbUNsb2NrT2Zmc2V0OiBzZWxmLm9wdGlvbnMuU3lzdGVtQ2xvY2tPZmZzZXQsXG4gICAgICAgIEZvcmNlU2lnbkhvc3Q6IGZvcmNlU2lnbkhvc3RcbiAgICAgIH0pO1xuICAgICAgdmFyIEF1dGhEYXRhID0ge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBBdXRob3JpemF0aW9uLFxuICAgICAgICBTZWN1cml0eVRva2VuOiBzZWxmLm9wdGlvbnMuU2VjdXJpdHlUb2tlbiB8fCBzZWxmLm9wdGlvbnMuWENvc1NlY3VyaXR5VG9rZW5cbiAgICAgIH07XG4gICAgICBjYihudWxsLCBBdXRoRGF0YSk7XG4gICAgICByZXR1cm4gQXV0aERhdGE7XG4gICAgfSgpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufSAvLyDosIPmlbTml7bpl7TlgY/lt65cblxuXG5mdW5jdGlvbiBhbGxvd1JldHJ5KGVycikge1xuICB2YXIgYWxsb3dSZXRyeSA9IGZhbHNlO1xuICB2YXIgaXNUaW1lRXJyb3IgPSBmYWxzZTtcbiAgdmFyIHNlcnZlckRhdGUgPSBlcnIuaGVhZGVycyAmJiAoZXJyLmhlYWRlcnMuZGF0ZSB8fCBlcnIuaGVhZGVycy5EYXRlKSB8fCBlcnIuZXJyb3IgJiYgZXJyLmVycm9yLlNlcnZlclRpbWU7XG5cbiAgdHJ5IHtcbiAgICB2YXIgZXJyb3JDb2RlID0gZXJyLmVycm9yLkNvZGU7XG4gICAgdmFyIGVycm9yTWVzc2FnZSA9IGVyci5lcnJvci5NZXNzYWdlO1xuXG4gICAgaWYgKGVycm9yQ29kZSA9PT0gJ1JlcXVlc3RUaW1lVG9vU2tld2VkJyB8fCBlcnJvckNvZGUgPT09ICdBY2Nlc3NEZW5pZWQnICYmIGVycm9yTWVzc2FnZSA9PT0gJ1JlcXVlc3QgaGFzIGV4cGlyZWQnKSB7XG4gICAgICBpc1RpbWVFcnJvciA9IHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7fVxuXG4gIGlmIChlcnIpIHtcbiAgICBpZiAoaXNUaW1lRXJyb3IgJiYgc2VydmVyRGF0ZSkge1xuICAgICAgdmFyIHNlcnZlclRpbWUgPSBEYXRlLnBhcnNlKHNlcnZlckRhdGUpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLkNvcnJlY3RDbG9ja1NrZXcgJiYgTWF0aC5hYnModXRpbC5nZXRTa2V3VGltZSh0aGlzLm9wdGlvbnMuU3lzdGVtQ2xvY2tPZmZzZXQpIC0gc2VydmVyVGltZSkgPj0gMzAwMDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignZXJyb3I6IExvY2FsIHRpbWUgaXMgdG9vIHNrZXdlZC4nKTtcbiAgICAgICAgdGhpcy5vcHRpb25zLlN5c3RlbUNsb2NrT2Zmc2V0ID0gc2VydmVyVGltZSAtIERhdGUubm93KCk7XG4gICAgICAgIGFsbG93UmV0cnkgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoTWF0aC5mbG9vcihlcnIuc3RhdHVzQ29kZSAvIDEwMCkgPT09IDUpIHtcbiAgICAgIGFsbG93UmV0cnkgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbGxvd1JldHJ5O1xufSAvLyDojrflj5bnrb7lkI3lubblj5Hotbfor7fmsYJcblxuXG5mdW5jdGlvbiBzdWJtaXRSZXF1ZXN0KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzOyAvLyDlpITnkIYgaGVhZGVyc1xuXG4gICFwYXJhbXMuaGVhZGVycyAmJiAocGFyYW1zLmhlYWRlcnMgPSB7fSk7IC8vIOWkhOeQhiBxdWVyeVxuXG4gICFwYXJhbXMucXMgJiYgKHBhcmFtcy5xcyA9IHt9KTtcbiAgcGFyYW1zLlZlcnNpb25JZCAmJiAocGFyYW1zLnFzLnZlcnNpb25JZCA9IHBhcmFtcy5WZXJzaW9uSWQpO1xuICBwYXJhbXMucXMgPSB1dGlsLmNsZWFyS2V5KHBhcmFtcy5xcyk7IC8vIOa4heeQhiB1bmRlZmluZWQg5ZKMIG51bGwg5a2X5q61XG5cbiAgcGFyYW1zLmhlYWRlcnMgJiYgKHBhcmFtcy5oZWFkZXJzID0gdXRpbC5jbGVhcktleShwYXJhbXMuaGVhZGVycykpO1xuICBwYXJhbXMucXMgJiYgKHBhcmFtcy5xcyA9IHV0aWwuY2xlYXJLZXkocGFyYW1zLnFzKSk7XG4gIHZhciBRdWVyeSA9IHV0aWwuY2xvbmUocGFyYW1zLnFzKTtcbiAgcGFyYW1zLmFjdGlvbiAmJiAoUXVlcnlbcGFyYW1zLmFjdGlvbl0gPSAnJyk7XG4gIHZhciBwYXJhbXNVcmwgPSBwYXJhbXMudXJsIHx8IHBhcmFtcy5Vcmw7XG4gIHZhciBTaWduSG9zdCA9IHBhcmFtcy5TaWduSG9zdCB8fCBnZXRTaWduSG9zdC5jYWxsKHRoaXMsIHtcbiAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uLFxuICAgIFVybDogcGFyYW1zVXJsXG4gIH0pO1xuICB2YXIgdHJhY2tlciA9IHBhcmFtcy50cmFja2VyO1xuXG4gIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dCh0cnlUaW1lcykge1xuICAgIHZhciBvbGRDbG9ja09mZnNldCA9IHNlbGYub3B0aW9ucy5TeXN0ZW1DbG9ja09mZnNldDtcbiAgICB0cmFja2VyICYmIHRyYWNrZXIuc2V0UGFyYW1zKHtcbiAgICAgIHNpZ25TdGFydFRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgcmV0cnlUaW1lczogdHJ5VGltZXMgLSAxXG4gICAgfSk7XG4gICAgZ2V0QXV0aG9yaXphdGlvbkFzeW5jLmNhbGwoc2VsZiwge1xuICAgICAgQnVja2V0OiBwYXJhbXMuQnVja2V0IHx8ICcnLFxuICAgICAgUmVnaW9uOiBwYXJhbXMuUmVnaW9uIHx8ICcnLFxuICAgICAgTWV0aG9kOiBwYXJhbXMubWV0aG9kLFxuICAgICAgS2V5OiBwYXJhbXMuS2V5LFxuICAgICAgUXVlcnk6IFF1ZXJ5LFxuICAgICAgSGVhZGVyczogcGFyYW1zLmhlYWRlcnMsXG4gICAgICBTaWduSG9zdDogU2lnbkhvc3QsXG4gICAgICBBY3Rpb246IHBhcmFtcy5BY3Rpb24sXG4gICAgICBSZXNvdXJjZUtleTogcGFyYW1zLlJlc291cmNlS2V5LFxuICAgICAgU2NvcGU6IHBhcmFtcy5TY29wZSxcbiAgICAgIEZvcmNlU2lnbkhvc3Q6IHNlbGYub3B0aW9ucy5Gb3JjZVNpZ25Ib3N0XG4gICAgfSwgZnVuY3Rpb24gKGVyciwgQXV0aERhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cmFja2VyICYmIHRyYWNrZXIuc2V0UGFyYW1zKHtcbiAgICAgICAgc2lnbkVuZFRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICBodHRwU3RhcnRUaW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgfSk7XG4gICAgICBwYXJhbXMuQXV0aERhdGEgPSBBdXRoRGF0YTtcblxuICAgICAgX3N1Ym1pdFJlcXVlc3QuY2FsbChzZWxmLCBwYXJhbXMsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgdHJhY2tlciAmJiB0cmFja2VyLnNldFBhcmFtcyh7XG4gICAgICAgICAgaHR0cEVuZFRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChlcnIgJiYgdHJ5VGltZXMgPCAyICYmIChvbGRDbG9ja09mZnNldCAhPT0gc2VsZi5vcHRpb25zLlN5c3RlbUNsb2NrT2Zmc2V0IHx8IGFsbG93UmV0cnkuY2FsbChzZWxmLCBlcnIpKSkge1xuICAgICAgICAgIGlmIChwYXJhbXMuaGVhZGVycykge1xuICAgICAgICAgICAgZGVsZXRlIHBhcmFtcy5oZWFkZXJzLkF1dGhvcml6YXRpb247XG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zLmhlYWRlcnNbJ3Rva2VuJ107XG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zLmhlYWRlcnNbJ2NsaWVudElQJ107XG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zLmhlYWRlcnNbJ2NsaWVudFVBJ107XG4gICAgICAgICAgICBwYXJhbXMuaGVhZGVyc1sneC1jb3Mtc2VjdXJpdHktdG9rZW4nXSAmJiBkZWxldGUgcGFyYW1zLmhlYWRlcnNbJ3gtY29zLXNlY3VyaXR5LXRva2VuJ107XG4gICAgICAgICAgICBwYXJhbXMuaGVhZGVyc1sneC1jaS1zZWN1cml0eS10b2tlbiddICYmIGRlbGV0ZSBwYXJhbXMuaGVhZGVyc1sneC1jaS1zZWN1cml0eS10b2tlbiddO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQodHJ5VGltZXMgKyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnIsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBuZXh0KDEpO1xufSAvLyDlj5Hotbfor7fmsYJcblxuXG5mdW5jdGlvbiBfc3VibWl0UmVxdWVzdChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIFRhc2tJZCA9IHBhcmFtcy5UYXNrSWQ7XG4gIGlmIChUYXNrSWQgJiYgIXNlbGYuX2lzUnVubmluZ1Rhc2soVGFza0lkKSkgcmV0dXJuO1xuICB2YXIgYnVja2V0ID0gcGFyYW1zLkJ1Y2tldDtcbiAgdmFyIHJlZ2lvbiA9IHBhcmFtcy5SZWdpb247XG4gIHZhciBvYmplY3QgPSBwYXJhbXMuS2V5O1xuICB2YXIgbWV0aG9kID0gcGFyYW1zLm1ldGhvZCB8fCAnR0VUJztcbiAgdmFyIHVybCA9IHBhcmFtcy5VcmwgfHwgcGFyYW1zLnVybDtcbiAgdmFyIGJvZHkgPSBwYXJhbXMuYm9keTtcbiAgdmFyIHJhd0JvZHkgPSBwYXJhbXMucmF3Qm9keTsgLy8gdXJsXG5cbiAgaWYgKHNlbGYub3B0aW9ucy5Vc2VBY2NlbGVyYXRlKSB7XG4gICAgcmVnaW9uID0gJ2FjY2VsZXJhdGUnO1xuICB9XG5cbiAgdXJsID0gdXJsIHx8IGdldFVybCh7XG4gICAgRm9yY2VQYXRoU3R5bGU6IHNlbGYub3B0aW9ucy5Gb3JjZVBhdGhTdHlsZSxcbiAgICBwcm90b2NvbDogc2VsZi5vcHRpb25zLlByb3RvY29sLFxuICAgIGRvbWFpbjogc2VsZi5vcHRpb25zLkRvbWFpbixcbiAgICBidWNrZXQ6IGJ1Y2tldCxcbiAgICByZWdpb246IHJlZ2lvbixcbiAgICBvYmplY3Q6IG9iamVjdFxuICB9KTtcblxuICBpZiAocGFyYW1zLmFjdGlvbikge1xuICAgIHVybCA9IHVybCArICc/JyArIHBhcmFtcy5hY3Rpb247XG4gIH1cblxuICBpZiAocGFyYW1zLnFzU3RyKSB7XG4gICAgaWYgKHVybC5pbmRleE9mKCc/JykgPiAtMSkge1xuICAgICAgdXJsID0gdXJsICsgJyYnICsgcGFyYW1zLnFzU3RyO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cmwgPSB1cmwgKyAnPycgKyBwYXJhbXMucXNTdHI7XG4gICAgfVxuICB9XG5cbiAgdmFyIG9wdCA9IHtcbiAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICB1cmw6IHVybCxcbiAgICBoZWFkZXJzOiBwYXJhbXMuaGVhZGVycyxcbiAgICBxczogcGFyYW1zLnFzLFxuICAgIGJvZHk6IGJvZHlcbiAgfTsgLy8g5YW85a65Y2nmjqXlj6NcblxuICB2YXIgdG9rZW4gPSAneC1jb3Mtc2VjdXJpdHktdG9rZW4nO1xuXG4gIGlmICh1dGlsLmlzQ0lIb3N0KHVybCkpIHtcbiAgICB0b2tlbiA9ICd4LWNpLXNlY3VyaXR5LXRva2VuJztcbiAgfSAvLyDojrflj5bnrb7lkI1cblxuXG4gIG9wdC5oZWFkZXJzLkF1dGhvcml6YXRpb24gPSBwYXJhbXMuQXV0aERhdGEuQXV0aG9yaXphdGlvbjtcbiAgcGFyYW1zLkF1dGhEYXRhLlRva2VuICYmIChvcHQuaGVhZGVyc1sndG9rZW4nXSA9IHBhcmFtcy5BdXRoRGF0YS5Ub2tlbik7XG4gIHBhcmFtcy5BdXRoRGF0YS5DbGllbnRJUCAmJiAob3B0LmhlYWRlcnNbJ2NsaWVudElQJ10gPSBwYXJhbXMuQXV0aERhdGEuQ2xpZW50SVApO1xuICBwYXJhbXMuQXV0aERhdGEuQ2xpZW50VUEgJiYgKG9wdC5oZWFkZXJzWydjbGllbnRVQSddID0gcGFyYW1zLkF1dGhEYXRhLkNsaWVudFVBKTtcbiAgcGFyYW1zLkF1dGhEYXRhLlNlY3VyaXR5VG9rZW4gJiYgKG9wdC5oZWFkZXJzW3Rva2VuXSA9IHBhcmFtcy5BdXRoRGF0YS5TZWN1cml0eVRva2VuKTsgLy8g5riF55CGIHVuZGVmaW5lZCDlkowgbnVsbCDlrZfmrrVcblxuICBvcHQuaGVhZGVycyAmJiAob3B0LmhlYWRlcnMgPSB1dGlsLmNsZWFyS2V5KG9wdC5oZWFkZXJzKSk7XG4gIG9wdCA9IHV0aWwuY2xlYXJLZXkob3B0KTsgLy8gcHJvZ3Jlc3NcblxuICBpZiAocGFyYW1zLm9uUHJvZ3Jlc3MgJiYgdHlwZW9mIHBhcmFtcy5vblByb2dyZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGNvbnRlbnRMZW5ndGggPSBib2R5ICYmIChib2R5LnNpemUgfHwgYm9keS5sZW5ndGgpIHx8IDA7XG5cbiAgICBvcHQub25Qcm9ncmVzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoVGFza0lkICYmICFzZWxmLl9pc1J1bm5pbmdUYXNrKFRhc2tJZCkpIHJldHVybjtcbiAgICAgIHZhciBsb2FkZWQgPSBlID8gZS5sb2FkZWQgOiAwO1xuICAgICAgcGFyYW1zLm9uUHJvZ3Jlc3Moe1xuICAgICAgICBsb2FkZWQ6IGxvYWRlZCxcbiAgICAgICAgdG90YWw6IGNvbnRlbnRMZW5ndGhcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBpZiAocGFyYW1zLm9uRG93bmxvYWRQcm9ncmVzcykge1xuICAgIG9wdC5vbkRvd25sb2FkUHJvZ3Jlc3MgPSBwYXJhbXMub25Eb3dubG9hZFByb2dyZXNzO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5EYXRhVHlwZSkge1xuICAgIG9wdC5kYXRhVHlwZSA9IHBhcmFtcy5EYXRhVHlwZTtcbiAgfVxuXG4gIGlmICh0aGlzLm9wdGlvbnMuVGltZW91dCkge1xuICAgIG9wdC50aW1lb3V0ID0gdGhpcy5vcHRpb25zLlRpbWVvdXQ7XG4gIH1cblxuICBzZWxmLm9wdGlvbnMuRm9yY2VQYXRoU3R5bGUgJiYgKG9wdC5wYXRoU3R5bGUgPSBzZWxmLm9wdGlvbnMuRm9yY2VQYXRoU3R5bGUpO1xuICBzZWxmLmVtaXQoJ2JlZm9yZS1zZW5kJywgb3B0KTtcbiAgdmFyIHVzZUFjY2VsZXJhdGUgPSBvcHQudXJsLmluY2x1ZGVzKCdhY2NlbGVyYXRlLicpO1xuICB2YXIgcXVlcnlTdHJpbmcgPSBPYmplY3Qua2V5cyhvcHQucXMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KGtleSwgXCI9XCIpLmNvbmNhdChvcHQucXNba2V5XSk7XG4gIH0pLmpvaW4oJyYnKTtcbiAgdmFyIGZ1bGxVcmwgPSBxdWVyeVN0cmluZyA/IG9wdC51cmwgKyAnPycgKyBxdWVyeVN0cmluZyA6IG9wdC51cmw7XG4gIHBhcmFtcy50cmFja2VyICYmIHBhcmFtcy50cmFja2VyLnNldFBhcmFtcyh7XG4gICAgcmVxVXJsOiBmdWxsVXJsLFxuICAgIGFjY2VsZXJhdGU6IHVzZUFjY2VsZXJhdGUgPyAnWScgOiAnTidcbiAgfSk7IC8vIOWIhuWdl+S4iuS8oOaXtue7meeItue6p3RyYWNrZXLorr7nva51cmzkv6Hmga9cblxuICBwYXJhbXMudHJhY2tlciAmJiBwYXJhbXMudHJhY2tlci5wYXJlbnQgJiYgcGFyYW1zLnRyYWNrZXIucGFyZW50LnNldFBhcmFtcyh7XG4gICAgcmVxVXJsOiBmdWxsVXJsLFxuICAgIGFjY2VsZXJhdGU6IHVzZUFjY2VsZXJhdGUgPyAnWScgOiAnTidcbiAgfSk7XG4gIHZhciBzZW5kZXIgPSAoc2VsZi5vcHRpb25zLlJlcXVlc3QgfHwgUkVRVUVTVCkob3B0LCBmdW5jdGlvbiAocikge1xuICAgIGlmIChyLmVycm9yID09PSAnYWJvcnQnKSByZXR1cm47XG4gICAgdmFyIHJlY2VpdmUgPSB7XG4gICAgICBvcHRpb25zOiBvcHQsXG4gICAgICBlcnJvcjogZXJyLFxuICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSB8fCAwLFxuICAgICAgaGVhZGVyczogcmVzcG9uc2UgJiYgcmVzcG9uc2UuaGVhZGVycyB8fCB7fSxcbiAgICAgIGJvZHk6IGJvZHlcbiAgICB9O1xuICAgIHNlbGYuZW1pdCgnYWZ0ZXItcmVjZWl2ZScsIHJlY2VpdmUpO1xuICAgIGVyciA9IHJlY2VpdmUuZXJyb3I7XG4gICAgYm9keSA9IHJlY2VpdmUuYm9keTtcbiAgICByZXNwb25zZSA9IHtcbiAgICAgIHN0YXR1c0NvZGU6IHJlY2VpdmUuc3RhdHVzQ29kZSxcbiAgICAgIGhlYWRlcnM6IHJlY2VpdmUuaGVhZGVyc1xuICAgIH07IC8vIOaKm+WHuuS6i+S7tu+8jOWFgeiuuOS/ruaUuei/lOWbnuWAvOeahCBlcnJvcuOAgXN0YXR1c0NvZGXjgIFzdGF0dXNNZXNzYWdl44CBYm9keVxuXG4gICAgc2VsZi5lbWl0KCdhZnRlci1yZWNlaXZlJywgcik7XG4gICAgdmFyIHJlc3BvbnNlID0ge1xuICAgICAgc3RhdHVzQ29kZTogci5zdGF0dXNDb2RlLFxuICAgICAgc3RhdHVzTWVzc2FnZTogci5zdGF0dXNNZXNzYWdlLFxuICAgICAgaGVhZGVyczogci5oZWFkZXJzXG4gICAgfTtcbiAgICB2YXIgZXJyID0gci5lcnJvcjtcbiAgICB2YXIgYm9keSA9IHIuYm9keTsgLy8g6L+U5Zue5YaF5a655re75YqgIOeKtuaAgeeggSDlkowgaGVhZGVyc1xuXG4gICAgdmFyIGhhc1JldHVybmVkO1xuXG4gICAgdmFyIGNiID0gZnVuY3Rpb24gY2IoZXJyLCBkYXRhKSB7XG4gICAgICBUYXNrSWQgJiYgc2VsZi5vZmYoJ2lubmVyLWtpbGwtdGFzaycsIGtpbGxUYXNrKTtcbiAgICAgIGlmIChoYXNSZXR1cm5lZCkgcmV0dXJuO1xuICAgICAgaGFzUmV0dXJuZWQgPSB0cnVlO1xuICAgICAgdmFyIGF0dHJzID0ge307XG4gICAgICByZXNwb25zZSAmJiByZXNwb25zZS5zdGF0dXNDb2RlICYmIChhdHRycy5zdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzQ29kZSk7XG4gICAgICByZXNwb25zZSAmJiByZXNwb25zZS5oZWFkZXJzICYmIChhdHRycy5oZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycyk7XG5cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZXJyID0gdXRpbC5leHRlbmQoZXJyIHx8IHt9LCBhdHRycyk7XG4gICAgICAgIGNhbGxiYWNrKGVyciwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhID0gdXRpbC5leHRlbmQoZGF0YSB8fCB7fSwgYXR0cnMpO1xuICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICAgIH1cblxuICAgICAgc2VuZGVyID0gbnVsbDtcbiAgICB9OyAvLyDor7fmsYLplJnor6/vvIzlj5HnlJ/nvZHnu5zplJnor69cblxuXG4gICAgaWYgKGVycikgcmV0dXJuIGNiKHV0aWwuZXJyb3IoZXJyKSk7IC8vIOivt+axgui/lOWbnueggeS4jeS4uiAyMDBcblxuICAgIHZhciBzdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzQ29kZTtcbiAgICB2YXIgc3RhdHVzU3VjY2VzcyA9IE1hdGguZmxvb3Ioc3RhdHVzQ29kZSAvIDEwMCkgPT09IDI7IC8vIDIwMCAyMDIgMjA0IDIwNlxuICAgIC8vIOS4jeWvuSBib2R5IOi/m+ihjOi9rOaNou+8jGJvZHkg55u05o6l5oyC6L296L+U5ZueXG5cbiAgICBpZiAocmF3Qm9keSAmJiBzdGF0dXNTdWNjZXNzKSByZXR1cm4gY2IobnVsbCwge1xuICAgICAgYm9keTogYm9keVxuICAgIH0pOyAvLyDop6PmnpAgeG1sIGJvZHlcblxuICAgIHZhciBqc29uO1xuXG4gICAgdHJ5IHtcbiAgICAgIGpzb24gPSBib2R5ICYmIGJvZHkuaW5kZXhPZignPCcpID4gLTEgJiYgYm9keS5pbmRleE9mKCc+JykgPiAtMSAmJiB1dGlsLnhtbDJqc29uKGJvZHkpIHx8IHt9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGpzb24gPSB7fTtcbiAgICB9IC8vIOWkhOeQhui/lOWbnuWAvFxuXG5cbiAgICB2YXIgeG1sRXJyb3IgPSBqc29uICYmIGpzb24uRXJyb3I7XG5cbiAgICBpZiAoc3RhdHVzU3VjY2Vzcykge1xuICAgICAgLy8g5q2j56Gu6L+U5Zue77yM54q25oCB56CBIDJ4eCDml7bvvIxib2R5IOS4jeS8muaciSBFcnJvclxuICAgICAgY2IobnVsbCwganNvbik7XG4gICAgfSBlbHNlIGlmICh4bWxFcnJvcikge1xuICAgICAgLy8g5q2j5bi46L+U5Zue5LqGIHhtbCBib2R577yM5LiU5pyJIEVycm9yIOiKgueCuVxuICAgICAgY2IodXRpbC5lcnJvcihuZXcgRXJyb3IoeG1sRXJyb3IuTWVzc2FnZSksIHtcbiAgICAgICAgY29kZTogeG1sRXJyb3IuQ29kZSxcbiAgICAgICAgZXJyb3I6IHhtbEVycm9yXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIGlmIChzdGF0dXNDb2RlKSB7XG4gICAgICAvLyDmnInplJnor6/nmoTnirbmgIHnoIFcbiAgICAgIGNiKHV0aWwuZXJyb3IobmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1c01lc3NhZ2UpLCB7XG4gICAgICAgIGNvZGU6ICcnICsgc3RhdHVzQ29kZVxuICAgICAgfSkpO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzQ29kZSkge1xuICAgICAgLy8g5peg54q25oCB56CB77yM5oiW6ICF6I635Y+W5LiN5Yiw54q25oCB56CBXG4gICAgICBjYih1dGlsLmVycm9yKG5ldyBFcnJvcignc3RhdHVzQ29kZSBlcnJvcicpKSk7XG4gICAgfVxuICB9KTsgLy8ga2lsbCB0YXNrXG5cbiAgdmFyIGtpbGxUYXNrID0gZnVuY3Rpb24ga2lsbFRhc2soZGF0YSkge1xuICAgIGlmIChkYXRhLlRhc2tJZCA9PT0gVGFza0lkKSB7XG4gICAgICBzZW5kZXIgJiYgc2VuZGVyLmFib3J0ICYmIHNlbmRlci5hYm9ydCgpO1xuICAgICAgc2VsZi5vZmYoJ2lubmVyLWtpbGwtdGFzaycsIGtpbGxUYXNrKTtcbiAgICB9XG4gIH07XG5cbiAgVGFza0lkICYmIHNlbGYub24oJ2lubmVyLWtpbGwtdGFzaycsIGtpbGxUYXNrKTtcbn1cblxudmFyIEFQSV9NQVAgPSB7XG4gIC8vIEJ1Y2tldCDnm7jlhbPmlrnms5VcbiAgZ2V0U2VydmljZTogZ2V0U2VydmljZSxcbiAgLy8gQnVja2V0XG4gIHB1dEJ1Y2tldDogcHV0QnVja2V0LFxuICBoZWFkQnVja2V0OiBoZWFkQnVja2V0LFxuICAvLyBCdWNrZXRcbiAgZ2V0QnVja2V0OiBnZXRCdWNrZXQsXG4gIGRlbGV0ZUJ1Y2tldDogZGVsZXRlQnVja2V0LFxuICBwdXRCdWNrZXRBY2w6IHB1dEJ1Y2tldEFjbCxcbiAgLy8gQnVja2V0QUNMXG4gIGdldEJ1Y2tldEFjbDogZ2V0QnVja2V0QWNsLFxuICBwdXRCdWNrZXRDb3JzOiBwdXRCdWNrZXRDb3JzLFxuICAvLyBCdWNrZXRDb3JzXG4gIGdldEJ1Y2tldENvcnM6IGdldEJ1Y2tldENvcnMsXG4gIGRlbGV0ZUJ1Y2tldENvcnM6IGRlbGV0ZUJ1Y2tldENvcnMsXG4gIGdldEJ1Y2tldExvY2F0aW9uOiBnZXRCdWNrZXRMb2NhdGlvbixcbiAgLy8gQnVja2V0TG9jYXRpb25cbiAgZ2V0QnVja2V0UG9saWN5OiBnZXRCdWNrZXRQb2xpY3ksXG4gIC8vIEJ1Y2tldFBvbGljeVxuICBwdXRCdWNrZXRQb2xpY3k6IHB1dEJ1Y2tldFBvbGljeSxcbiAgZGVsZXRlQnVja2V0UG9saWN5OiBkZWxldGVCdWNrZXRQb2xpY3ksXG4gIHB1dEJ1Y2tldFRhZ2dpbmc6IHB1dEJ1Y2tldFRhZ2dpbmcsXG4gIC8vIEJ1Y2tldFRhZ2dpbmdcbiAgZ2V0QnVja2V0VGFnZ2luZzogZ2V0QnVja2V0VGFnZ2luZyxcbiAgZGVsZXRlQnVja2V0VGFnZ2luZzogZGVsZXRlQnVja2V0VGFnZ2luZyxcbiAgcHV0QnVja2V0TGlmZWN5Y2xlOiBwdXRCdWNrZXRMaWZlY3ljbGUsXG4gIC8vIEJ1Y2tldExpZmVjeWNsZVxuICBnZXRCdWNrZXRMaWZlY3ljbGU6IGdldEJ1Y2tldExpZmVjeWNsZSxcbiAgZGVsZXRlQnVja2V0TGlmZWN5Y2xlOiBkZWxldGVCdWNrZXRMaWZlY3ljbGUsXG4gIHB1dEJ1Y2tldFZlcnNpb25pbmc6IHB1dEJ1Y2tldFZlcnNpb25pbmcsXG4gIC8vIEJ1Y2tldFZlcnNpb25pbmdcbiAgZ2V0QnVja2V0VmVyc2lvbmluZzogZ2V0QnVja2V0VmVyc2lvbmluZyxcbiAgcHV0QnVja2V0UmVwbGljYXRpb246IHB1dEJ1Y2tldFJlcGxpY2F0aW9uLFxuICAvLyBCdWNrZXRSZXBsaWNhdGlvblxuICBnZXRCdWNrZXRSZXBsaWNhdGlvbjogZ2V0QnVja2V0UmVwbGljYXRpb24sXG4gIGRlbGV0ZUJ1Y2tldFJlcGxpY2F0aW9uOiBkZWxldGVCdWNrZXRSZXBsaWNhdGlvbixcbiAgcHV0QnVja2V0V2Vic2l0ZTogcHV0QnVja2V0V2Vic2l0ZSxcbiAgLy8gQnVja2V0V2Vic2l0ZVxuICBnZXRCdWNrZXRXZWJzaXRlOiBnZXRCdWNrZXRXZWJzaXRlLFxuICBkZWxldGVCdWNrZXRXZWJzaXRlOiBkZWxldGVCdWNrZXRXZWJzaXRlLFxuICBwdXRCdWNrZXRSZWZlcmVyOiBwdXRCdWNrZXRSZWZlcmVyLFxuICAvLyBCdWNrZXRSZWZlcmVyXG4gIGdldEJ1Y2tldFJlZmVyZXI6IGdldEJ1Y2tldFJlZmVyZXIsXG4gIHB1dEJ1Y2tldERvbWFpbjogcHV0QnVja2V0RG9tYWluLFxuICAvLyBCdWNrZXREb21haW5cbiAgZ2V0QnVja2V0RG9tYWluOiBnZXRCdWNrZXREb21haW4sXG4gIGRlbGV0ZUJ1Y2tldERvbWFpbjogZGVsZXRlQnVja2V0RG9tYWluLFxuICBwdXRCdWNrZXRPcmlnaW46IHB1dEJ1Y2tldE9yaWdpbixcbiAgLy8gQnVja2V0T3JpZ2luXG4gIGdldEJ1Y2tldE9yaWdpbjogZ2V0QnVja2V0T3JpZ2luLFxuICBkZWxldGVCdWNrZXRPcmlnaW46IGRlbGV0ZUJ1Y2tldE9yaWdpbixcbiAgcHV0QnVja2V0TG9nZ2luZzogcHV0QnVja2V0TG9nZ2luZyxcbiAgLy8gQnVja2V0TG9nZ2luZ1xuICBnZXRCdWNrZXRMb2dnaW5nOiBnZXRCdWNrZXRMb2dnaW5nLFxuICBwdXRCdWNrZXRJbnZlbnRvcnk6IHB1dEJ1Y2tldEludmVudG9yeSxcbiAgLy8gQnVja2V0SW52ZW50b3J5XG4gIGdldEJ1Y2tldEludmVudG9yeTogZ2V0QnVja2V0SW52ZW50b3J5LFxuICBsaXN0QnVja2V0SW52ZW50b3J5OiBsaXN0QnVja2V0SW52ZW50b3J5LFxuICBkZWxldGVCdWNrZXRJbnZlbnRvcnk6IGRlbGV0ZUJ1Y2tldEludmVudG9yeSxcbiAgcHV0QnVja2V0QWNjZWxlcmF0ZTogcHV0QnVja2V0QWNjZWxlcmF0ZSxcbiAgZ2V0QnVja2V0QWNjZWxlcmF0ZTogZ2V0QnVja2V0QWNjZWxlcmF0ZSxcbiAgcHV0QnVja2V0RW5jcnlwdGlvbjogcHV0QnVja2V0RW5jcnlwdGlvbixcbiAgZ2V0QnVja2V0RW5jcnlwdGlvbjogZ2V0QnVja2V0RW5jcnlwdGlvbixcbiAgZGVsZXRlQnVja2V0RW5jcnlwdGlvbjogZGVsZXRlQnVja2V0RW5jcnlwdGlvbixcbiAgLy8gT2JqZWN0IOebuOWFs+aWueazlVxuICBnZXRPYmplY3Q6IGdldE9iamVjdCxcbiAgaGVhZE9iamVjdDogaGVhZE9iamVjdCxcbiAgbGlzdE9iamVjdFZlcnNpb25zOiBsaXN0T2JqZWN0VmVyc2lvbnMsXG4gIHB1dE9iamVjdDogcHV0T2JqZWN0LFxuICBkZWxldGVPYmplY3Q6IGRlbGV0ZU9iamVjdCxcbiAgZ2V0T2JqZWN0QWNsOiBnZXRPYmplY3RBY2wsXG4gIHB1dE9iamVjdEFjbDogcHV0T2JqZWN0QWNsLFxuICBvcHRpb25zT2JqZWN0OiBvcHRpb25zT2JqZWN0LFxuICBwdXRPYmplY3RDb3B5OiBwdXRPYmplY3RDb3B5LFxuICBkZWxldGVNdWx0aXBsZU9iamVjdDogZGVsZXRlTXVsdGlwbGVPYmplY3QsXG4gIHJlc3RvcmVPYmplY3Q6IHJlc3RvcmVPYmplY3QsXG4gIHB1dE9iamVjdFRhZ2dpbmc6IHB1dE9iamVjdFRhZ2dpbmcsXG4gIGdldE9iamVjdFRhZ2dpbmc6IGdldE9iamVjdFRhZ2dpbmcsXG4gIGRlbGV0ZU9iamVjdFRhZ2dpbmc6IGRlbGV0ZU9iamVjdFRhZ2dpbmcsXG4gIHNlbGVjdE9iamVjdENvbnRlbnQ6IHNlbGVjdE9iamVjdENvbnRlbnQsXG4gIGFwcGVuZE9iamVjdDogYXBwZW5kT2JqZWN0LFxuICAvLyDliIblnZfkuIrkvKDnm7jlhbPmlrnms5VcbiAgdXBsb2FkUGFydENvcHk6IHVwbG9hZFBhcnRDb3B5LFxuICBtdWx0aXBhcnRJbml0OiBtdWx0aXBhcnRJbml0LFxuICBtdWx0aXBhcnRVcGxvYWQ6IG11bHRpcGFydFVwbG9hZCxcbiAgbXVsdGlwYXJ0Q29tcGxldGU6IG11bHRpcGFydENvbXBsZXRlLFxuICBtdWx0aXBhcnRMaXN0OiBtdWx0aXBhcnRMaXN0LFxuICBtdWx0aXBhcnRMaXN0UGFydDogbXVsdGlwYXJ0TGlzdFBhcnQsXG4gIG11bHRpcGFydEFib3J0OiBtdWx0aXBhcnRBYm9ydCxcbiAgLy8g5bel5YW35pa55rOVXG4gIHJlcXVlc3Q6IHJlcXVlc3QsXG4gIGdldE9iamVjdFVybDogZ2V0T2JqZWN0VXJsLFxuICBnZXRBdXRoOiBnZXRBdXRoXG59O1xuXG5mdW5jdGlvbiB3YXJuT2xkQXBpKGFwaU5hbWUsIGZuLCBwcm90bykge1xuICB1dGlsLmVhY2goWydDb3JzJywgJ0FjbCddLCBmdW5jdGlvbiAoc3VmZml4KSB7XG4gICAgaWYgKGFwaU5hbWUuc2xpY2UoLXN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXgpIHtcbiAgICAgIHZhciBvbGROYW1lID0gYXBpTmFtZS5zbGljZSgwLCAtc3VmZml4Lmxlbmd0aCkgKyBzdWZmaXgudG9VcHBlckNhc2UoKTtcbiAgICAgIHZhciBhcGlGbiA9IHV0aWwuYXBpV3JhcHBlcihhcGlOYW1lLCBmbik7XG4gICAgICB2YXIgd2FybmVkID0gZmFsc2U7XG5cbiAgICAgIHByb3RvW29sZE5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAhd2FybmVkICYmIGNvbnNvbGUud2Fybignd2FybmluZzogY29zLicgKyBvbGROYW1lICsgJyBoYXMgYmVlbiBkZXByZWNhdGVkLiBQbGVhc2UgVXNlIGNvcy4nICsgYXBpTmFtZSArICcgaW5zdGVhZC4nKTtcbiAgICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICAgICAgYXBpRm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMuaW5pdCA9IGZ1bmN0aW9uIChDT1MsIHRhc2spIHtcbiAgdGFzay50cmFuc2ZlclRvVGFza01ldGhvZChBUElfTUFQLCAncHV0T2JqZWN0Jyk7XG4gIHV0aWwuZWFjaChBUElfTUFQLCBmdW5jdGlvbiAoZm4sIGFwaU5hbWUpIHtcbiAgICBDT1MucHJvdG90eXBlW2FwaU5hbWVdID0gdXRpbC5hcGlXcmFwcGVyKGFwaU5hbWUsIGZuKTtcbiAgICB3YXJuT2xkQXBpKGFwaU5hbWUsIGZuLCBDT1MucHJvdG90eXBlKTtcbiAgfSk7XG59OyIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxudmFyIGV2ZW50ID0gcmVxdWlyZSgnLi9ldmVudCcpO1xuXG52YXIgdGFzayA9IHJlcXVpcmUoJy4vdGFzaycpO1xuXG52YXIgYmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuXG52YXIgYWR2YW5jZSA9IHJlcXVpcmUoJy4vYWR2YW5jZScpO1xuXG52YXIgcGtnID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJyk7XG5cbnZhciBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgQXBwSWQ6ICcnLFxuICAvLyBBcHBJZCDlt7Llup/lvIPvvIzor7fmi7zmjqXliLAgQnVja2V0IOWQjuS8oOWFpe+8jOS+i+Wmgu+8mnRlc3QtMTI1MDAwMDAwMFxuICBTZWNyZXRJZDogJycsXG4gIFNlY3JldEtleTogJycsXG4gIFNlY3VyaXR5VG9rZW46ICcnLFxuICAvLyDkvb/nlKjkuLTml7blr4bpkqXpnIDopoHms6jmhI/oh6rooYzliLfmlrAgVG9rZW5cbiAgQ2h1bmtSZXRyeVRpbWVzOiAyLFxuICBGaWxlUGFyYWxsZWxMaW1pdDogMyxcbiAgQ2h1bmtQYXJhbGxlbExpbWl0OiAzLFxuICBDaHVua1NpemU6IDEwMjQgKiAxMDI0LFxuICBTbGljZVNpemU6IDEwMjQgKiAxMDI0LFxuICBDb3B5Q2h1bmtQYXJhbGxlbExpbWl0OiAyMCxcbiAgQ29weUNodW5rU2l6ZTogMTAyNCAqIDEwMjQgKiAxMCxcbiAgQ29weVNsaWNlU2l6ZTogMTAyNCAqIDEwMjQgKiAxMCxcbiAgTWF4UGFydE51bWJlcjogMTAwMDAsXG4gIFByb2dyZXNzSW50ZXJ2YWw6IDEwMDAsXG4gIERvbWFpbjogJycsXG4gIFNlcnZpY2VEb21haW46ICcnLFxuICBQcm90b2NvbDogJycsXG4gIENvbXBhdGliaWxpdHlNb2RlOiBmYWxzZSxcbiAgRm9yY2VQYXRoU3R5bGU6IGZhbHNlLFxuICBVc2VSYXdLZXk6IGZhbHNlLFxuICBUaW1lb3V0OiAwLFxuICAvLyDljZXkvY3mr6vnp5LvvIwwIOS7o+ihqOS4jeiuvue9rui2heaXtuaXtumXtFxuICBDb3JyZWN0Q2xvY2tTa2V3OiB0cnVlLFxuICBTeXN0ZW1DbG9ja09mZnNldDogMCxcbiAgLy8g5Y2V5L2N5q+r56eS77yMbXNcbiAgVXBsb2FkQ2hlY2tDb250ZW50TWQ1OiBmYWxzZSxcbiAgVXBsb2FkUXVldWVTaXplOiAxMDAwMCxcbiAgVXBsb2FkQWRkTWV0YU1kNTogZmFsc2UsXG4gIFVwbG9hZElkQ2FjaGVMaW1pdDogNTAsXG4gIFVzZUFjY2VsZXJhdGU6IGZhbHNlLFxuICBGb3JjZVNpZ25Ib3N0OiB0cnVlLFxuICAvLyDpu5jorqTlsIZob3N05Yqg5YWl562+5ZCN6K6h566X77yM5YWz6Zet5ZCO5Y+v6IO95a+86Ie06LaK5p2D6aOO6Zmp77yM5bu66K6u5L+d5oyB5Li6dHJ1ZVxuICBFbmFibGVUcmFja2VyOiBmYWxzZSxcbiAgLy8g6buY6K6k5YWz6Zet5LiK5oqlXG4gIERlZXBUcmFja2VyOiBmYWxzZSxcbiAgLy8g5LiK5oql5pe25piv5ZCm5a+55q+P5Liq5YiG5Z2X5LiK5Lyg5YGa5Y2V54us5LiK5oqlXG4gIFRyYWNrZXJEZWxheTogNTAwMCxcbiAgLy8g5ZGo5pyf5oCn5LiK5oql77yM5Y2V5L2N5q+r56eS44CCMOS7o+ihqOWunuaXtuS4iuaKpVxuICBDdXN0b21JZDogJycgLy8g6Ieq5a6a5LmJ5LiK5oqlaWRcblxufTsgLy8g5a+55aSW5pq06Zyy55qE57G7XG5cbnZhciBDT1MgPSBmdW5jdGlvbiBDT1Mob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSB1dGlsLmV4dGVuZCh1dGlsLmNsb25lKGRlZmF1bHRPcHRpb25zKSwgb3B0aW9ucyB8fCB7fSk7XG4gIHRoaXMub3B0aW9ucy5GaWxlUGFyYWxsZWxMaW1pdCA9IE1hdGgubWF4KDEsIHRoaXMub3B0aW9ucy5GaWxlUGFyYWxsZWxMaW1pdCk7XG4gIHRoaXMub3B0aW9ucy5DaHVua1BhcmFsbGVsTGltaXQgPSBNYXRoLm1heCgxLCB0aGlzLm9wdGlvbnMuQ2h1bmtQYXJhbGxlbExpbWl0KTtcbiAgdGhpcy5vcHRpb25zLkNodW5rUmV0cnlUaW1lcyA9IE1hdGgubWF4KDAsIHRoaXMub3B0aW9ucy5DaHVua1JldHJ5VGltZXMpO1xuICB0aGlzLm9wdGlvbnMuQ2h1bmtTaXplID0gTWF0aC5tYXgoMTAyNCAqIDEwMjQsIHRoaXMub3B0aW9ucy5DaHVua1NpemUpO1xuICB0aGlzLm9wdGlvbnMuQ29weUNodW5rUGFyYWxsZWxMaW1pdCA9IE1hdGgubWF4KDEsIHRoaXMub3B0aW9ucy5Db3B5Q2h1bmtQYXJhbGxlbExpbWl0KTtcbiAgdGhpcy5vcHRpb25zLkNvcHlDaHVua1NpemUgPSBNYXRoLm1heCgxMDI0ICogMTAyNCwgdGhpcy5vcHRpb25zLkNvcHlDaHVua1NpemUpO1xuICB0aGlzLm9wdGlvbnMuQ29weVNsaWNlU2l6ZSA9IE1hdGgubWF4KDAsIHRoaXMub3B0aW9ucy5Db3B5U2xpY2VTaXplKTtcbiAgdGhpcy5vcHRpb25zLk1heFBhcnROdW1iZXIgPSBNYXRoLm1heCgxMDI0LCBNYXRoLm1pbigxMDAwMCwgdGhpcy5vcHRpb25zLk1heFBhcnROdW1iZXIpKTtcbiAgdGhpcy5vcHRpb25zLlRpbWVvdXQgPSBNYXRoLm1heCgwLCB0aGlzLm9wdGlvbnMuVGltZW91dCk7XG5cbiAgaWYgKHRoaXMub3B0aW9ucy5BcHBJZCkge1xuICAgIGNvbnNvbGUud2Fybignd2FybmluZzogQXBwSWQgaGFzIGJlZW4gZGVwcmVjYXRlZCwgUGxlYXNlIHB1dCBpdCBhdCB0aGUgZW5kIG9mIHBhcmFtZXRlciBCdWNrZXQoRS5nOiBcInRlc3QtMTI1MDAwMDAwMFwiKS4nKTtcbiAgfVxuXG4gIGlmICh0aGlzLm9wdGlvbnMuU2VjcmV0SWQgJiYgdGhpcy5vcHRpb25zLlNlY3JldElkLmluZGV4T2YoJyAnKSA+IC0xKSB7XG4gICAgY29uc29sZS5lcnJvcignZXJyb3I6IFNlY3JldElk5qC85byP6ZSZ6K+v77yM6K+35qOA5p+lJyk7XG4gICAgY29uc29sZS5lcnJvcignZXJyb3I6IFNlY3JldElkIGZvcm1hdCBpcyBpbmNvcnJlY3QuIFBsZWFzZSBjaGVjaycpO1xuICB9XG5cbiAgaWYgKHRoaXMub3B0aW9ucy5TZWNyZXRLZXkgJiYgdGhpcy5vcHRpb25zLlNlY3JldEtleS5pbmRleE9mKCcgJykgPiAtMSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yOiBTZWNyZXRLZXnmoLzlvI/plJnor6/vvIzor7fmo4Dmn6UnKTtcbiAgICBjb25zb2xlLmVycm9yKCdlcnJvcjogU2VjcmV0S2V5IGZvcm1hdCBpcyBpbmNvcnJlY3QuIFBsZWFzZSBjaGVjaycpO1xuICB9XG5cbiAgaWYgKHV0aWwuaXNOb2RlKCkpIHtcbiAgICBjb25zb2xlLndhcm4oJ3dhcm5pbmc6IGNvcy1qcy1zZGstdjUg5LiN5pSv5oyBIG5vZGVqcyDnjq/looPkvb/nlKjvvIzor7fmlLnnlKggY29zLW5vZGVqcy1zZGstdjXvvIzlj4LogIPmlofmoaPvvJogaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi84NjI5Jyk7XG4gICAgY29uc29sZS53YXJuKCd3YXJuaW5nOiBjb3MtanMtc2RrLXY1IGRvZXMgbm90IHN1cHBvcnQgbm9kZWpzIGVudmlyb25tZW50LiBQbGVhc2UgdXNlIGNvcy1ub2RlanMtc2RrLXY1IGluc3RlYWQuIFNlZTogaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi84NjI5Jyk7XG4gIH1cblxuICBldmVudC5pbml0KHRoaXMpO1xuICB0YXNrLmluaXQodGhpcyk7XG59O1xuXG5iYXNlLmluaXQoQ09TLCB0YXNrKTtcbmFkdmFuY2UuaW5pdChDT1MsIHRhc2spO1xuQ09TLnV0aWwgPSB7XG4gIG1kNTogdXRpbC5tZDUsXG4gIHhtbDJqc29uOiB1dGlsLnhtbDJqc29uLFxuICBqc29uMnhtbDogdXRpbC5qc29uMnhtbFxufTtcbkNPUy5nZXRBdXRob3JpemF0aW9uID0gdXRpbC5nZXRBdXRoO1xuQ09TLnZlcnNpb24gPSBwa2cudmVyc2lvbjtcbm1vZHVsZS5leHBvcnRzID0gQ09TOyIsInZhciBpbml0RXZlbnQgPSBmdW5jdGlvbiBpbml0RXZlbnQoY29zKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSB7fTtcblxuICB2YXIgZ2V0TGlzdCA9IGZ1bmN0aW9uIGdldExpc3QoYWN0aW9uKSB7XG4gICAgIWxpc3RlbmVyc1thY3Rpb25dICYmIChsaXN0ZW5lcnNbYWN0aW9uXSA9IFtdKTtcbiAgICByZXR1cm4gbGlzdGVuZXJzW2FjdGlvbl07XG4gIH07XG5cbiAgY29zLm9uID0gZnVuY3Rpb24gKGFjdGlvbiwgY2FsbGJhY2spIHtcbiAgICBpZiAoYWN0aW9uID09PSAndGFzay1saXN0LXVwZGF0ZScpIHtcbiAgICAgIGNvbnNvbGUud2Fybignd2FybmluZzogRXZlbnQgXCInICsgYWN0aW9uICsgJ1wiIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXCJsaXN0LXVwZGF0ZVwiIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgZ2V0TGlzdChhY3Rpb24pLnB1c2goY2FsbGJhY2spO1xuICB9O1xuXG4gIGNvcy5vZmYgPSBmdW5jdGlvbiAoYWN0aW9uLCBjYWxsYmFjaykge1xuICAgIHZhciBsaXN0ID0gZ2V0TGlzdChhY3Rpb24pO1xuXG4gICAgZm9yICh2YXIgaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNhbGxiYWNrID09PSBsaXN0W2ldICYmIGxpc3Quc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfTtcblxuICBjb3MuZW1pdCA9IGZ1bmN0aW9uIChhY3Rpb24sIGRhdGEpIHtcbiAgICB2YXIgbGlzdCA9IGdldExpc3QoYWN0aW9uKS5tYXAoZnVuY3Rpb24gKGNiKSB7XG4gICAgICByZXR1cm4gY2I7XG4gICAgfSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxpc3RbaV0oZGF0YSk7XG4gICAgfVxuICB9O1xufTtcblxudmFyIEV2ZW50UHJveHkgPSBmdW5jdGlvbiBFdmVudFByb3h5KCkge1xuICBpbml0RXZlbnQodGhpcyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5pbml0ID0gaW5pdEV2ZW50O1xubW9kdWxlLmV4cG9ydHMuRXZlbnRQcm94eSA9IEV2ZW50UHJveHk7IiwidmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTsgLy8g5oyJ54Wn5paH5Lu254m55b6B5YC877yM57yT5a2YIFVwbG9hZElkXG5cblxudmFyIGNhY2hlS2V5ID0gJ2Nvc19zZGtfdXBsb2FkX2NhY2hlJztcbnZhciBleHBpcmVzID0gMzAgKiAyNCAqIDM2MDA7XG52YXIgY2FjaGU7XG52YXIgdGltZXI7XG5cbnZhciBnZXRDYWNoZSA9IGZ1bmN0aW9uIGdldENhY2hlKCkge1xuICB0cnkge1xuICAgIHZhciB2YWwgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGNhY2hlS2V5KSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgaWYgKCF2YWwpIHZhbCA9IFtdO1xuICBjYWNoZSA9IHZhbDtcbn07XG5cbnZhciBzZXRDYWNoZSA9IGZ1bmN0aW9uIHNldENhY2hlKCkge1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGNhY2hlS2V5LCBKU09OLnN0cmluZ2lmeShjYWNoZSkpO1xuICB9IGNhdGNoIChlKSB7fVxufTtcblxudmFyIGluaXQgPSBmdW5jdGlvbiBpbml0KCkge1xuICBpZiAoY2FjaGUpIHJldHVybjtcbiAgZ2V0Q2FjaGUuY2FsbCh0aGlzKTsgLy8g5riF55CG5aSq6ICB5pen55qE5pWw5o2uXG5cbiAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgdmFyIG5vdyA9IE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG4gIGZvciAodmFyIGkgPSBjYWNoZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBtdGltZSA9IGNhY2hlW2ldWzJdO1xuXG4gICAgaWYgKCFtdGltZSB8fCBtdGltZSArIGV4cGlyZXMgPCBub3cpIHtcbiAgICAgIGNhY2hlLnNwbGljZShpLCAxKTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZWQgJiYgc2V0Q2FjaGUoKTtcbn07IC8vIOaKiue8k+WtmOWtmOWIsOacrOWcsFxuXG5cbnZhciBzYXZlID0gZnVuY3Rpb24gc2F2ZSgpIHtcbiAgaWYgKHRpbWVyKSByZXR1cm47XG4gIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgc2V0Q2FjaGUoKTtcbiAgICB0aW1lciA9IG51bGw7XG4gIH0sIDQwMCk7XG59O1xuXG52YXIgbW9kID0ge1xuICB1c2luZzoge30sXG4gIC8vIOagh+iusCBVcGxvYWRJZCDmraPlnKjkvb/nlKhcbiAgc2V0VXNpbmc6IGZ1bmN0aW9uIHNldFVzaW5nKHV1aWQpIHtcbiAgICBtb2QudXNpbmdbdXVpZF0gPSB0cnVlO1xuICB9LFxuICAvLyDmoIforrAgVXBsb2FkSWQg5bey57uP5rKh5Zyo5L2/55SoXG4gIHJlbW92ZVVzaW5nOiBmdW5jdGlvbiByZW1vdmVVc2luZyh1dWlkKSB7XG4gICAgZGVsZXRlIG1vZC51c2luZ1t1dWlkXTtcbiAgfSxcbiAgLy8g55So5LiK5Lyg5Y+C5pWw55Sf5oiQ5ZOI5biM5YC8XG4gIGdldEZpbGVJZDogZnVuY3Rpb24gZ2V0RmlsZUlkKGZpbGUsIENodW5rU2l6ZSwgQnVja2V0LCBLZXkpIHtcbiAgICBpZiAoZmlsZS5uYW1lICYmIGZpbGUuc2l6ZSAmJiBmaWxlLmxhc3RNb2RpZmllZERhdGUgJiYgQ2h1bmtTaXplKSB7XG4gICAgICByZXR1cm4gdXRpbC5tZDUoW2ZpbGUubmFtZSwgZmlsZS5zaXplLCBmaWxlLmxhc3RNb2RpZmllZERhdGUsIENodW5rU2l6ZSwgQnVja2V0LCBLZXldLmpvaW4oJzo6JykpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG4gIC8vIOiOt+WPluaWh+S7tuWvueW6lOeahCBVcGxvYWRJZCDliJfooahcbiAgZ2V0VXBsb2FkSWRMaXN0OiBmdW5jdGlvbiBnZXRVcGxvYWRJZExpc3QodXVpZCkge1xuICAgIGlmICghdXVpZCkgcmV0dXJuIG51bGw7XG4gICAgaW5pdC5jYWxsKHRoaXMpO1xuICAgIHZhciBsaXN0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY2FjaGVbaV1bMF0gPT09IHV1aWQpIGxpc3QucHVzaChjYWNoZVtpXVsxXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3QubGVuZ3RoID8gbGlzdCA6IG51bGw7XG4gIH0sXG4gIC8vIOe8k+WtmCBVcGxvYWRJZFxuICBzYXZlVXBsb2FkSWQ6IGZ1bmN0aW9uIHNhdmVVcGxvYWRJZCh1dWlkLCBVcGxvYWRJZCwgbGltaXQpIHtcbiAgICBpbml0LmNhbGwodGhpcyk7XG4gICAgaWYgKCF1dWlkKSByZXR1cm47IC8vIOa4heeQhuayoeeUqOeahCBVcGxvYWRJZO+8jGpzIOaWh+S7tuayoeaciSBGaWxlUGF0aCDvvIzlj6rmuIXnkIbnm7jlkIzorrDlvZVcblxuICAgIGZvciAodmFyIGkgPSBjYWNoZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGl0ZW0gPSBjYWNoZVtpXTtcblxuICAgICAgaWYgKGl0ZW1bMF0gPT09IHV1aWQgJiYgaXRlbVsxXSA9PT0gVXBsb2FkSWQpIHtcbiAgICAgICAgY2FjaGUuc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhY2hlLnVuc2hpZnQoW3V1aWQsIFVwbG9hZElkLCBNYXRoLnJvdW5kKERhdGUubm93KCkgLyAxMDAwKV0pO1xuICAgIGlmIChjYWNoZS5sZW5ndGggPiBsaW1pdCkgY2FjaGUuc3BsaWNlKGxpbWl0KTtcbiAgICBzYXZlKCk7XG4gIH0sXG4gIC8vIFVwbG9hZElkIOW3sueUqOWujO+8jOenu+mZpOaOiVxuICByZW1vdmVVcGxvYWRJZDogZnVuY3Rpb24gcmVtb3ZlVXBsb2FkSWQoVXBsb2FkSWQpIHtcbiAgICBpbml0LmNhbGwodGhpcyk7XG4gICAgZGVsZXRlIG1vZC51c2luZ1tVcGxvYWRJZF07XG5cbiAgICBmb3IgKHZhciBpID0gY2FjaGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChjYWNoZVtpXVsxXSA9PT0gVXBsb2FkSWQpIGNhY2hlLnNwbGljZShpLCAxKTtcbiAgICB9XG5cbiAgICBzYXZlKCk7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IG1vZDsiLCJ2YXIgc2Vzc2lvbiA9IHJlcXVpcmUoJy4vc2Vzc2lvbicpO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgb3JpZ2luQXBpTWFwID0ge307XG5cbnZhciB0cmFuc2ZlclRvVGFza01ldGhvZCA9IGZ1bmN0aW9uIHRyYW5zZmVyVG9UYXNrTWV0aG9kKGFwaU1hcCwgYXBpTmFtZSkge1xuICBvcmlnaW5BcGlNYXBbYXBpTmFtZV0gPSBhcGlNYXBbYXBpTmFtZV07XG5cbiAgYXBpTWFwW2FwaU5hbWVdID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICBpZiAocGFyYW1zLlNraXBUYXNrKSB7XG4gICAgICBvcmlnaW5BcGlNYXBbYXBpTmFtZV0uY2FsbCh0aGlzLCBwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYWRkVGFzayhhcGlOYW1lLCBwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH07XG59O1xuXG52YXIgaW5pdFRhc2sgPSBmdW5jdGlvbiBpbml0VGFzayhjb3MpIHtcbiAgdmFyIHF1ZXVlID0gW107XG4gIHZhciB0YXNrcyA9IHt9O1xuICB2YXIgdXBsb2FkaW5nRmlsZUNvdW50ID0gMDtcbiAgdmFyIG5leHRVcGxvYWRJbmRleCA9IDA7IC8vIOaOpeWPo+i/lOWbnueugOeVpeeahOS7u+WKoeS/oeaBr1xuXG4gIHZhciBmb3JtYXRUYXNrID0gZnVuY3Rpb24gZm9ybWF0VGFzayh0YXNrKSB7XG4gICAgdmFyIHQgPSB7XG4gICAgICBpZDogdGFzay5pZCxcbiAgICAgIEJ1Y2tldDogdGFzay5CdWNrZXQsXG4gICAgICBSZWdpb246IHRhc2suUmVnaW9uLFxuICAgICAgS2V5OiB0YXNrLktleSxcbiAgICAgIEZpbGVQYXRoOiB0YXNrLkZpbGVQYXRoLFxuICAgICAgc3RhdGU6IHRhc2suc3RhdGUsXG4gICAgICBsb2FkZWQ6IHRhc2subG9hZGVkLFxuICAgICAgc2l6ZTogdGFzay5zaXplLFxuICAgICAgc3BlZWQ6IHRhc2suc3BlZWQsXG4gICAgICBwZXJjZW50OiB0YXNrLnBlcmNlbnQsXG4gICAgICBoYXNoUGVyY2VudDogdGFzay5oYXNoUGVyY2VudCxcbiAgICAgIGVycm9yOiB0YXNrLmVycm9yXG4gICAgfTtcbiAgICBpZiAodGFzay5GaWxlUGF0aCkgdC5GaWxlUGF0aCA9IHRhc2suRmlsZVBhdGg7XG4gICAgaWYgKHRhc2suX2N1c3RvbSkgdC5fY3VzdG9tID0gdGFzay5fY3VzdG9tOyAvLyDmjqfliLblj7Dkvb/nlKhcblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIHZhciBlbWl0TGlzdFVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGltZXI7XG5cbiAgICB2YXIgZW1pdCA9IGZ1bmN0aW9uIGVtaXQoKSB7XG4gICAgICB0aW1lciA9IDA7XG4gICAgICBjb3MuZW1pdCgndGFzay1saXN0LXVwZGF0ZScsIHtcbiAgICAgICAgbGlzdDogdXRpbC5tYXAocXVldWUsIGZvcm1hdFRhc2spXG4gICAgICB9KTtcbiAgICAgIGNvcy5lbWl0KCdsaXN0LXVwZGF0ZScsIHtcbiAgICAgICAgbGlzdDogdXRpbC5tYXAocXVldWUsIGZvcm1hdFRhc2spXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGltZXIpIHRpbWVyID0gc2V0VGltZW91dChlbWl0KTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdmFyIGNsZWFyUXVldWUgPSBmdW5jdGlvbiBjbGVhclF1ZXVlKCkge1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPD0gY29zLm9wdGlvbnMuVXBsb2FkUXVldWVTaXplKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5leHRVcGxvYWRJbmRleCAmJiAvLyDlsI/kuo7lvZPliY3mk43kvZznmoQgaW5kZXgg5omN5riF55CGXG4gICAgaSA8IHF1ZXVlLmxlbmd0aCAmJiAvLyDlpKfkuo7pmJ/liJfmiY3muIXnkIZcbiAgICBxdWV1ZS5sZW5ndGggPiBjb3Mub3B0aW9ucy5VcGxvYWRRdWV1ZVNpemUgLy8g5aaC5p6c6L+Y5aSq5aSa77yM5omN57un57ut5riF55CGXG4gICAgOykge1xuICAgICAgdmFyIGlzQWN0aXZlID0gcXVldWVbaV0uc3RhdGUgPT09ICd3YWl0aW5nJyB8fCBxdWV1ZVtpXS5zdGF0ZSA9PT0gJ2NoZWNraW5nJyB8fCBxdWV1ZVtpXS5zdGF0ZSA9PT0gJ3VwbG9hZGluZyc7XG5cbiAgICAgIGlmICghcXVldWVbaV0gfHwgIWlzQWN0aXZlKSB7XG4gICAgICAgIHRhc2tzW3F1ZXVlW2ldLmlkXSAmJiBkZWxldGUgdGFza3NbcXVldWVbaV0uaWRdO1xuICAgICAgICBxdWV1ZS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIG5leHRVcGxvYWRJbmRleC0tO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVtaXRMaXN0VXBkYXRlKCk7XG4gIH07XG5cbiAgdmFyIHN0YXJ0TmV4dFRhc2sgPSBmdW5jdGlvbiBzdGFydE5leHRUYXNrKCkge1xuICAgIC8vIOajgOafpeaYr+WQpuWFgeiuuOWinuWKoOaJp+ihjOi/m+eoi1xuICAgIGlmICh1cGxvYWRpbmdGaWxlQ291bnQgPj0gY29zLm9wdGlvbnMuRmlsZVBhcmFsbGVsTGltaXQpIHJldHVybjsgLy8g6Lez6L+H5LiN5Y+v5omn6KGM55qE5Lu75YqhXG5cbiAgICB3aGlsZSAocXVldWVbbmV4dFVwbG9hZEluZGV4XSAmJiBxdWV1ZVtuZXh0VXBsb2FkSW5kZXhdLnN0YXRlICE9PSAnd2FpdGluZycpIHtcbiAgICAgIG5leHRVcGxvYWRJbmRleCsrO1xuICAgIH0gLy8g5qOA5p+l5piv5ZCm5bey6YGN5Y6G57uT5p2fXG5cblxuICAgIGlmIChuZXh0VXBsb2FkSW5kZXggPj0gcXVldWUubGVuZ3RoKSByZXR1cm47IC8vIOS4iuS8oOivpemBjeWOhuWIsOeahOS7u+WKoVxuXG4gICAgdmFyIHRhc2sgPSBxdWV1ZVtuZXh0VXBsb2FkSW5kZXhdO1xuICAgIG5leHRVcGxvYWRJbmRleCsrO1xuICAgIHVwbG9hZGluZ0ZpbGVDb3VudCsrO1xuICAgIHRhc2suc3RhdGUgPSAnY2hlY2tpbmcnO1xuICAgIHRhc2sucGFyYW1zLm9uVGFza1N0YXJ0ICYmIHRhc2sucGFyYW1zLm9uVGFza1N0YXJ0KGZvcm1hdFRhc2sodGFzaykpO1xuICAgICF0YXNrLnBhcmFtcy5VcGxvYWREYXRhICYmICh0YXNrLnBhcmFtcy5VcGxvYWREYXRhID0ge30pO1xuICAgIHZhciBhcGlQYXJhbXMgPSB1dGlsLmZvcm1hdFBhcmFtcyh0YXNrLmFwaSwgdGFzay5wYXJhbXMpO1xuICAgIG9yaWdpbkFwaU1hcFt0YXNrLmFwaV0uY2FsbChjb3MsIGFwaVBhcmFtcywgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgaWYgKCFjb3MuX2lzUnVubmluZ1Rhc2sodGFzay5pZCkpIHJldHVybjtcblxuICAgICAgaWYgKHRhc2suc3RhdGUgPT09ICdjaGVja2luZycgfHwgdGFzay5zdGF0ZSA9PT0gJ3VwbG9hZGluZycpIHtcbiAgICAgICAgdGFzay5zdGF0ZSA9IGVyciA/ICdlcnJvcicgOiAnc3VjY2Vzcyc7XG4gICAgICAgIGVyciAmJiAodGFzay5lcnJvciA9IGVycik7XG4gICAgICAgIHVwbG9hZGluZ0ZpbGVDb3VudC0tO1xuICAgICAgICBlbWl0TGlzdFVwZGF0ZSgpO1xuICAgICAgICBzdGFydE5leHRUYXNrKCk7XG4gICAgICAgIHRhc2suY2FsbGJhY2sgJiYgdGFzay5jYWxsYmFjayhlcnIsIGRhdGEpO1xuXG4gICAgICAgIGlmICh0YXNrLnN0YXRlID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICBpZiAodGFzay5wYXJhbXMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0YXNrLnBhcmFtcy5VcGxvYWREYXRhO1xuICAgICAgICAgICAgZGVsZXRlIHRhc2sucGFyYW1zLkJvZHk7XG4gICAgICAgICAgICBkZWxldGUgdGFzay5wYXJhbXM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVsZXRlIHRhc2suY2FsbGJhY2s7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xlYXJRdWV1ZSgpO1xuICAgIH0pO1xuICAgIGVtaXRMaXN0VXBkYXRlKCk7IC8vIOW8guatpeaJp+ihjOS4i+S4gOS4quS7u+WKoVxuXG4gICAgc2V0VGltZW91dChzdGFydE5leHRUYXNrKTtcbiAgfTtcblxuICB2YXIga2lsbFRhc2sgPSBmdW5jdGlvbiBraWxsVGFzayhpZCwgc3dpdGNoVG9TdGF0ZSkge1xuICAgIHZhciB0YXNrID0gdGFza3NbaWRdO1xuICAgIGlmICghdGFzaykgcmV0dXJuO1xuICAgIHZhciB3YWl0aW5nID0gdGFzayAmJiB0YXNrLnN0YXRlID09PSAnd2FpdGluZyc7XG4gICAgdmFyIHJ1bm5pbmcgPSB0YXNrICYmICh0YXNrLnN0YXRlID09PSAnY2hlY2tpbmcnIHx8IHRhc2suc3RhdGUgPT09ICd1cGxvYWRpbmcnKTtcblxuICAgIGlmIChzd2l0Y2hUb1N0YXRlID09PSAnY2FuY2VsZWQnICYmIHRhc2suc3RhdGUgIT09ICdjYW5jZWxlZCcgfHwgc3dpdGNoVG9TdGF0ZSA9PT0gJ3BhdXNlZCcgJiYgd2FpdGluZyB8fCBzd2l0Y2hUb1N0YXRlID09PSAncGF1c2VkJyAmJiBydW5uaW5nKSB7XG4gICAgICBpZiAoc3dpdGNoVG9TdGF0ZSA9PT0gJ3BhdXNlZCcgJiYgdGFzay5wYXJhbXMuQm9keSAmJiB0eXBlb2YgdGFzay5wYXJhbXMuQm9keS5waXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3N0cmVhbSBub3Qgc3VwcG9ydCBwYXVzZScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRhc2suc3RhdGUgPSBzd2l0Y2hUb1N0YXRlO1xuICAgICAgY29zLmVtaXQoJ2lubmVyLWtpbGwtdGFzaycsIHtcbiAgICAgICAgVGFza0lkOiBpZCxcbiAgICAgICAgdG9TdGF0ZTogc3dpdGNoVG9TdGF0ZVxuICAgICAgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBVcGxvYWRJZCA9IHRhc2sgJiYgdGFzay5wYXJhbXMgJiYgdGFzay5wYXJhbXMuVXBsb2FkRGF0YS5VcGxvYWRJZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIGlmIChzd2l0Y2hUb1N0YXRlID09PSAnY2FuY2VsZWQnICYmIFVwbG9hZElkKSBzZXNzaW9uLnJlbW92ZVVzaW5nKFVwbG9hZElkKTtcbiAgICAgIGVtaXRMaXN0VXBkYXRlKCk7XG5cbiAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgIHVwbG9hZGluZ0ZpbGVDb3VudC0tO1xuICAgICAgICBzdGFydE5leHRUYXNrKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzd2l0Y2hUb1N0YXRlID09PSAnY2FuY2VsZWQnKSB7XG4gICAgICAgIGlmICh0YXNrLnBhcmFtcykge1xuICAgICAgICAgIGRlbGV0ZSB0YXNrLnBhcmFtcy5VcGxvYWREYXRhO1xuICAgICAgICAgIGRlbGV0ZSB0YXNrLnBhcmFtcy5Cb2R5O1xuICAgICAgICAgIGRlbGV0ZSB0YXNrLnBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0YXNrLmNhbGxiYWNrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyUXVldWUoKTtcbiAgfTtcblxuICBjb3MuX2FkZFRhc2tzID0gZnVuY3Rpb24gKHRhc2tMaXN0KSB7XG4gICAgdXRpbC5lYWNoKHRhc2tMaXN0LCBmdW5jdGlvbiAodGFzaykge1xuICAgICAgY29zLl9hZGRUYXNrKHRhc2suYXBpLCB0YXNrLnBhcmFtcywgdGFzay5jYWxsYmFjaywgdHJ1ZSk7XG4gICAgfSk7XG4gICAgZW1pdExpc3RVcGRhdGUoKTtcbiAgfTtcblxuICB2YXIgaXNUYXNrUmVhZHlXYXJuaW5nID0gdHJ1ZTtcblxuICBjb3MuX2FkZFRhc2sgPSBmdW5jdGlvbiAoYXBpLCBwYXJhbXMsIGNhbGxiYWNrLCBpZ25vcmVBZGRFdmVudCkge1xuICAgIC8vIOWkjeWItuWPguaVsOWvueixoVxuICAgIHBhcmFtcyA9IHV0aWwuZm9ybWF0UGFyYW1zKGFwaSwgcGFyYW1zKTsgLy8g55Sf5oiQIGlkXG5cbiAgICB2YXIgaWQgPSB1dGlsLnV1aWQoKTtcbiAgICBwYXJhbXMuVGFza0lkID0gaWQ7XG4gICAgcGFyYW1zLm9uVGFza1JlYWR5ICYmIHBhcmFtcy5vblRhc2tSZWFkeShpZCk7XG5cbiAgICBpZiAocGFyYW1zLlRhc2tSZWFkeSkge1xuICAgICAgcGFyYW1zLlRhc2tSZWFkeShpZCk7XG4gICAgICBpc1Rhc2tSZWFkeVdhcm5pbmcgJiYgY29uc29sZS53YXJuKCd3YXJuaW5nOiBQYXJhbSBcIlRhc2tSZWFkeVwiIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXCJvblRhc2tSZWFkeVwiIGluc3RlYWQuJyk7XG4gICAgICBpc1Rhc2tSZWFkeVdhcm5pbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgdGFzayA9IHtcbiAgICAgIC8vIGVudlxuICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICBhcGk6IGFwaSxcbiAgICAgIGluZGV4OiBxdWV1ZS5sZW5ndGgsXG4gICAgICAvLyB0YXNrXG4gICAgICBpZDogaWQsXG4gICAgICBCdWNrZXQ6IHBhcmFtcy5CdWNrZXQsXG4gICAgICBSZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgICBLZXk6IHBhcmFtcy5LZXksXG4gICAgICBGaWxlUGF0aDogcGFyYW1zLkZpbGVQYXRoIHx8ICcnLFxuICAgICAgc3RhdGU6ICd3YWl0aW5nJyxcbiAgICAgIGxvYWRlZDogMCxcbiAgICAgIHNpemU6IDAsXG4gICAgICBzcGVlZDogMCxcbiAgICAgIHBlcmNlbnQ6IDAsXG4gICAgICBoYXNoUGVyY2VudDogMCxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgX2N1c3RvbTogcGFyYW1zLl9jdXN0b21cbiAgICB9O1xuICAgIHZhciBvbkhhc2hQcm9ncmVzcyA9IHBhcmFtcy5vbkhhc2hQcm9ncmVzcztcblxuICAgIHBhcmFtcy5vbkhhc2hQcm9ncmVzcyA9IGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICBpZiAoIWNvcy5faXNSdW5uaW5nVGFzayh0YXNrLmlkKSkgcmV0dXJuO1xuICAgICAgdGFzay5oYXNoUGVyY2VudCA9IGluZm8ucGVyY2VudDtcbiAgICAgIG9uSGFzaFByb2dyZXNzICYmIG9uSGFzaFByb2dyZXNzKGluZm8pO1xuICAgICAgZW1pdExpc3RVcGRhdGUoKTtcbiAgICB9O1xuXG4gICAgdmFyIG9uUHJvZ3Jlc3MgPSBwYXJhbXMub25Qcm9ncmVzcztcblxuICAgIHBhcmFtcy5vblByb2dyZXNzID0gZnVuY3Rpb24gKGluZm8pIHtcbiAgICAgIGlmICghY29zLl9pc1J1bm5pbmdUYXNrKHRhc2suaWQpKSByZXR1cm47XG4gICAgICB0YXNrLnN0YXRlID09PSAnY2hlY2tpbmcnICYmICh0YXNrLnN0YXRlID0gJ3VwbG9hZGluZycpO1xuICAgICAgdGFzay5sb2FkZWQgPSBpbmZvLmxvYWRlZDtcbiAgICAgIHRhc2suc3BlZWQgPSBpbmZvLnNwZWVkO1xuICAgICAgdGFzay5wZXJjZW50ID0gaW5mby5wZXJjZW50O1xuICAgICAgb25Qcm9ncmVzcyAmJiBvblByb2dyZXNzKGluZm8pO1xuICAgICAgZW1pdExpc3RVcGRhdGUoKTtcbiAgICB9OyAvLyDlvILmraXojrflj5YgZmlsZXNpemVcblxuXG4gICAgdXRpbC5nZXRGaWxlU2l6ZShhcGksIHBhcmFtcywgZnVuY3Rpb24gKGVyciwgc2l6ZSkge1xuICAgICAgLy8g5byA5aeL5aSE55CG5LiK5LygXG4gICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2sodXRpbC5lcnJvcihlcnIpKTsgLy8g5aaC5p6c6I635Y+W5aSn5bCP5Ye66ZSZ77yM5LiN5Yqg5YWl6Zif5YiXXG4gICAgICAvLyDojrflj5blrozmlofku7blpKflsI/lho3miorku7vliqHliqDlhaXpmJ/liJdcblxuICAgICAgdGFza3NbaWRdID0gdGFzaztcbiAgICAgIHF1ZXVlLnB1c2godGFzayk7XG4gICAgICB0YXNrLnNpemUgPSBzaXplO1xuICAgICAgIWlnbm9yZUFkZEV2ZW50ICYmIGVtaXRMaXN0VXBkYXRlKCk7XG4gICAgICBzdGFydE5leHRUYXNrKCk7XG4gICAgICBjbGVhclF1ZXVlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkO1xuICB9O1xuXG4gIGNvcy5faXNSdW5uaW5nVGFzayA9IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciB0YXNrID0gdGFza3NbaWRdO1xuICAgIHJldHVybiAhISh0YXNrICYmICh0YXNrLnN0YXRlID09PSAnY2hlY2tpbmcnIHx8IHRhc2suc3RhdGUgPT09ICd1cGxvYWRpbmcnKSk7XG4gIH07XG5cbiAgY29zLmdldFRhc2tMaXN0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB1dGlsLm1hcChxdWV1ZSwgZm9ybWF0VGFzayk7XG4gIH07XG5cbiAgY29zLmNhbmNlbFRhc2sgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBraWxsVGFzayhpZCwgJ2NhbmNlbGVkJyk7XG4gIH07XG5cbiAgY29zLnBhdXNlVGFzayA9IGZ1bmN0aW9uIChpZCkge1xuICAgIGtpbGxUYXNrKGlkLCAncGF1c2VkJyk7XG4gIH07XG5cbiAgY29zLnJlc3RhcnRUYXNrID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIHRhc2sgPSB0YXNrc1tpZF07XG5cbiAgICBpZiAodGFzayAmJiAodGFzay5zdGF0ZSA9PT0gJ3BhdXNlZCcgfHwgdGFzay5zdGF0ZSA9PT0gJ2Vycm9yJykpIHtcbiAgICAgIHRhc2suc3RhdGUgPSAnd2FpdGluZyc7XG4gICAgICBlbWl0TGlzdFVwZGF0ZSgpO1xuICAgICAgbmV4dFVwbG9hZEluZGV4ID0gTWF0aC5taW4obmV4dFVwbG9hZEluZGV4LCB0YXNrLmluZGV4KTtcbiAgICAgIHN0YXJ0TmV4dFRhc2soKTtcbiAgICB9XG4gIH07XG5cbiAgY29zLmlzVXBsb2FkUnVubmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdXBsb2FkaW5nRmlsZUNvdW50IHx8IG5leHRVcGxvYWRJbmRleCA8IHF1ZXVlLmxlbmd0aDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLnRyYW5zZmVyVG9UYXNrTWV0aG9kID0gdHJhbnNmZXJUb1Rhc2tNZXRob2Q7XG5tb2R1bGUuZXhwb3J0cy5pbml0ID0gaW5pdFRhc2s7IiwidmFyIF9jbGFzc0NhbGxDaGVjayA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCIpO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIik7XG5cbnZhciBfdHlwZW9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG52YXIgcGtnID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJyk7XG5cbnZhciBCZWFjb25BY3Rpb24gPSByZXF1aXJlKCcuLi9saWIvYmVhY29uLm1pbicpO1xuXG52YXIgYmVhY29uID0gbnVsbDtcblxudmFyIGdldEJlYWNvbiA9IGZ1bmN0aW9uIGdldEJlYWNvbihkZWxheSkge1xuICBpZiAoIWJlYWNvbikge1xuICAgIGJlYWNvbiA9IG5ldyBCZWFjb25BY3Rpb24oe1xuICAgICAgYXBwa2V5OiBcIjBBTkQwVkVWQjI0VUJHRFVcIixcbiAgICAgIHZlcnNpb25Db2RlOiBwa2cudmVyc2lvbixcbiAgICAgIGNoYW5uZWxJRDogJ2pzX3NkaycsXG4gICAgICAvL+a4oOmBkyzpgInloatcbiAgICAgIG9wZW5pZDogJ29wZW5pZCcsXG4gICAgICAvLyDnlKjmiLdpZCwg6YCJ5aGrXG4gICAgICB1bmlvbmlkOiAndW5pZCcsXG4gICAgICAvL+eUqOaIt3VuaW9uaWQgLCDnsbvkvLxpZGZ2LOmAieWhq1xuICAgICAgc3RyaWN0TW9kZTogZmFsc2UsXG4gICAgICAvL+S4peiLm+aooeW8j+W8gOWFsywg5omT5byA5Lil6Iub5qih5byP5Lya5Li75Yqo5oqb5Ye65byC5bi4LCDkuIrnur/or7fliqHlv4XlhbPpl60hISFcbiAgICAgIGRlbGF5OiBkZWxheSxcbiAgICAgIC8vIOaZrumAmuS6i+S7tuW7tui/n+S4iuaKpeaXtumXtCjljZXkvY3mr6vnp5IpLCDpu5jorqQxMDAwKDHnp5IpLOmAieWhq1xuICAgICAgc2Vzc2lvbkR1cmF0aW9uOiA2MCAqIDEwMDAgLy8gc2Vzc2lvbuWPmOabtOeahOaXtumXtOmXtOmalCwg5LiA5Liq55So5oi35oyB57utMzDliIbpkp8o6buY6K6k5YC8KeayoeacieS7u+S9leS4iuaKpeWImeeul+WPpuS4gOasoSBzZXNzaW9uLOavj+WPmOabtOS4gOasoXNlc3Npb27kuIrmiqXkuIDmrKHlkK/liqjkuovku7YocnFkX2FwcGxhdW5jaGVkKSzkvb/nlKjmr6vnp5IobXMpLOacgOWwj+WAvDMw56eSLOmAieWhq1xuXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gYmVhY29uO1xufTtcblxudmFyIHV0aWxzID0ge1xuICAvLyDnlJ/miJB1aWQg5q+P5Liq6ZO+6Lev5a+55bqU5ZSv5LiA5LiA5p2hdWlkXG4gIGdldFVpZDogZnVuY3Rpb24gZ2V0VWlkKCkge1xuICAgIHZhciBTNCA9IGZ1bmN0aW9uIFM0KCkge1xuICAgICAgcmV0dXJuICgoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMCB8IDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSk7XG4gICAgfTtcblxuICAgIHJldHVybiBTNCgpICsgUzQoKSArIFwiLVwiICsgUzQoKSArIFwiLVwiICsgUzQoKSArIFwiLVwiICsgUzQoKSArIFwiLVwiICsgUzQoKSArIFM0KCkgKyBTNCgpO1xuICB9LFxuICAvLyDojrflj5bnvZHnu5znsbvlnotcbiAgZ2V0TmV0VHlwZTogZnVuY3Rpb24gZ2V0TmV0VHlwZSgpIHtcbiAgICBpZiAoKHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihuYXZpZ2F0b3IpKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBjb25uZWN0aW9uID0gbmF2aWdhdG9yLmNvbm5lY3Rpb24gfHwgbmF2aWdhdG9yLm1vekNvbm5lY3Rpb24gfHwgbmF2aWdhdG9yLndlYmtpdENvbm5lY3Rpb247XG4gICAgICByZXR1cm4gKGNvbm5lY3Rpb24gPT09IG51bGwgfHwgY29ubmVjdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29ubmVjdGlvbi50eXBlKSB8fCAoY29ubmVjdGlvbiA9PT0gbnVsbCB8fCBjb25uZWN0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmVmZmVjdGl2ZVR5cGUpIHx8ICd1bmtub3duJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ3Vua25vd24nO1xuICB9LFxuICAvLyDojrflj5ZwY+err+aTjeS9nOezu+e7n+exu+Wei1xuICBnZXRPc1R5cGU6IGZ1bmN0aW9uIGdldE9zVHlwZSgpIHtcbiAgICBpZiAoKHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihuYXZpZ2F0b3IpKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiAndW5rbm93biBvcyc7XG4gICAgfVxuXG4gICAgdmFyIGFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBpc01hYyA9IC9tYWNpbnRvc2h8bWFjIG9zIHgvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG4gICAgaWYgKGFnZW50LmluZGV4T2YoXCJ3aW4zMlwiKSA+PSAwIHx8IGFnZW50LmluZGV4T2YoXCJ3b3czMlwiKSA+PSAwKSB7XG4gICAgICByZXR1cm4gJ3dpbjMyJztcbiAgICB9XG5cbiAgICBpZiAoYWdlbnQuaW5kZXhPZihcIndpbjY0XCIpID49IDAgfHwgYWdlbnQuaW5kZXhPZihcIndvdzY0XCIpID49IDApIHtcbiAgICAgIHJldHVybiAnd2luNjQnO1xuICAgIH1cblxuICAgIGlmIChpc01hYykge1xuICAgICAgcmV0dXJuICdtYWMnO1xuICAgIH1cblxuICAgIHJldHVybiAndW5rbm93biBvcyc7XG4gIH0sXG4gIGlzTW9iaWxlOiBmdW5jdGlvbiBpc01vYmlsZSgpIHtcbiAgICB2YXIgZXhwID0gLyhwaG9uZXxwYWR8cG9kfGlQaG9uZXxpUG9kfGlvc3xpUGFkfEFuZHJvaWR8TW9iaWxlfEJsYWNrQmVycnl8SUVNb2JpbGV8TVFRQnJvd3NlcnxKVUN8RmVubmVjfHdPU0Jyb3dzZXJ8QnJvd3Nlck5HfFdlYk9TfFN5bWJpYW58V2luZG93cyBQaG9uZSkvaTtcblxuICAgIGlmICgodHlwZW9mIG5hdmlnYXRvciA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKG5hdmlnYXRvcikpID09PSAnb2JqZWN0JyAmJiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKGV4cCkpIHtcbiAgICAgIHJldHVybiB0cnVlOyAvLyDnp7vliqjnq69cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7IC8vIFBD56uvXG4gIH0sXG4gIGlzQW5kcm9pZDogZnVuY3Rpb24gaXNBbmRyb2lkKCkge1xuICAgIHZhciBleHAgPSAvKEFuZHJvaWR8QWRyfExpbnV4KS9pO1xuXG4gICAgaWYgKCh0eXBlb2YgbmF2aWdhdG9yID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YobmF2aWdhdG9yKSkgPT09ICdvYmplY3QnICYmIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goZXhwKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBpc0lPUzogZnVuY3Rpb24gaXNJT1MoKSB7XG4gICAgdmFyIGV4cCA9IC8oaVBob25lfGlQb2R8aVBhZHxpT1MpL2k7XG5cbiAgICBpZiAoKHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihuYXZpZ2F0b3IpKSA9PT0gJ29iamVjdCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaChleHApKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGlzT3RoZXJNb2JpbGU6IGZ1bmN0aW9uIGlzT3RoZXJNb2JpbGUoKSB7XG4gICAgcmV0dXJuIGlzTW9iaWxlICYmICFpc0FuZHJvaWQgJiYgIWlzSU9TO1xuICB9LFxuICAvLyDojrflj5bmtY/op4jlmajnsbvlnotcbiAgZ2V0RGV2aWNlTmFtZTogZnVuY3Rpb24gZ2V0RGV2aWNlTmFtZSgpIHtcbiAgICBpZiAoKHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihuYXZpZ2F0b3IpKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiAndW5rbm93biBkZXZpY2UnO1xuICAgIH1cblxuICAgIHZhciBleHBsb3JlciA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsgLy8g6IW+6K6v5Lya6K6u5YaF572u5rWP6KeI5ZmoXG5cbiAgICBpZiAoZXhwbG9yZXIuaW5jbHVkZXMoJ2FwcC90ZW5jZW50X3dlbWVldCcpKSB7XG4gICAgICByZXR1cm4gJ3RlbmNlbnRfd2VtZWV0JztcbiAgICB9IC8vIOmBqOa4uOa1j+iniOWZqFxuXG5cbiAgICBpZiAoZXhwbG9yZXIuaW5kZXhPZignbWF4dGhvbicpID49IDApIHtcbiAgICAgIHZhciBtYXRjaCA9IGV4cGxvcmVyLm1hdGNoKC9tYXh0aG9uXFwvKFtcXGQuXSspLyk7XG4gICAgICB2YXIgdmVyID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICByZXR1cm4gXCJcXHU1MEIyXFx1NkUzOFxcdTZENEZcXHU4OUM4XFx1NTY2OCBcIi5jb25jYXQodmVyKS50cmltKCk7XG4gICAgfSAvLyBRUea1j+iniOWZqFxuXG5cbiAgICBpZiAoZXhwbG9yZXIuaW5kZXhPZigncXFicm93c2VyJykgPj0gMCkge1xuICAgICAgdmFyIF9tYXRjaCA9IGV4cGxvcmVyLm1hdGNoKC9xcWJyb3dzZXJcXC8oW1xcZC5dKykvKTtcblxuICAgICAgdmFyIF92ZXIgPSBfbWF0Y2ggJiYgX21hdGNoWzFdIHx8ICcnO1xuXG4gICAgICByZXR1cm4gXCJRUVxcdTZENEZcXHU4OUM4XFx1NTY2OCBcIi5jb25jYXQoX3ZlcikudHJpbSgpO1xuICAgIH0gLy8g5pCc54uX5rWP6KeI5ZmoXG5cblxuICAgIGlmIChleHBsb3Jlci5pbmRleE9mKCdzZSAyLngnKSA+PSAwKSB7XG4gICAgICByZXR1cm4gJ+aQnOeLl+a1j+iniOWZqCc7XG4gICAgfSAvLyDlvq7kv6HmtY/op4jlmahcblxuXG4gICAgaWYgKGV4cGxvcmVyLmluZGV4T2YoJ3d4d29yaycpID49IDApIHtcbiAgICAgIHJldHVybiAn5b6u5L+h5YaF572u5rWP6KeI5ZmoJztcbiAgICB9IC8vIGllXG5cblxuICAgIGlmIChleHBsb3Jlci5pbmRleE9mKCdtc2llJykgPj0gMCkge1xuICAgICAgdmFyIF9tYXRjaDIgPSBleHBsb3Jlci5tYXRjaCgvbXNpZSAoW1xcZC5dKykvKTtcblxuICAgICAgdmFyIF92ZXIyID0gX21hdGNoMiAmJiBfbWF0Y2gyWzFdIHx8ICcnO1xuXG4gICAgICByZXR1cm4gXCJJRSBcIi5jb25jYXQoX3ZlcjIpLnRyaW0oKTtcbiAgICB9IC8vIGZpcmVmb3hcblxuXG4gICAgaWYgKGV4cGxvcmVyLmluZGV4T2YoJ2ZpcmVmb3gnKSA+PSAwKSB7XG4gICAgICB2YXIgX21hdGNoMyA9IGV4cGxvcmVyLm1hdGNoKC9maXJlZm94XFwvKFtcXGQuXSspLyk7XG5cbiAgICAgIHZhciBfdmVyMyA9IF9tYXRjaDMgJiYgX21hdGNoM1sxXSB8fCAnJztcblxuICAgICAgcmV0dXJuIFwiRmlyZWZveCBcIi5jb25jYXQoX3ZlcjMpLnRyaW0oKTtcbiAgICB9IC8vIENocm9tZVxuXG5cbiAgICBpZiAoZXhwbG9yZXIuaW5kZXhPZignY2hyb21lJykgPj0gMCkge1xuICAgICAgdmFyIF9tYXRjaDQgPSBleHBsb3Jlci5tYXRjaCgvY2hyb21lXFwvKFtcXGQuXSspLyk7XG5cbiAgICAgIHZhciBfdmVyNCA9IF9tYXRjaDQgJiYgX21hdGNoNFsxXSB8fCAnJztcblxuICAgICAgcmV0dXJuIFwiQ2hyb21lIFwiLmNvbmNhdChfdmVyNCkudHJpbSgpO1xuICAgIH0gLy8gT3BlcmFcblxuXG4gICAgaWYgKGV4cGxvcmVyLmluZGV4T2YoJ29wZXJhJykgPj0gMCkge1xuICAgICAgdmFyIF9tYXRjaDUgPSBleHBsb3Jlci5tYXRjaCgvb3BlcmEuKFtcXGQuXSspLyk7XG5cbiAgICAgIHZhciBfdmVyNSA9IF9tYXRjaDUgJiYgX21hdGNoNVsxXSB8fCAnJztcblxuICAgICAgcmV0dXJuIFwiT3BlcmEgXCIuY29uY2F0KF92ZXI1KS50cmltKCk7XG4gICAgfSAvLyBTYWZhcmlcblxuXG4gICAgaWYgKGV4cGxvcmVyLmluZGV4T2YoJ3NhZmFyaScpID49IDApIHtcbiAgICAgIHZhciBfbWF0Y2g2ID0gZXhwbG9yZXIubWF0Y2goL3ZlcnNpb25cXC8oW1xcZC5dKykvKTtcblxuICAgICAgdmFyIF92ZXI2ID0gX21hdGNoNiAmJiBfbWF0Y2g2WzFdIHx8ICcnO1xuXG4gICAgICByZXR1cm4gXCJTYWZhcmkgXCIuY29uY2F0KF92ZXI2KS50cmltKCk7XG4gICAgfVxuXG4gICAgaWYgKGV4cGxvcmVyLmluZGV4T2YoJ2VkZ2UnKSA+PSAwKSB7XG4gICAgICB2YXIgX21hdGNoNyA9IGV4cGxvcmVyLm1hdGNoKC9lZGdlXFwvKFtcXGQuXSspLyk7XG5cbiAgICAgIHZhciBfdmVyNyA9IF9tYXRjaDcgJiYgX21hdGNoN1sxXSB8fCAnJztcblxuICAgICAgcmV0dXJuIFwiZWRnZSBcIi5jb25jYXQoX3ZlcjcpLnRyaW0oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwbG9yZXIuc3Vic3RyKDAsIDIwMCk7XG4gIH1cbn07XG52YXIgY29uc3RhbnQgPSB7XG4gIGlzTW9iaWxlOiB1dGlscy5pc01vYmlsZSgpLFxuICBpc0Jyb3dzZXI6ICF1dGlscy5pc01vYmlsZSgpLFxuICBtb2JpbGVPc1R5cGU6IHV0aWxzLmlzQW5kcm9pZCgpID8gJ2FuZHJvaWQnIDogdXRpbHMuaXNJT1MgPyAnaW9zJyA6ICdvdGhlcl9tb2JpbGUnLFxuICBwY09zVHlwZTogdXRpbHMuZ2V0T3NUeXBlKClcbn07IC8vIOiuvuWkh+S/oeaBr++8jOWPquWPluS4gOasoeWAvFxuXG52YXIgZGV2aWNlSW5mbyA9IHtcbiAgLy8g4oaT5LiK5oql6aG5XG4gIGRldmljZVR5cGU6IGNvbnN0YW50LmlzTW9iaWxlID8gJ21vYmlsZScgOiBjb25zdGFudC5pc0Jyb3dzZXIgPyAnYnJvd3NlcicgOiAndW5rbm93bicsXG4gIGRldmljZVBsYXRmb3JtOiBjb25zdGFudC5pc01vYmlsZSA/IGNvbnN0YW50Lm1vYmlsZU9zVHlwZSA6IGNvbnN0YW50LnBjT3NUeXBlLFxuICBkZXZpY2VOYW1lOiB1dGlscy5nZXREZXZpY2VOYW1lKCkgLy/mtY/op4jlmajlkI3np7BcblxufTsgLy8g5YiG5Z2X5LiK5Lyg5Y6f5a2Q5pa55rOVXG5cbnZhciBzbGljZVVwbG9hZE1ldGhvZHMgPSBbJ211bHRpcGFydEluaXQnLCAnbXVsdGlwYXJ0VXBsb2FkJywgJ211bHRpcGFydENvbXBsZXRlJywgJ211bHRpcGFydExpc3QnLCAnbXVsdGlwYXJ0TGlzdFBhcnQnLCAnbXVsdGlwYXJ0QWJvcnQnXTtcbnZhciB1cGxvYWRBcGkgPSBbJ3B1dE9iamVjdCcsICdwb3N0T2JqZWN0JywgJ2FwcGVuZE9iamVjdCcsICdzbGljZVVwbG9hZEZpbGUnLCAndXBsb2FkRmlsZScsICd1cGxvYWRGaWxlcyddLmNvbmNhdChzbGljZVVwbG9hZE1ldGhvZHMpO1xudmFyIGRvd25sb2FkQXBpID0gWydnZXRPYmplY3QnXTtcblxuZnVuY3Rpb24gZ2V0RXZlbnRDb2RlKGFwaU5hbWUpIHtcbiAgaWYgKHVwbG9hZEFwaS5pbmNsdWRlcyhhcGlOYW1lKSkge1xuICAgIHJldHVybiAnY29zX3VwbG9hZCc7XG4gIH1cblxuICBpZiAoZG93bmxvYWRBcGkuaW5jbHVkZXMoYXBpTmFtZSkpIHtcbiAgICByZXR1cm4gJ2Nvc19kb3dubG9hZCc7XG4gIH1cblxuICByZXR1cm4gJ2Jhc2Vfc2VydmljZSc7XG59IC8vIOS4iuaKpeWPguaVsOmpvOWzsOaUueS4i+WIkue6v1xuXG5cbmZ1bmN0aW9uIGNhbWVsMnVuZGVybGluZShrZXkpIHtcbiAgcmV0dXJuIGtleS5yZXBsYWNlKC8oW0EtWl0pL2csIFwiXyQxXCIpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhcmFtcyhwYXJhbXMpIHtcbiAgdmFyIGZvcm1hdHRlZFBhcmFtcyA9IHt9O1xuICB2YXIgYWxsUmVwb3J0ZXJLZXlzID0gWyd0cmFjZVBsYXRmb3JtJywgJ2Nvc3Nka1ZlcnNpb24nLCAncmVnaW9uJywgJ25ldHdvcmtUeXBlJywgJ2hvc3QnLCAnYWNjZWxlcmF0ZScsICdyZXF1ZXN0UGF0aCcsICdzaXplJywgJ2h0dHBNZDUnLCAnaHR0cFNpZ24nLCAnaHR0cEZ1bGwnLCAnbmFtZScsICdyZXN1bHQnLCAndG9va1RpbWUnLCAnZXJyb3JOb2RlJywgJ2Vycm9yQ29kZScsICdlcnJvck1lc3NhZ2UnLCAnZXJyb3JSZXF1ZXN0SWQnLCAnZXJyb3JTdGF0dXNDb2RlJywgJ2Vycm9yU2VydmljZU5hbWUnLCAnZXJyb3JUeXBlJywgJ3RyYWNlSWQnLCAnYnVja2V0JywgJ2FwcGlkJywgJ3BhcnROdW1iZXInLCAncmV0cnlUaW1lcycsICdyZXFVcmwnLCAnY3VzdG9tSWQnLCAnZnVsbEVycm9yJywgJ2RldmljZVR5cGUnLCAnZGV2aWNlUGxhdGZvcm0nLCAnZGV2aWNlTmFtZSddO1xuICB2YXIgc3VjY2Vzc0tleXMgPSBbJ3RyYWNlUGxhdGZvcm0nLCAnY29zc2RrVmVyc2lvbicsICdyZWdpb24nLCAnYnVja2V0JywgJ2FwcGlkJywgJ25ldHdvcmtUeXBlJywgJ2hvc3QnLCAnYWNjZWxlcmF0ZScsICdyZXF1ZXN0UGF0aCcsICdwYXJ0TnVtYmVyJywgJ3NpemUnLCAnbmFtZScsICdyZXN1bHQnLCAndG9va1RpbWUnLCAnZXJyb3JSZXF1ZXN0SWQnLCAncmV0cnlUaW1lcycsICdyZXFVcmwnLCAnY3VzdG9tSWQnLCAnZGV2aWNlVHlwZScsICdkZXZpY2VQbGF0Zm9ybScsICdkZXZpY2VOYW1lJ107IC8vIOmcgOimgeS4iuaKpeeahOWPguaVsOWtl+autVxuXG4gIHZhciByZXBvcnRlcktleXMgPSBwYXJhbXMucmVzdWx0ID09PSAnU3VjY2VzcycgPyBzdWNjZXNzS2V5cyA6IGFsbFJlcG9ydGVyS2V5cztcblxuICBmb3IgKHZhciBrZXkgaW4gcGFyYW1zKSB7XG4gICAgaWYgKCFyZXBvcnRlcktleXMuaW5jbHVkZXMoa2V5KSkgY29udGludWU7XG4gICAgdmFyIGZvcm1hdHRlZEtleSA9IGNhbWVsMnVuZGVybGluZShrZXkpO1xuICAgIGZvcm1hdHRlZFBhcmFtc1tmb3JtYXR0ZWRLZXldID0gcGFyYW1zW2tleV07XG4gIH1cblxuICByZXR1cm4gZm9ybWF0dGVkUGFyYW1zO1xufSAvLyDpk77ot6/ov73ouKrlmahcblxuXG52YXIgVHJhY2tlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIGZ1bmN0aW9uIFRyYWNrZXIob3B0KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRyYWNrZXIpO1xuXG4gICAgdmFyIHBhcmVudCA9IG9wdC5wYXJlbnQsXG4gICAgICAgIHRyYWNlSWQgPSBvcHQudHJhY2VJZCxcbiAgICAgICAgYnVja2V0ID0gb3B0LmJ1Y2tldCxcbiAgICAgICAgcmVnaW9uID0gb3B0LnJlZ2lvbixcbiAgICAgICAgYXBpTmFtZSA9IG9wdC5hcGlOYW1lLFxuICAgICAgICBmaWxlS2V5ID0gb3B0LmZpbGVLZXksXG4gICAgICAgIGZpbGVTaXplID0gb3B0LmZpbGVTaXplLFxuICAgICAgICBhY2NlbGVyYXRlID0gb3B0LmFjY2VsZXJhdGUsXG4gICAgICAgIGN1c3RvbUlkID0gb3B0LmN1c3RvbUlkLFxuICAgICAgICBkZWxheSA9IG9wdC5kZWxheSxcbiAgICAgICAgZGVlcFRyYWNrZXIgPSBvcHQuZGVlcFRyYWNrZXI7XG4gICAgdmFyIGFwcGlkID0gYnVja2V0ICYmIGJ1Y2tldC5zdWJzdHIoYnVja2V0Lmxhc3RJbmRleE9mKCctJykgKyAxKSB8fCAnJztcbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLmRlZXBUcmFja2VyID0gZGVlcFRyYWNrZXI7IC8vIOS4iuaKpeeUqOWIsOeahOWtl+autVxuXG4gICAgdGhpcy5wYXJhbXMgPSB7XG4gICAgICAvLyDpgJrnlKjlrZfmrrVcbiAgICAgIGNvc3Nka1ZlcnNpb246IHBrZy52ZXJzaW9uLFxuICAgICAgcmVnaW9uOiByZWdpb24sXG4gICAgICBuZXR3b3JrVHlwZTogJycsXG4gICAgICBob3N0OiAnJyxcbiAgICAgIGFjY2VsZXJhdGU6IGFjY2VsZXJhdGUgPyAnWScgOiAnTicsXG4gICAgICByZXF1ZXN0UGF0aDogZmlsZUtleSB8fCAnJyxcbiAgICAgIHNpemU6IGZpbGVTaXplIHx8IC0xLFxuICAgICAgaHR0cE1kNTogMCxcbiAgICAgIC8vIE1ENeiAl+aXtlxuICAgICAgaHR0cFNpZ246IDAsXG4gICAgICAvLyDorqHnrpfnrb7lkI3ogJfml7ZcbiAgICAgIGh0dHBGdWxsOiAwLFxuICAgICAgLy8gaHR0cOivt+axguiAl+aXtlxuICAgICAgbmFtZTogYXBpTmFtZSB8fCAnJyxcbiAgICAgIHJlc3VsdDogJycsXG4gICAgICAvLyBzZGsgYXBp6LCD55So57uT5p6cU3VjY2Vzc+OAgUZhaWxcbiAgICAgIHRvb2tUaW1lOiAwLFxuICAgICAgLy8g5oC76ICX5pe2XG4gICAgICBlcnJvck5vZGU6ICcnLFxuICAgICAgZXJyb3JDb2RlOiAnJyxcbiAgICAgIGVycm9yTWVzc2FnZTogJycsXG4gICAgICBlcnJvclJlcXVlc3RJZDogJycsXG4gICAgICBlcnJvclN0YXR1c0NvZGU6IDAsXG4gICAgICBlcnJvclNlcnZpY2VOYW1lOiAnJyxcbiAgICAgIC8vIGpz6KGl5YWF5a2X5q61XG4gICAgICB0cmFjZVBsYXRmb3JtOiAnY29zLWpzLXNkay12NScsXG4gICAgICAvLyDkuIrmiqXlubPlj7A9anNcbiAgICAgIHRyYWNlSWQ6IHRyYWNlSWQgfHwgdXRpbHMuZ2V0VWlkKCksXG4gICAgICAvLyDmr4/mnaHkuIrmiqXllK/kuIDmoIfor4ZcbiAgICAgIGJ1Y2tldDogYnVja2V0LFxuICAgICAgYXBwaWQ6IGFwcGlkLFxuICAgICAgcGFydE51bWJlcjogMCxcbiAgICAgIC8vIOWIhuWdl+S4iuS8oOe8luWPt1xuICAgICAgcmV0cnlUaW1lczogMCxcbiAgICAgIC8vIHNka+WGhemDqOWPkei1t+eahOivt+axgumHjeivlVxuICAgICAgcmVxVXJsOiAnJyxcbiAgICAgIC8vIOivt+axgnVybFxuICAgICAgY3VzdG9tSWQ6IGN1c3RvbUlkIHx8ICcnLFxuICAgICAgLy8g5Lia5YqhaWRcbiAgICAgIGRldmljZVR5cGU6IGRldmljZUluZm8uZGV2aWNlVHlwZSxcbiAgICAgIC8vIOiuvuWkh+exu+WeiyDnp7vliqjnq6/mtY/op4jlmajjgIF3ZWLmtY/op4jlmahcbiAgICAgIGRldmljZVBsYXRmb3JtOiBkZXZpY2VJbmZvLmRldmljZVBsYXRmb3JtLFxuICAgICAgZGV2aWNlTmFtZTogZGV2aWNlSW5mby5kZXZpY2VOYW1lLFxuICAgICAgbWQ1U3RhcnRUaW1lOiAwLFxuICAgICAgLy8gbWQ16K6h566X5byA5aeL5pe26Ze0XG4gICAgICBtZDVFbmRUaW1lOiAwLFxuICAgICAgLy8gbWQ16K6h566X57uT5p2f5pe26Ze0XG4gICAgICBzaWduU3RhcnRUaW1lOiAwLFxuICAgICAgLy8g6K6h566X562+5ZCN5byA5aeL5pe26Ze0XG4gICAgICBzaWduRW5kVGltZTogMCxcbiAgICAgIC8vIOiuoeeul+etvuWQjee7k+adn+aXtumXtFxuICAgICAgaHR0cFN0YXJ0VGltZTogMCxcbiAgICAgIC8vIOWPkei1t+e9kee7nOivt+axguW8gOWni+aXtumXtFxuICAgICAgaHR0cEVuZFRpbWU6IDAsXG4gICAgICAvLyDnvZHot6/or7fmsYLnu5PmnZ/ml7bpl7RcbiAgICAgIHN0YXJ0VGltZTogbmV3IERhdGUoKS5nZXRUaW1lKCksXG4gICAgICAvLyBzZGsgYXBp6LCD55So6LW35aeL5pe26Ze077yM5LiN5piv57qv572R57uc6ICX5pe2XG4gICAgICBlbmRUaW1lOiAwIC8vICBzZGsgYXBp6LCD55So57uT5p2f5pe26Ze077yM5LiN5piv57qv572R57uc6ICX5pe2XG5cbiAgICB9O1xuICAgIHRoaXMuYmVhY29uID0gZ2V0QmVhY29uKGRlbGF5KTtcbiAgfSAvLyDmoLzlvI/ljJZzZGvlm57osINcblxuXG4gIF9jcmVhdGVDbGFzcyhUcmFja2VyLCBbe1xuICAgIGtleTogXCJmb3JtYXRSZXN1bHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9ybWF0UmVzdWx0KGVyciwgZGF0YSkge1xuICAgICAgdmFyIF9lcnIkZXJyb3IsIF9lcnIkZXJyb3IyLCBfZXJyJGVycm9yMywgX2VyciRlcnJvcjQsIF9lcnIkZXJyb3I1LCBfZXJyJGVycm9yNjtcblxuICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgdmFyIHRvb2tUaW1lID0gbm93IC0gdGhpcy5wYXJhbXMuc3RhcnRUaW1lO1xuICAgICAgdmFyIG5ldHdvcmtUeXBlID0gdXRpbHMuZ2V0TmV0VHlwZSgpO1xuICAgICAgdmFyIGVycm9yQ29kZSA9IGVyciA/IChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnIuY29kZSkgfHwgKGVyciA9PT0gbnVsbCB8fCBlcnIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfZXJyJGVycm9yID0gZXJyLmVycm9yKSA9PT0gbnVsbCB8fCBfZXJyJGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXJyJGVycm9yLmNvZGUpIHx8IChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2VyciRlcnJvcjIgPSBlcnIuZXJyb3IpID09PSBudWxsIHx8IF9lcnIkZXJyb3IyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXJyJGVycm9yMi5Db2RlKSA6ICcnO1xuICAgICAgdmFyIGVycm9yTWVzc2FnZSA9IGVyciA/IChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnIubWVzc2FnZSkgfHwgKGVyciA9PT0gbnVsbCB8fCBlcnIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfZXJyJGVycm9yMyA9IGVyci5lcnJvcikgPT09IG51bGwgfHwgX2VyciRlcnJvcjMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lcnIkZXJyb3IzLm1lc3NhZ2UpIHx8IChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2VyciRlcnJvcjQgPSBlcnIuZXJyb3IpID09PSBudWxsIHx8IF9lcnIkZXJyb3I0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXJyJGVycm9yNC5NZXNzYWdlKSA6ICcnO1xuICAgICAgdmFyIGVycm9yU2VydmljZU5hbWUgPSBlcnIgPyAoZXJyID09PSBudWxsIHx8IGVyciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyLnJlc291cmNlKSB8fCAoZXJyID09PSBudWxsIHx8IGVyciA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9lcnIkZXJyb3I1ID0gZXJyLmVycm9yKSA9PT0gbnVsbCB8fCBfZXJyJGVycm9yNSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VyciRlcnJvcjUucmVzb3VyY2UpIHx8IChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2VyciRlcnJvcjYgPSBlcnIuZXJyb3IpID09PSBudWxsIHx8IF9lcnIkZXJyb3I2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXJyJGVycm9yNi5SZXNvdXJjZSkgOiAnJztcbiAgICAgIHZhciBlcnJvclN0YXR1c0NvZGUgPSBlcnIgPyBlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnIuc3RhdHVzQ29kZSA6IGRhdGEuc3RhdHVzQ29kZTtcbiAgICAgIHZhciByZXF1ZXN0SWQgPSBlcnIgPyAoZXJyID09PSBudWxsIHx8IGVyciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyLmhlYWRlcnMpICYmIChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnIuaGVhZGVyc1sneC1jb3MtcmVxdWVzdC1pZCddKSA6IChkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGEuaGVhZGVycykgJiYgKGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YS5oZWFkZXJzWyd4LWNvcy1yZXF1ZXN0LWlkJ10pO1xuICAgICAgdmFyIGVycm9yVHlwZSA9IGVyciA/IHJlcXVlc3RJZCA/ICdTZXJ2ZXInIDogJ0NsaWVudCcgOiAnJztcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXJhbXMsIHtcbiAgICAgICAgdG9va1RpbWU6IHRvb2tUaW1lLFxuICAgICAgICBuZXR3b3JrVHlwZTogbmV0d29ya1R5cGUsXG4gICAgICAgIGh0dHBNZDU6IHRoaXMucGFyYW1zLm1kNUVuZFRpbWUgLSB0aGlzLnBhcmFtcy5tZDVTdGFydFRpbWUsXG4gICAgICAgIGh0dHBTaWduOiB0aGlzLnBhcmFtcy5zaWduRW5kVGltZSAtIHRoaXMucGFyYW1zLnNpZ25TdGFydFRpbWUsXG4gICAgICAgIGh0dHBGdWxsOiB0aGlzLnBhcmFtcy5odHRwRW5kVGltZSAtIHRoaXMucGFyYW1zLmh0dHBTdGFydFRpbWUsXG4gICAgICAgIHJlc3VsdDogZXJyID8gJ0ZhaWwnIDogJ1N1Y2Nlc3MnLFxuICAgICAgICBlcnJvclR5cGU6IGVycm9yVHlwZSxcbiAgICAgICAgZXJyb3JDb2RlOiBlcnJvckNvZGUsXG4gICAgICAgIGVycm9yU3RhdHVzQ29kZTogZXJyb3JTdGF0dXNDb2RlLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgZXJyb3JTZXJ2aWNlTmFtZTogZXJyb3JTZXJ2aWNlTmFtZSxcbiAgICAgICAgZXJyb3JSZXF1ZXN0SWQ6IHJlcXVlc3RJZFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChlcnIgJiYgKCFlcnJvckNvZGUgfHwgIWVycm9yTWVzc2FnZSkpIHtcbiAgICAgICAgLy8g5pqC5a2Y5YWo6YePZXJy5LiA5q615pe26Ze0IOinguWvn+aYr+WQpuaJgOaciWVycuagvOW8j+mDveWPr+iiq+ino+aekFxuICAgICAgICB0aGlzLnBhcmFtcy5mdWxsRXJyb3IgPSBlcnIgPyBKU09OLnN0cmluZ2lmeShlcnIpIDogJyc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBhcmFtcy5uYW1lID09PSAnZ2V0T2JqZWN0Jykge1xuICAgICAgICB0aGlzLnBhcmFtcy5zaXplID0gZGF0YSA/IGRhdGEuaGVhZGVycyAmJiBkYXRhLmhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gOiAtMTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucGFyYW1zLnJlcVVybCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBleGVjUmVzID0gL15odHRwKHMpPzpcXC9cXC8oLio/KVxcLy8uZXhlYyh0aGlzLnBhcmFtcy5yZXFVcmwpO1xuICAgICAgICAgIHRoaXMucGFyYW1zLmhvc3QgPSBleGVjUmVzWzJdO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5wYXJhbXMuaG9zdCA9IHRoaXMucGFyYW1zLnJlcVVybDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbmRFdmVudHMoKTtcbiAgICB9IC8vIOiuvue9ruW9k+WJjemTvui3r+eahOWPguaVsFxuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0UGFyYW1zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFBhcmFtcyhwYXJhbXMpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXJhbXMsIHBhcmFtcyk7XG4gICAgfSAvLyDkvb/nlKjnga/loZTlu7bml7bkuIrmiqVcblxuICB9LCB7XG4gICAga2V5OiBcInNlbmRFdmVudHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2VuZEV2ZW50cygpIHtcbiAgICAgIC8vIERlZXBUcmFja2Vy5qih5byP5LiL5omN5Lya5LiK5oql5YiG5Z2X5LiK5Lyg5YaF6YOo57uG6IqCXG4gICAgICBpZiAoc2xpY2VVcGxvYWRNZXRob2RzLmluY2x1ZGVzKHRoaXMucGFyYW1zLm5hbWUpICYmICF0aGlzLmRlZXBUcmFja2VyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGV2ZW50Q29kZSA9IGdldEV2ZW50Q29kZSh0aGlzLnBhcmFtcy5uYW1lKTtcbiAgICAgIHZhciBmb3JtYXR0ZWRQYXJhbXMgPSBmb3JtYXRQYXJhbXModGhpcy5wYXJhbXMpO1xuXG4gICAgICBpZiAodGhpcy5wYXJhbXMuZGVsYXkgPT09IDApIHtcbiAgICAgICAgLy8g5a6e5pe25LiK5oqlXG4gICAgICAgIHRoaXMuYmVhY29uLm9uRGlyZWN0VXNlckFjdGlvbihldmVudENvZGUsIGZvcm1hdHRlZFBhcmFtcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlkajmnJ/mgKfkuIrmiqVcbiAgICAgICAgdGhpcy5iZWFjb24ub25Vc2VyQWN0aW9uKGV2ZW50Q29kZSwgZm9ybWF0dGVkUGFyYW1zKTtcbiAgICAgIH0gLy8g5LiK5oql57uT5p2f5Y2z6ZSA5q+BXG5cblxuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfSAvLyDnlJ/miJDlrZDlrp7kvovvvIzkuI7niLbmiYDlsZ7kuIDkuKrpk77ot6/vvIzlj6/nlKjkuo7liIblnZfkuIrkvKDlhoXpg6jmtYHnqIvkuIrmiqXljZXkuKrliIblnZfmk43kvZxcblxuICB9LCB7XG4gICAga2V5OiBcImdlbmVyYXRlU3ViVHJhY2tlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZW5lcmF0ZVN1YlRyYWNrZXIoc3ViUGFyYW1zKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHN1YlBhcmFtcywge1xuICAgICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICAgIGRlZXBUcmFja2VyOiB0aGlzLmRlZXBUcmFja2VyLFxuICAgICAgICB0cmFjZUlkOiB0aGlzLnBhcmFtcy50cmFjZUlkLFxuICAgICAgICBidWNrZXQ6IHRoaXMucGFyYW1zLmJ1Y2tldCxcbiAgICAgICAgcmVnaW9uOiB0aGlzLnBhcmFtcy5yZWdpb24sXG4gICAgICAgIGZpbGVLZXk6IHRoaXMucGFyYW1zLnJlcXVlc3RQYXRoLFxuICAgICAgICBjdXN0b21JZDogdGhpcy5wYXJhbXMuY3VzdG9tSWQsXG4gICAgICAgIGRlbGF5OiB0aGlzLnBhcmFtcy5kZWxheVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFRyYWNrZXIoc3ViUGFyYW1zKTtcbiAgICB9IC8vIOmTvui3r+e7k+adn+WQjumUgOavgeWunuS+i1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy5iZWFjb24gPSBudWxsO1xuICAgICAgdGhpcy5wYXJhbXMgPSB7fTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVHJhY2tlcjtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFja2VyOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF90eXBlb2YgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIik7XG5cbnZhciBtZDUgPSByZXF1aXJlKCcuLi9saWIvbWQ1Jyk7XG5cbnZhciBDcnlwdG9KUyA9IHJlcXVpcmUoJy4uL2xpYi9jcnlwdG8nKTtcblxudmFyIHhtbDJqc29uID0gcmVxdWlyZSgnLi4vbGliL3htbDJqc29uJyk7XG5cbnZhciBqc29uMnhtbCA9IHJlcXVpcmUoJy4uL2xpYi9qc29uMnhtbCcpO1xuXG52YXIgVHJhY2tlciA9IHJlcXVpcmUoJy4vdHJhY2tlcicpO1xuXG5mdW5jdGlvbiBjYW1TYWZlVXJsRW5jb2RlKHN0cikge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvIS9nLCAnJTIxJykucmVwbGFjZSgvJy9nLCAnJTI3JykucmVwbGFjZSgvXFwoL2csICclMjgnKS5yZXBsYWNlKC9cXCkvZywgJyUyOScpLnJlcGxhY2UoL1xcKi9nLCAnJTJBJyk7XG59XG5cbmZ1bmN0aW9uIGdldE9iamVjdEtleXMob2JqLCBmb3JLZXkpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBsaXN0LnB1c2goZm9yS2V5ID8gY2FtU2FmZVVybEVuY29kZShrZXkpLnRvTG93ZXJDYXNlKCkgOiBrZXkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsaXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICBhID0gYS50b0xvd2VyQ2FzZSgpO1xuICAgIGIgPSBiLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGEgPT09IGIgPyAwIDogYSA+IGIgPyAxIDogLTE7XG4gIH0pO1xufVxuXG47XG4vKipcbiAqIG9iaui9rOS4unN0cmluZ1xuICogQHBhcmFtICB7T2JqZWN0fSAgb2JqICAgICAgICAgICAgICAgIOmcgOimgei9rOeahOWvueixoe+8jOW/hemhu1xuICogQHBhcmFtICB7Qm9vbGVhbn0gbG93ZXJDYXNlS2V5ICAgICAgIGtleeaYr+WQpui9rOS4uuWwj+WGme+8jOm7mOiupGZhbHNl77yM6Z2e5b+F6aG7XG4gKiBAcmV0dXJuIHtTdHJpbmd9ICBkYXRhICAgICAgICAgICAgICAg6L+U5Zue5a2X56ym5LiyXG4gKi9cblxudmFyIG9iajJzdHIgPSBmdW5jdGlvbiBvYmoyc3RyKG9iaiwgbG93ZXJDYXNlS2V5KSB7XG4gIHZhciBpLCBrZXksIHZhbDtcbiAgdmFyIGxpc3QgPSBbXTtcbiAgdmFyIGtleUxpc3QgPSBnZXRPYmplY3RLZXlzKG9iaik7XG5cbiAgZm9yIChpID0gMDsgaSA8IGtleUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBrZXlMaXN0W2ldO1xuICAgIHZhbCA9IG9ialtrZXldID09PSB1bmRlZmluZWQgfHwgb2JqW2tleV0gPT09IG51bGwgPyAnJyA6ICcnICsgb2JqW2tleV07XG4gICAga2V5ID0gbG93ZXJDYXNlS2V5ID8gY2FtU2FmZVVybEVuY29kZShrZXkpLnRvTG93ZXJDYXNlKCkgOiBjYW1TYWZlVXJsRW5jb2RlKGtleSk7XG4gICAgdmFsID0gY2FtU2FmZVVybEVuY29kZSh2YWwpIHx8ICcnO1xuICAgIGxpc3QucHVzaChrZXkgKyAnPScgKyB2YWwpO1xuICB9XG5cbiAgcmV0dXJuIGxpc3Quam9pbignJicpO1xufTsgLy8g5Y+v5Lul562+5YWl562+5ZCN55qEaGVhZGVyc1xuXG5cbnZhciBzaWduSGVhZGVycyA9IFsnY29udGVudC1kaXNwb3NpdGlvbicsICdjb250ZW50LWVuY29kaW5nJywgJ2NvbnRlbnQtbGVuZ3RoJywgJ2NvbnRlbnQtbWQ1JywgJ2V4cGVjdCcsICdob3N0JywgJ2lmLW1hdGNoJywgJ2lmLW1vZGlmaWVkLXNpbmNlJywgJ2lmLW5vbmUtbWF0Y2gnLCAnaWYtdW5tb2RpZmllZC1zaW5jZScsICdvcmlnaW4nLCAncmFuZ2UnLCAncmVzcG9uc2UtY2FjaGUtY29udHJvbCcsICdyZXNwb25zZS1jb250ZW50LWRpc3Bvc2l0aW9uJywgJ3Jlc3BvbnNlLWNvbnRlbnQtZW5jb2RpbmcnLCAncmVzcG9uc2UtY29udGVudC1sYW5ndWFnZScsICdyZXNwb25zZS1jb250ZW50LXR5cGUnLCAncmVzcG9uc2UtZXhwaXJlcycsICd0cmFuc2Zlci1lbmNvZGluZycsICd2ZXJzaW9uaWQnXTtcblxudmFyIGdldFNpZ25IZWFkZXJPYmogPSBmdW5jdGlvbiBnZXRTaWduSGVhZGVyT2JqKGhlYWRlcnMpIHtcbiAgdmFyIHNpZ25IZWFkZXJPYmogPSB7fTtcblxuICBmb3IgKHZhciBpIGluIGhlYWRlcnMpIHtcbiAgICB2YXIga2V5ID0gaS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGtleS5pbmRleE9mKCd4LWNvcy0nKSA+IC0xIHx8IHNpZ25IZWFkZXJzLmluZGV4T2Yoa2V5KSA+IC0xKSB7XG4gICAgICBzaWduSGVhZGVyT2JqW2ldID0gaGVhZGVyc1tpXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2lnbkhlYWRlck9iajtcbn07IC8v5rWL6K+V55So55qEa2V55ZCO6Z2i5Y+v5Lul5Y675o6JXG5cblxudmFyIGdldEF1dGggPSBmdW5jdGlvbiBnZXRBdXRoKG9wdCkge1xuICBvcHQgPSBvcHQgfHwge307XG4gIHZhciBTZWNyZXRJZCA9IG9wdC5TZWNyZXRJZDtcbiAgdmFyIFNlY3JldEtleSA9IG9wdC5TZWNyZXRLZXk7XG4gIHZhciBLZXlUaW1lID0gb3B0LktleVRpbWU7XG4gIHZhciBtZXRob2QgPSAob3B0Lm1ldGhvZCB8fCBvcHQuTWV0aG9kIHx8ICdnZXQnKS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgcXVlcnlQYXJhbXMgPSBjbG9uZShvcHQuUXVlcnkgfHwgb3B0LnBhcmFtcyB8fCB7fSk7XG4gIHZhciBoZWFkZXJzID0gZ2V0U2lnbkhlYWRlck9iaihjbG9uZShvcHQuSGVhZGVycyB8fCBvcHQuaGVhZGVycyB8fCB7fSkpO1xuICB2YXIgS2V5ID0gb3B0LktleSB8fCAnJztcbiAgdmFyIHBhdGhuYW1lO1xuXG4gIGlmIChvcHQuVXNlUmF3S2V5KSB7XG4gICAgcGF0aG5hbWUgPSBvcHQuUGF0aG5hbWUgfHwgb3B0LnBhdGhuYW1lIHx8ICcvJyArIEtleTtcbiAgfSBlbHNlIHtcbiAgICBwYXRobmFtZSA9IG9wdC5QYXRobmFtZSB8fCBvcHQucGF0aG5hbWUgfHwgS2V5O1xuICAgIHBhdGhuYW1lLmluZGV4T2YoJy8nKSAhPT0gMCAmJiAocGF0aG5hbWUgPSAnLycgKyBwYXRobmFtZSk7XG4gIH0gLy8gRm9yY2VTaWduSG9zdOaYjuehruS8oOWFpWZhbHNl5omN5LiN5Yqg5YWlaG9zdOetvuWQjVxuXG5cbiAgdmFyIGZvcmNlU2lnbkhvc3QgPSBvcHQuRm9yY2VTaWduSG9zdCA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWU7IC8vIOWmguaenOacieS8oOWFpeWtmOWCqOahtuS4lOmcgOimgeW8uuWItuetvuWQje+8jOmCo+S5iOetvuWQjem7mOiupOWKoCBIb3N0IOWPguS4juiuoeeul++8jOmBv+WFjei3qOahtuiuv+mXrlxuXG4gIGlmICghaGVhZGVycy5Ib3N0ICYmICFoZWFkZXJzLmhvc3QgJiYgb3B0LkJ1Y2tldCAmJiBvcHQuUmVnaW9uICYmIGZvcmNlU2lnbkhvc3QpIGhlYWRlcnMuSG9zdCA9IG9wdC5CdWNrZXQgKyAnLmNvcy4nICsgb3B0LlJlZ2lvbiArICcubXlxY2xvdWQuY29tJztcbiAgaWYgKCFTZWNyZXRJZCkgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtIFNlY3JldElkJyk7XG4gIGlmICghU2VjcmV0S2V5KSB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW0gU2VjcmV0S2V5Jyk7IC8vIOetvuWQjeacieaViOi1t+atouaXtumXtFxuXG4gIHZhciBub3cgPSBNYXRoLnJvdW5kKGdldFNrZXdUaW1lKG9wdC5TeXN0ZW1DbG9ja09mZnNldCkgLyAxMDAwKSAtIDE7XG4gIHZhciBleHAgPSBub3c7XG4gIHZhciBFeHBpcmVzID0gb3B0LkV4cGlyZXMgfHwgb3B0LmV4cGlyZXM7XG5cbiAgaWYgKEV4cGlyZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIGV4cCArPSA5MDA7IC8vIOetvuWQjei/h+acn+aXtumXtOS4uuW9k+WJjSArIDkwMHNcbiAgfSBlbHNlIHtcbiAgICBleHAgKz0gRXhwaXJlcyAqIDEgfHwgMDtcbiAgfSAvLyDopoHnlKjliLDnmoQgQXV0aG9yaXphdGlvbiDlj4LmlbDliJfooahcblxuXG4gIHZhciBxU2lnbkFsZ29yaXRobSA9ICdzaGExJztcbiAgdmFyIHFBayA9IFNlY3JldElkO1xuICB2YXIgcVNpZ25UaW1lID0gS2V5VGltZSB8fCBub3cgKyAnOycgKyBleHA7XG4gIHZhciBxS2V5VGltZSA9IEtleVRpbWUgfHwgbm93ICsgJzsnICsgZXhwO1xuICB2YXIgcUhlYWRlckxpc3QgPSBnZXRPYmplY3RLZXlzKGhlYWRlcnMsIHRydWUpLmpvaW4oJzsnKS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgcVVybFBhcmFtTGlzdCA9IGdldE9iamVjdEtleXMocXVlcnlQYXJhbXMsIHRydWUpLmpvaW4oJzsnKS50b0xvd2VyQ2FzZSgpOyAvLyDnrb7lkI3nrpfms5Xor7TmmI7mlofmoaPvvJpodHRwczovL3d3dy5xY2xvdWQuY29tL2RvY3VtZW50L3Byb2R1Y3QvNDM2Lzc3NzhcbiAgLy8g5q2l6aqk5LiA77ya6K6h566XIFNpZ25LZXlcblxuICB2YXIgc2lnbktleSA9IENyeXB0b0pTLkhtYWNTSEExKHFLZXlUaW1lLCBTZWNyZXRLZXkpLnRvU3RyaW5nKCk7IC8vIOatpemqpOS6jO+8muaehOaIkCBGb3JtYXRTdHJpbmdcblxuICB2YXIgZm9ybWF0U3RyaW5nID0gW21ldGhvZCwgcGF0aG5hbWUsIHV0aWwub2JqMnN0cihxdWVyeVBhcmFtcywgdHJ1ZSksIHV0aWwub2JqMnN0cihoZWFkZXJzLCB0cnVlKSwgJyddLmpvaW4oJ1xcbicpOyAvLyDmraXpqqTkuInvvJrorqHnrpcgU3RyaW5nVG9TaWduXG5cbiAgdmFyIHN0cmluZ1RvU2lnbiA9IFsnc2hhMScsIHFTaWduVGltZSwgQ3J5cHRvSlMuU0hBMShmb3JtYXRTdHJpbmcpLnRvU3RyaW5nKCksICcnXS5qb2luKCdcXG4nKTsgLy8g5q2l6aqk5Zub77ya6K6h566XIFNpZ25hdHVyZVxuXG4gIHZhciBxU2lnbmF0dXJlID0gQ3J5cHRvSlMuSG1hY1NIQTEoc3RyaW5nVG9TaWduLCBzaWduS2V5KS50b1N0cmluZygpOyAvLyDmraXpqqTkupTvvJrmnoTpgKAgQXV0aG9yaXphdGlvblxuXG4gIHZhciBhdXRob3JpemF0aW9uID0gWydxLXNpZ24tYWxnb3JpdGhtPScgKyBxU2lnbkFsZ29yaXRobSwgJ3EtYWs9JyArIHFBaywgJ3Etc2lnbi10aW1lPScgKyBxU2lnblRpbWUsICdxLWtleS10aW1lPScgKyBxS2V5VGltZSwgJ3EtaGVhZGVyLWxpc3Q9JyArIHFIZWFkZXJMaXN0LCAncS11cmwtcGFyYW0tbGlzdD0nICsgcVVybFBhcmFtTGlzdCwgJ3Etc2lnbmF0dXJlPScgKyBxU2lnbmF0dXJlXS5qb2luKCcmJyk7XG4gIHJldHVybiBhdXRob3JpemF0aW9uO1xufTtcblxudmFyIHJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRShjaHVuaywgc2l6ZSwgb2Zmc2V0KSB7XG4gIHZhciBieXRlcyA9IHNpemUgLyA4O1xuICB2YXIgYnVmID0gY2h1bmsuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBieXRlcyk7XG4gIG5ldyBVaW50OEFycmF5KGJ1ZikucmV2ZXJzZSgpO1xuICByZXR1cm4gbmV3IHtcbiAgICA4OiBVaW50OEFycmF5LFxuICAgIDE2OiBVaW50MTZBcnJheSxcbiAgICAzMjogVWludDMyQXJyYXlcbiAgfVtzaXplXShidWYpWzBdO1xufTtcblxudmFyIGJ1ZjJzdHIgPSBmdW5jdGlvbiBidWYyc3RyKGNodW5rLCBzdGFydCwgZW5kLCBpc1V0ZjgpIHtcbiAgdmFyIGJ1ZiA9IGNodW5rLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICB2YXIgc3RyID0gJyc7XG4gIG5ldyBVaW50OEFycmF5KGJ1ZikuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUpIHtcbiAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gIH0pO1xuICBpZiAoaXNVdGY4KSBzdHIgPSBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHN0cikpO1xuICByZXR1cm4gc3RyO1xufTtcblxudmFyIHBhcnNlU2VsZWN0UGF5bG9hZCA9IGZ1bmN0aW9uIHBhcnNlU2VsZWN0UGF5bG9hZChjaHVuaykge1xuICB2YXIgaGVhZGVyID0ge307XG4gIHZhciBib2R5ID0gYnVmMnN0cihjaHVuayk7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgcmVjb3JkczogW11cbiAgfTtcblxuICB3aGlsZSAoY2h1bmsuYnl0ZUxlbmd0aCkge1xuICAgIHZhciB0b3RhbExlbmd0aCA9IHJlYWRJbnRCRShjaHVuaywgMzIsIDApO1xuICAgIHZhciBoZWFkZXJMZW5ndGggPSByZWFkSW50QkUoY2h1bmssIDMyLCA0KTtcbiAgICB2YXIgcGF5bG9hZFJlc3RMZW5ndGggPSB0b3RhbExlbmd0aCAtIGhlYWRlckxlbmd0aCAtIDE2O1xuICAgIHZhciBvZmZzZXQgPSAwO1xuICAgIHZhciBjb250ZW50O1xuICAgIGNodW5rID0gY2h1bmsuc2xpY2UoMTIpOyAvLyDojrflj5YgTWVzc2FnZSDnmoQgaGVhZGVyIOS/oeaBr1xuXG4gICAgd2hpbGUgKG9mZnNldCA8IGhlYWRlckxlbmd0aCkge1xuICAgICAgdmFyIGhlYWRlck5hbWVMZW5ndGggPSByZWFkSW50QkUoY2h1bmssIDgsIG9mZnNldCk7XG4gICAgICB2YXIgaGVhZGVyTmFtZSA9IGJ1ZjJzdHIoY2h1bmssIG9mZnNldCArIDEsIG9mZnNldCArIDEgKyBoZWFkZXJOYW1lTGVuZ3RoKTtcbiAgICAgIHZhciBoZWFkZXJWYWx1ZUxlbmd0aCA9IHJlYWRJbnRCRShjaHVuaywgMTYsIG9mZnNldCArIGhlYWRlck5hbWVMZW5ndGggKyAyKTtcbiAgICAgIHZhciBoZWFkZXJWYWx1ZSA9IGJ1ZjJzdHIoY2h1bmssIG9mZnNldCArIGhlYWRlck5hbWVMZW5ndGggKyA0LCBvZmZzZXQgKyBoZWFkZXJOYW1lTGVuZ3RoICsgNCArIGhlYWRlclZhbHVlTGVuZ3RoKTtcbiAgICAgIGhlYWRlcltoZWFkZXJOYW1lXSA9IGhlYWRlclZhbHVlO1xuICAgICAgb2Zmc2V0ICs9IGhlYWRlck5hbWVMZW5ndGggKyA0ICsgaGVhZGVyVmFsdWVMZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKGhlYWRlclsnOmV2ZW50LXR5cGUnXSA9PT0gJ1JlY29yZHMnKSB7XG4gICAgICBjb250ZW50ID0gYnVmMnN0cihjaHVuaywgb2Zmc2V0LCBvZmZzZXQgKyBwYXlsb2FkUmVzdExlbmd0aCwgdHJ1ZSk7XG4gICAgICByZXN1bHQucmVjb3Jkcy5wdXNoKGNvbnRlbnQpO1xuICAgIH0gZWxzZSBpZiAoaGVhZGVyWyc6ZXZlbnQtdHlwZSddID09PSAnU3RhdHMnKSB7XG4gICAgICBjb250ZW50ID0gYnVmMnN0cihjaHVuaywgb2Zmc2V0LCBvZmZzZXQgKyBwYXlsb2FkUmVzdExlbmd0aCwgdHJ1ZSk7XG4gICAgICByZXN1bHQuc3RhdHMgPSB1dGlsLnhtbDJqc29uKGNvbnRlbnQpLlN0YXRzO1xuICAgIH0gZWxzZSBpZiAoaGVhZGVyWyc6ZXZlbnQtdHlwZSddID09PSAnZXJyb3InKSB7XG4gICAgICB2YXIgZXJyQ29kZSA9IGhlYWRlclsnOmVycm9yLWNvZGUnXTtcbiAgICAgIHZhciBlcnJNZXNzYWdlID0gaGVhZGVyWyc6ZXJyb3ItbWVzc2FnZSddO1xuICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihlcnJNZXNzYWdlKTtcbiAgICAgIGVyci5tZXNzYWdlID0gZXJyTWVzc2FnZTtcbiAgICAgIGVyci5uYW1lID0gZXJyLmNvZGUgPSBlcnJDb2RlO1xuICAgICAgcmVzdWx0LmVycm9yID0gZXJyO1xuICAgIH0gZWxzZSBpZiAoWydQcm9ncmVzcycsICdDb250aW51YXRpb24nLCAnRW5kJ10uaW5jbHVkZXMoaGVhZGVyWyc6ZXZlbnQtdHlwZSddKSkgey8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjaHVuayA9IGNodW5rLnNsaWNlKG9mZnNldCArIHBheWxvYWRSZXN0TGVuZ3RoICsgNCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBheWxvYWQ6IHJlc3VsdC5yZWNvcmRzLmpvaW4oJycpLFxuICAgIGJvZHk6IGJvZHlcbiAgfTtcbn07XG5cbnZhciBnZXRTb3VyY2VQYXJhbXMgPSBmdW5jdGlvbiBnZXRTb3VyY2VQYXJhbXMoc291cmNlKSB7XG4gIHZhciBwYXJzZXIgPSB0aGlzLm9wdGlvbnMuQ29weVNvdXJjZVBhcnNlcjtcbiAgaWYgKHBhcnNlcikgcmV0dXJuIHBhcnNlcihzb3VyY2UpO1xuICB2YXIgbSA9IHNvdXJjZS5tYXRjaCgvXihbXi5dKy1cXGQrKVxcLmNvcyh2NnwtY2RjKT9cXC4oW14uXSspXFwubXlxY2xvdWRcXC5jb21cXC8oLispJC8pO1xuICBpZiAoIW0pIHJldHVybiBudWxsO1xuICByZXR1cm4ge1xuICAgIEJ1Y2tldDogbVsxXSxcbiAgICBSZWdpb246IG1bM10sXG4gICAgS2V5OiBtWzRdXG4gIH07XG59O1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uIG5vb3AoKSB7fTsgLy8g5riF6Zmk5a+56LGh6YeM5YC85Li655qEIHVuZGVmaW5lZCDmiJYgbnVsbCDnmoTlsZ7mgKdcblxuXG52YXIgY2xlYXJLZXkgPSBmdW5jdGlvbiBjbGVhcktleShvYmopIHtcbiAgdmFyIHJldE9iaiA9IHt9O1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkgJiYgb2JqW2tleV0gIT09IHVuZGVmaW5lZCAmJiBvYmpba2V5XSAhPT0gbnVsbCkge1xuICAgICAgcmV0T2JqW2tleV0gPSBvYmpba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0T2JqO1xufTtcblxudmFyIHJlYWRBc0JpbmFyeVN0cmluZyA9IGZ1bmN0aW9uIHJlYWRBc0JpbmFyeVN0cmluZyhibG9iLCBjYWxsYmFjaykge1xuICB2YXIgcmVhZEZ1bjtcbiAgdmFyIGZyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICBpZiAoRmlsZVJlYWRlci5wcm90b3R5cGUucmVhZEFzQmluYXJ5U3RyaW5nKSB7XG4gICAgcmVhZEZ1biA9IEZpbGVSZWFkZXIucHJvdG90eXBlLnJlYWRBc0JpbmFyeVN0cmluZztcblxuICAgIGZyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKHRoaXMucmVzdWx0KTtcbiAgICB9O1xuICB9IGVsc2UgaWYgKEZpbGVSZWFkZXIucHJvdG90eXBlLnJlYWRBc0FycmF5QnVmZmVyKSB7XG4gICAgLy8g5ZyoIGllMTEg5re75YqgIHJlYWRBc0JpbmFyeVN0cmluZyDlhbzlrrlcbiAgICByZWFkRnVuID0gZnVuY3Rpb24gcmVhZEZ1bihmaWxlRGF0YSkge1xuICAgICAgdmFyIGJpbmFyeSA9IFwiXCI7XG4gICAgICB2YXIgcHQgPSB0aGlzO1xuICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShyZWFkZXIucmVzdWx0KTtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGJ5dGVzLmJ5dGVMZW5ndGg7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKGJpbmFyeSk7XG4gICAgICB9O1xuXG4gICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZURhdGEpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcignRmlsZVJlYWRlciBub3Qgc3VwcG9ydCByZWFkQXNCaW5hcnlTdHJpbmcnKTtcbiAgfVxuXG4gIHJlYWRGdW4uY2FsbChmciwgYmxvYik7XG59O1xuXG52YXIgZmlsZVNsaWNlTmVlZENvcHkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjb21wYXJlVmVyc2lvbiA9IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9uKGEsIGIpIHtcbiAgICBhID0gYS5zcGxpdCgnLicpO1xuICAgIGIgPSBiLnNwbGl0KCcuJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChhW2ldKSA+IHBhcnNlSW50KGJbaV0pID8gMSA6IC0xO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9O1xuXG4gIHZhciBjaGVjayA9IGZ1bmN0aW9uIGNoZWNrKHVhKSB7XG4gICAgaWYgKCF1YSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBDaHJvbWVWZXJzaW9uID0gKHVhLm1hdGNoKC9DaHJvbWVcXC8oWy5cXGRdKykvKSB8fCBbXSlbMV07XG4gICAgdmFyIFFCQ29yZVZlcnNpb24gPSAodWEubWF0Y2goL1FCQ29yZVxcLyhbLlxcZF0rKS8pIHx8IFtdKVsxXTtcbiAgICB2YXIgUVFCcm93c2VyVmVyc2lvbiA9ICh1YS5tYXRjaCgvUVFCcm93c2VyXFwvKFsuXFxkXSspLykgfHwgW10pWzFdO1xuICAgIHZhciBuZWVkID0gQ2hyb21lVmVyc2lvbiAmJiBjb21wYXJlVmVyc2lvbihDaHJvbWVWZXJzaW9uLCAnNTMuMC4yNzg1LjExNicpIDwgMCAmJiBRQkNvcmVWZXJzaW9uICYmIGNvbXBhcmVWZXJzaW9uKFFCQ29yZVZlcnNpb24sICczLjUzLjk5MS40MDAnKSA8IDAgJiYgUVFCcm93c2VyVmVyc2lvbiAmJiBjb21wYXJlVmVyc2lvbihRUUJyb3dzZXJWZXJzaW9uLCAnOS4wLjI1MjQuNDAwJykgPD0gMCB8fCBmYWxzZTtcbiAgICByZXR1cm4gbmVlZDtcbiAgfTtcblxuICByZXR1cm4gY2hlY2sodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCk7XG59KCk7IC8vIOiOt+WPluaWh+S7tuWIhueJh1xuXG5cbnZhciBmaWxlU2xpY2UgPSBmdW5jdGlvbiBmaWxlU2xpY2UoZmlsZSwgc3RhcnQsIGVuZCwgaXNVc2VUb1VwbG9hZCwgY2FsbGJhY2spIHtcbiAgdmFyIGJsb2I7XG5cbiAgaWYgKGZpbGUuc2xpY2UpIHtcbiAgICBibG9iID0gZmlsZS5zbGljZShzdGFydCwgZW5kKTtcbiAgfSBlbHNlIGlmIChmaWxlLm1velNsaWNlKSB7XG4gICAgYmxvYiA9IGZpbGUubW96U2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH0gZWxzZSBpZiAoZmlsZS53ZWJraXRTbGljZSkge1xuICAgIGJsb2IgPSBmaWxlLndlYmtpdFNsaWNlKHN0YXJ0LCBlbmQpO1xuICB9XG5cbiAgaWYgKGlzVXNlVG9VcGxvYWQgJiYgZmlsZVNsaWNlTmVlZENvcHkpIHtcbiAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgYmxvYiA9IG51bGw7XG4gICAgICBjYWxsYmFjayhuZXcgQmxvYihbcmVhZGVyLnJlc3VsdF0pKTtcbiAgICB9O1xuXG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKGJsb2IpO1xuICB9XG59OyAvLyDojrflj5bmlofku7blhoXlrrnnmoQgTUQ1XG5cblxudmFyIGdldEJvZHlNZDUgPSBmdW5jdGlvbiBnZXRCb2R5TWQ1KFVwbG9hZENoZWNrQ29udGVudE1kNSwgQm9keSwgY2FsbGJhY2ssIG9uUHJvZ3Jlc3MpIHtcbiAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBub29wO1xuXG4gIGlmIChVcGxvYWRDaGVja0NvbnRlbnRNZDUpIHtcbiAgICBpZiAodHlwZW9mIEJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjYWxsYmFjayh1dGlsLm1kNShCb2R5LCB0cnVlKSk7XG4gICAgfSBlbHNlIGlmIChCbG9iICYmIEJvZHkgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICB1dGlsLmdldEZpbGVNZDUoQm9keSwgZnVuY3Rpb24gKGVyciwgbWQ1KSB7XG4gICAgICAgIGNhbGxiYWNrKG1kNSk7XG4gICAgICB9LCBvblByb2dyZXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxufTsgLy8g6I635Y+W5paH5Lu2IG1kNSDlgLxcblxuXG52YXIgbWQ1Q2h1bmtTaXplID0gMTAyNCAqIDEwMjQ7XG5cbnZhciBnZXRGaWxlTWQ1ID0gZnVuY3Rpb24gZ2V0RmlsZU1kNShibG9iLCBjYWxsYmFjaywgb25Qcm9ncmVzcykge1xuICB2YXIgc2l6ZSA9IGJsb2Iuc2l6ZTtcbiAgdmFyIGxvYWRlZCA9IDA7XG4gIHZhciBtZDVjdHggPSBtZDUuZ2V0Q3R4KCk7XG5cbiAgdmFyIG5leHQgPSBmdW5jdGlvbiBuZXh0KHN0YXJ0KSB7XG4gICAgaWYgKHN0YXJ0ID49IHNpemUpIHtcbiAgICAgIHZhciBoYXNoID0gbWQ1Y3R4LmRpZ2VzdCgnaGV4Jyk7XG4gICAgICBjYWxsYmFjayhudWxsLCBoYXNoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gTWF0aC5taW4oc2l6ZSwgc3RhcnQgKyBtZDVDaHVua1NpemUpO1xuICAgIHV0aWwuZmlsZVNsaWNlKGJsb2IsIHN0YXJ0LCBlbmQsIGZhbHNlLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHJlYWRBc0JpbmFyeVN0cmluZyhjaHVuaywgZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgICAgY2h1bmsgPSBudWxsO1xuICAgICAgICBtZDVjdHggPSBtZDVjdHgudXBkYXRlKGNvbnRlbnQsIHRydWUpO1xuICAgICAgICBsb2FkZWQgKz0gY29udGVudC5sZW5ndGg7XG4gICAgICAgIGNvbnRlbnQgPSBudWxsO1xuICAgICAgICBpZiAob25Qcm9ncmVzcykgb25Qcm9ncmVzcyh7XG4gICAgICAgICAgbG9hZGVkOiBsb2FkZWQsXG4gICAgICAgICAgdG90YWw6IHNpemUsXG4gICAgICAgICAgcGVyY2VudDogTWF0aC5yb3VuZChsb2FkZWQgLyBzaXplICogMTAwMDApIC8gMTAwMDBcbiAgICAgICAgfSk7XG4gICAgICAgIG5leHQoc3RhcnQgKyBtZDVDaHVua1NpemUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgbmV4dCgwKTtcbn07XG5cbmZ1bmN0aW9uIGNsb25lKG9iaikge1xuICByZXR1cm4gbWFwKG9iaiwgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gX3R5cGVvZih2KSA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCA/IGNsb25lKHYpIDogdjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGF0dHIob2JqLCBuYW1lLCBkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIG9iaiAmJiBuYW1lIGluIG9iaiA/IG9ialtuYW1lXSA6IGRlZmF1bHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG4gIGVhY2goc291cmNlLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9KTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gaXNBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFyciBpbnN0YW5jZW9mIEFycmF5O1xufVxuXG5mdW5jdGlvbiBpc0luQXJyYXkoYXJyLCBpdGVtKSB7XG4gIHZhciBmbGFnID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaXRlbSA9PT0gYXJyW2ldKSB7XG4gICAgICBmbGFnID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmbGFnO1xufVxuXG5mdW5jdGlvbiBtYWtlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBpc0FycmF5KGFycikgPyBhcnIgOiBbYXJyXTtcbn1cblxuZnVuY3Rpb24gZWFjaChvYmosIGZuKSB7XG4gIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgZm4ob2JqW2ldLCBpKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwKG9iaiwgZm4pIHtcbiAgdmFyIG8gPSBpc0FycmF5KG9iaikgPyBbXSA6IHt9O1xuXG4gIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgb1tpXSA9IGZuKG9ialtpXSwgaSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG87XG59XG5cbmZ1bmN0aW9uIGZpbHRlcihvYmosIGZuKSB7XG4gIHZhciBpYUFyciA9IGlzQXJyYXkob2JqKTtcbiAgdmFyIG8gPSBpYUFyciA/IFtdIDoge307XG5cbiAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICBpZiAoZm4ob2JqW2ldLCBpKSkge1xuICAgICAgICBpZiAoaWFBcnIpIHtcbiAgICAgICAgICBvLnB1c2gob2JqW2ldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvW2ldID0gb2JqW2ldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG87XG59XG5cbnZhciBiaW5hcnlCYXNlNjQgPSBmdW5jdGlvbiBiaW5hcnlCYXNlNjQoc3RyKSB7XG4gIHZhciBpLFxuICAgICAgbGVuLFxuICAgICAgY2hhcixcbiAgICAgIHJlcyA9ICcnO1xuXG4gIGZvciAoaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGggLyAyOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjaGFyID0gcGFyc2VJbnQoc3RyW2kgKiAyXSArIHN0cltpICogMiArIDFdLCAxNik7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhcik7XG4gIH1cblxuICByZXR1cm4gYnRvYShyZXMpO1xufTtcblxudmFyIHV1aWQgPSBmdW5jdGlvbiB1dWlkKCkge1xuICB2YXIgUzQgPSBmdW5jdGlvbiBTNCgpIHtcbiAgICByZXR1cm4gKCgxICsgTWF0aC5yYW5kb20oKSkgKiAweDEwMDAwIHwgMCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcbiAgfTtcblxuICByZXR1cm4gUzQoKSArIFM0KCkgKyBcIi1cIiArIFM0KCkgKyBcIi1cIiArIFM0KCkgKyBcIi1cIiArIFM0KCkgKyBcIi1cIiArIFM0KCkgKyBTNCgpICsgUzQoKTtcbn07XG5cbnZhciBoYXNNaXNzaW5nUGFyYW1zID0gZnVuY3Rpb24gaGFzTWlzc2luZ1BhcmFtcyhhcGlOYW1lLCBwYXJhbXMpIHtcbiAgdmFyIEJ1Y2tldCA9IHBhcmFtcy5CdWNrZXQ7XG4gIHZhciBSZWdpb24gPSBwYXJhbXMuUmVnaW9uO1xuICB2YXIgS2V5ID0gcGFyYW1zLktleTtcbiAgdmFyIERvbWFpbiA9IHRoaXMub3B0aW9ucy5Eb21haW47XG4gIHZhciBjaGVja0J1Y2tldCA9ICFEb21haW4gfHwgdHlwZW9mIERvbWFpbiA9PT0gJ3N0cmluZycgJiYgRG9tYWluLmluZGV4T2YoJ3tCdWNrZXR9JykgPiAtMTtcbiAgdmFyIGNoZWNrUmVnaW9uID0gIURvbWFpbiB8fCB0eXBlb2YgRG9tYWluID09PSAnc3RyaW5nJyAmJiBEb21haW4uaW5kZXhPZigne1JlZ2lvbn0nKSA+IC0xO1xuXG4gIGlmIChhcGlOYW1lLmluZGV4T2YoJ0J1Y2tldCcpID4gLTEgfHwgYXBpTmFtZSA9PT0gJ2RlbGV0ZU11bHRpcGxlT2JqZWN0JyB8fCBhcGlOYW1lID09PSAnbXVsdGlwYXJ0TGlzdCcgfHwgYXBpTmFtZSA9PT0gJ2xpc3RPYmplY3RWZXJzaW9ucycpIHtcbiAgICBpZiAoY2hlY2tCdWNrZXQgJiYgIUJ1Y2tldCkgcmV0dXJuICdCdWNrZXQnO1xuICAgIGlmIChjaGVja1JlZ2lvbiAmJiAhUmVnaW9uKSByZXR1cm4gJ1JlZ2lvbic7XG4gIH0gZWxzZSBpZiAoYXBpTmFtZS5pbmRleE9mKCdPYmplY3QnKSA+IC0xIHx8IGFwaU5hbWUuaW5kZXhPZignbXVsdGlwYXJ0JykgPiAtMSB8fCBhcGlOYW1lID09PSAnc2xpY2VVcGxvYWRGaWxlJyB8fCBhcGlOYW1lID09PSAnYWJvcnRVcGxvYWRUYXNrJykge1xuICAgIGlmIChjaGVja0J1Y2tldCAmJiAhQnVja2V0KSByZXR1cm4gJ0J1Y2tldCc7XG4gICAgaWYgKGNoZWNrUmVnaW9uICYmICFSZWdpb24pIHJldHVybiAnUmVnaW9uJztcbiAgICBpZiAoIUtleSkgcmV0dXJuICdLZXknO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIGZvcm1hdFBhcmFtcyA9IGZ1bmN0aW9uIGZvcm1hdFBhcmFtcyhhcGlOYW1lLCBwYXJhbXMpIHtcbiAgLy8g5aSN5Yi25Y+C5pWw5a+56LGhXG4gIHBhcmFtcyA9IGV4dGVuZCh7fSwgcGFyYW1zKTsgLy8g57uf5LiA5aSE55CGIEhlYWRlcnNcblxuICBpZiAoYXBpTmFtZSAhPT0gJ2dldEF1dGgnICYmIGFwaU5hbWUgIT09ICdnZXRWNEF1dGgnICYmIGFwaU5hbWUgIT09ICdnZXRPYmplY3RVcmwnKSB7XG4gICAgdmFyIEhlYWRlcnMgPSBwYXJhbXMuSGVhZGVycyB8fCB7fTtcblxuICAgIGlmIChwYXJhbXMgJiYgX3R5cGVvZihwYXJhbXMpID09PSAnb2JqZWN0Jykge1xuICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHBhcmFtcykge1xuICAgICAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBrZXkuaW5kZXhPZigneC1jb3MtJykgPiAtMSkge1xuICAgICAgICAgICAgSGVhZGVyc1trZXldID0gcGFyYW1zW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICB2YXIgaGVhZGVyTWFwID0ge1xuICAgICAgICAvLyBwYXJhbXMgaGVhZGVyc1xuICAgICAgICAneC1jb3MtbWZhJzogJ01GQScsXG4gICAgICAgICdDb250ZW50LU1ENSc6ICdDb250ZW50TUQ1JyxcbiAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoJzogJ0NvbnRlbnRMZW5ndGgnLFxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ0NvbnRlbnRUeXBlJyxcbiAgICAgICAgJ0V4cGVjdCc6ICdFeHBlY3QnLFxuICAgICAgICAnRXhwaXJlcyc6ICdFeHBpcmVzJyxcbiAgICAgICAgJ0NhY2hlLUNvbnRyb2wnOiAnQ2FjaGVDb250cm9sJyxcbiAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb24nOiAnQ29udGVudERpc3Bvc2l0aW9uJyxcbiAgICAgICAgJ0NvbnRlbnQtRW5jb2RpbmcnOiAnQ29udGVudEVuY29kaW5nJyxcbiAgICAgICAgJ1JhbmdlJzogJ1JhbmdlJyxcbiAgICAgICAgJ0lmLU1vZGlmaWVkLVNpbmNlJzogJ0lmTW9kaWZpZWRTaW5jZScsXG4gICAgICAgICdJZi1Vbm1vZGlmaWVkLVNpbmNlJzogJ0lmVW5tb2RpZmllZFNpbmNlJyxcbiAgICAgICAgJ0lmLU1hdGNoJzogJ0lmTWF0Y2gnLFxuICAgICAgICAnSWYtTm9uZS1NYXRjaCc6ICdJZk5vbmVNYXRjaCcsXG4gICAgICAgICd4LWNvcy1jb3B5LXNvdXJjZSc6ICdDb3B5U291cmNlJyxcbiAgICAgICAgJ3gtY29zLWNvcHktc291cmNlLVJhbmdlJzogJ0NvcHlTb3VyY2VSYW5nZScsXG4gICAgICAgICd4LWNvcy1tZXRhZGF0YS1kaXJlY3RpdmUnOiAnTWV0YWRhdGFEaXJlY3RpdmUnLFxuICAgICAgICAneC1jb3MtY29weS1zb3VyY2UtSWYtTW9kaWZpZWQtU2luY2UnOiAnQ29weVNvdXJjZUlmTW9kaWZpZWRTaW5jZScsXG4gICAgICAgICd4LWNvcy1jb3B5LXNvdXJjZS1JZi1Vbm1vZGlmaWVkLVNpbmNlJzogJ0NvcHlTb3VyY2VJZlVubW9kaWZpZWRTaW5jZScsXG4gICAgICAgICd4LWNvcy1jb3B5LXNvdXJjZS1JZi1NYXRjaCc6ICdDb3B5U291cmNlSWZNYXRjaCcsXG4gICAgICAgICd4LWNvcy1jb3B5LXNvdXJjZS1JZi1Ob25lLU1hdGNoJzogJ0NvcHlTb3VyY2VJZk5vbmVNYXRjaCcsXG4gICAgICAgICd4LWNvcy1hY2wnOiAnQUNMJyxcbiAgICAgICAgJ3gtY29zLWdyYW50LXJlYWQnOiAnR3JhbnRSZWFkJyxcbiAgICAgICAgJ3gtY29zLWdyYW50LXdyaXRlJzogJ0dyYW50V3JpdGUnLFxuICAgICAgICAneC1jb3MtZ3JhbnQtZnVsbC1jb250cm9sJzogJ0dyYW50RnVsbENvbnRyb2wnLFxuICAgICAgICAneC1jb3MtZ3JhbnQtcmVhZC1hY3AnOiAnR3JhbnRSZWFkQWNwJyxcbiAgICAgICAgJ3gtY29zLWdyYW50LXdyaXRlLWFjcCc6ICdHcmFudFdyaXRlQWNwJyxcbiAgICAgICAgJ3gtY29zLXN0b3JhZ2UtY2xhc3MnOiAnU3RvcmFnZUNsYXNzJyxcbiAgICAgICAgJ3gtY29zLXRyYWZmaWMtbGltaXQnOiAnVHJhZmZpY0xpbWl0JyxcbiAgICAgICAgJ3gtY29zLW1pbWUtbGltaXQnOiAnTWltZUxpbWl0JyxcbiAgICAgICAgLy8gU1NFLUNcbiAgICAgICAgJ3gtY29zLXNlcnZlci1zaWRlLWVuY3J5cHRpb24tY3VzdG9tZXItYWxnb3JpdGhtJzogJ1NTRUN1c3RvbWVyQWxnb3JpdGhtJyxcbiAgICAgICAgJ3gtY29zLXNlcnZlci1zaWRlLWVuY3J5cHRpb24tY3VzdG9tZXIta2V5JzogJ1NTRUN1c3RvbWVyS2V5JyxcbiAgICAgICAgJ3gtY29zLXNlcnZlci1zaWRlLWVuY3J5cHRpb24tY3VzdG9tZXIta2V5LU1ENSc6ICdTU0VDdXN0b21lcktleU1ENScsXG4gICAgICAgIC8vIFNTRS1DT1PjgIFTU0UtS01TXG4gICAgICAgICd4LWNvcy1zZXJ2ZXItc2lkZS1lbmNyeXB0aW9uJzogJ1NlcnZlclNpZGVFbmNyeXB0aW9uJyxcbiAgICAgICAgJ3gtY29zLXNlcnZlci1zaWRlLWVuY3J5cHRpb24tY29zLWttcy1rZXktaWQnOiAnU1NFS01TS2V5SWQnLFxuICAgICAgICAneC1jb3Mtc2VydmVyLXNpZGUtZW5jcnlwdGlvbi1jb250ZXh0JzogJ1NTRUNvbnRleHQnXG4gICAgICB9O1xuICAgICAgdXRpbC5lYWNoKGhlYWRlck1hcCwgZnVuY3Rpb24gKHBhcmFtS2V5LCBoZWFkZXJLZXkpIHtcbiAgICAgICAgaWYgKHBhcmFtc1twYXJhbUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIEhlYWRlcnNbaGVhZGVyS2V5XSA9IHBhcmFtc1twYXJhbUtleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcGFyYW1zLkhlYWRlcnMgPSBjbGVhcktleShIZWFkZXJzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyYW1zO1xufTtcblxudmFyIGFwaVdyYXBwZXIgPSBmdW5jdGlvbiBhcGlXcmFwcGVyKGFwaU5hbWUsIGFwaUZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpczsgLy8g5aSE55CG5Y+C5pWwXG5cbiAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBwYXJhbXM7XG4gICAgICBwYXJhbXMgPSB7fTtcbiAgICB9IC8vIOaVtOeQhuWPguaVsOagvOW8j1xuXG5cbiAgICBwYXJhbXMgPSBmb3JtYXRQYXJhbXMoYXBpTmFtZSwgcGFyYW1zKTsgLy8gdHJhY2tlcuS8oOmAklxuXG4gICAgdmFyIHRyYWNrZXI7XG5cbiAgICBpZiAoc2VsZi5vcHRpb25zLkVuYWJsZVRyYWNrZXIpIHtcbiAgICAgIGlmIChwYXJhbXMuY2FsbGVkQnlTZGsgPT09ICdzbGljZVVwbG9hZEZpbGUnKSB7XG4gICAgICAgIC8vIOWIhuWdl+S4iuS8oOWGhemDqOaWueazleS9v+eUqHNsaWNlVXBsb2FkRmlsZeeahOWtkOmTvui3r1xuICAgICAgICB0cmFja2VyID0gcGFyYW1zLnRyYWNrZXIgJiYgcGFyYW1zLnRyYWNrZXIuZ2VuZXJhdGVTdWJUcmFja2VyKHtcbiAgICAgICAgICBhcGlOYW1lOiBhcGlOYW1lXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChbJ3VwbG9hZEZpbGUnLCAndXBsb2FkRmlsZXMnXS5pbmNsdWRlcyhhcGlOYW1lKSkge1xuICAgICAgICAvLyB1cGxvYWRGaWxl44CBdXBsb2FkRmlsZXPmlrnms5XlnKjlhoXpg6jlpITnkIbvvIzmraTlpITkuI3lpITnkIZcbiAgICAgICAgdHJhY2tlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZmlsZVNpemUgPSAtMTtcblxuICAgICAgICBpZiAocGFyYW1zLkJvZHkpIHtcbiAgICAgICAgICBmaWxlU2l6ZSA9IHR5cGVvZiBwYXJhbXMuQm9keSA9PT0gJ3N0cmluZycgPyBwYXJhbXMuQm9keS5sZW5ndGggOiBwYXJhbXMuQm9keS5zaXplIHx8IHBhcmFtcy5Cb2R5LmJ5dGVMZW5ndGggfHwgLTE7XG4gICAgICAgIH1cblxuICAgICAgICB0cmFja2VyID0gbmV3IFRyYWNrZXIoe1xuICAgICAgICAgIGJ1Y2tldDogcGFyYW1zLkJ1Y2tldCxcbiAgICAgICAgICByZWdpb246IHBhcmFtcy5SZWdpb24sXG4gICAgICAgICAgYXBpTmFtZTogYXBpTmFtZSxcbiAgICAgICAgICBmaWxlS2V5OiBwYXJhbXMuS2V5LFxuICAgICAgICAgIGZpbGVTaXplOiBmaWxlU2l6ZSxcbiAgICAgICAgICBkZWVwVHJhY2tlcjogc2VsZi5vcHRpb25zLkRlZXBUcmFja2VyLFxuICAgICAgICAgIGN1c3RvbUlkOiBzZWxmLm9wdGlvbnMuQ3VzdG9tSWQsXG4gICAgICAgICAgZGVsYXk6IHNlbGYub3B0aW9ucy5UcmFja2VyRGVsYXlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyYW1zLnRyYWNrZXIgPSB0cmFja2VyOyAvLyDku6PnkIblm57osIPlh73mlbBcblxuICAgIHZhciBmb3JtYXRSZXN1bHQgPSBmdW5jdGlvbiBmb3JtYXRSZXN1bHQocmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5oZWFkZXJzKSB7XG4gICAgICAgIHJlc3VsdC5oZWFkZXJzWyd4LWNvcy1yZXF1ZXN0LWlkJ10gJiYgKHJlc3VsdC5SZXF1ZXN0SWQgPSByZXN1bHQuaGVhZGVyc1sneC1jb3MtcmVxdWVzdC1pZCddKTtcbiAgICAgICAgcmVzdWx0LmhlYWRlcnNbJ3gtY2ktcmVxdWVzdC1pZCddICYmIChyZXN1bHQuUmVxdWVzdElkID0gcmVzdWx0LmhlYWRlcnNbJ3gtY2ktcmVxdWVzdC1pZCddKTtcbiAgICAgICAgcmVzdWx0LmhlYWRlcnNbJ3gtY29zLXZlcnNpb24taWQnXSAmJiAocmVzdWx0LlZlcnNpb25JZCA9IHJlc3VsdC5oZWFkZXJzWyd4LWNvcy12ZXJzaW9uLWlkJ10pO1xuICAgICAgICByZXN1bHQuaGVhZGVyc1sneC1jb3MtZGVsZXRlLW1hcmtlciddICYmIChyZXN1bHQuRGVsZXRlTWFya2VyID0gcmVzdWx0LmhlYWRlcnNbJ3gtY29zLWRlbGV0ZS1tYXJrZXInXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIHZhciBfY2FsbGJhY2sgPSBmdW5jdGlvbiBfY2FsbGJhY2soZXJyLCBkYXRhKSB7XG4gICAgICAvLyDmoLzlvI/ljJbkuIrmiqXlj4LmlbDlubbkuIrmiqVcbiAgICAgIHRyYWNrZXIgJiYgdHJhY2tlci5mb3JtYXRSZXN1bHQoZXJyLCBkYXRhKTtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGZvcm1hdFJlc3VsdChlcnIpLCBmb3JtYXRSZXN1bHQoZGF0YSkpO1xuICAgIH07XG5cbiAgICB2YXIgY2hlY2tQYXJhbXMgPSBmdW5jdGlvbiBjaGVja1BhcmFtcygpIHtcbiAgICAgIGlmIChhcGlOYW1lICE9PSAnZ2V0U2VydmljZScgJiYgYXBpTmFtZSAhPT0gJ2Fib3J0VXBsb2FkVGFzaycpIHtcbiAgICAgICAgLy8g5Yik5pat5Y+C5pWw5piv5ZCm5a6M5pW0XG4gICAgICAgIHZhciBtaXNzaW5nUmVzdWx0ID0gaGFzTWlzc2luZ1BhcmFtcy5jYWxsKHNlbGYsIGFwaU5hbWUsIHBhcmFtcyk7XG5cbiAgICAgICAgaWYgKG1pc3NpbmdSZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gJ21pc3NpbmcgcGFyYW0gJyArIG1pc3NpbmdSZXN1bHQ7XG4gICAgICAgIH0gLy8g5Yik5patIHJlZ2lvbiDmoLzlvI9cblxuXG4gICAgICAgIGlmIChwYXJhbXMuUmVnaW9uKSB7XG4gICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5Db21wYXRpYmlsaXR5TW9kZSkge1xuICAgICAgICAgICAgaWYgKCEvXihbYS16XFxkLS5dKykkLy50ZXN0KHBhcmFtcy5SZWdpb24pKSB7XG4gICAgICAgICAgICAgIHJldHVybiAnUmVnaW9uIGZvcm1hdCBlcnJvci4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGFyYW1zLlJlZ2lvbi5pbmRleE9mKCdjb3MuJykgPiAtMSkge1xuICAgICAgICAgICAgICByZXR1cm4gJ3BhcmFtIFJlZ2lvbiBzaG91bGQgbm90IGJlIHN0YXJ0IHdpdGggXCJjb3MuXCInO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghL14oW2EtelxcZC1dKykkLy50ZXN0KHBhcmFtcy5SZWdpb24pKSB7XG4gICAgICAgICAgICAgIHJldHVybiAnUmVnaW9uIGZvcm1hdCBlcnJvci4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8g5Yik5patIHJlZ2lvbiDmoLzlvI9cblxuXG4gICAgICAgICAgaWYgKCFzZWxmLm9wdGlvbnMuQ29tcGF0aWJpbGl0eU1vZGUgJiYgcGFyYW1zLlJlZ2lvbi5pbmRleE9mKCctJykgPT09IC0xICYmIHBhcmFtcy5SZWdpb24gIT09ICd5ZmInICYmIHBhcmFtcy5SZWdpb24gIT09ICdkZWZhdWx0JyAmJiBwYXJhbXMuUmVnaW9uICE9PSAnYWNjZWxlcmF0ZScpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybignd2FybmluZzogcGFyYW0gUmVnaW9uIGZvcm1hdCBlcnJvciwgZmluZCBoZWxwIGhlcmU6IGh0dHBzOi8vY2xvdWQudGVuY2VudC5jb20vZG9jdW1lbnQvcHJvZHVjdC80MzYvNjIyNCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyDlhbzlrrnkuI3luKYgQXBwSWQg55qEIEJ1Y2tldFxuXG5cbiAgICAgICAgaWYgKHBhcmFtcy5CdWNrZXQpIHtcbiAgICAgICAgICBpZiAoIS9eKFthLXpcXGQtXSspLShcXGQrKSQvLnRlc3QocGFyYW1zLkJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGlmIChwYXJhbXMuQXBwSWQpIHtcbiAgICAgICAgICAgICAgcGFyYW1zLkJ1Y2tldCA9IHBhcmFtcy5CdWNrZXQgKyAnLScgKyBwYXJhbXMuQXBwSWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYub3B0aW9ucy5BcHBJZCkge1xuICAgICAgICAgICAgICBwYXJhbXMuQnVja2V0ID0gcGFyYW1zLkJ1Y2tldCArICctJyArIHNlbGYub3B0aW9ucy5BcHBJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiAnQnVja2V0IHNob3VsZCBmb3JtYXQgYXMgXCJ0ZXN0LTEyNTAwMDAwMDBcIi4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwYXJhbXMuQXBwSWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybignd2FybmluZzogQXBwSWQgaGFzIGJlZW4gZGVwcmVjYXRlZCwgUGxlYXNlIHB1dCBpdCBhdCB0aGUgZW5kIG9mIHBhcmFtZXRlciBCdWNrZXQoRS5nIEJ1Y2tldDpcInRlc3QtMTI1MDAwMDAwMFwiICkuJyk7XG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zLkFwcElkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyDlpoLmnpwgS2V5IOaYryAvIOW8gOWktO+8jOW8uuWItuWOu+aOieesrOS4gOS4qiAvXG5cblxuICAgICAgICBpZiAoIXNlbGYub3B0aW9ucy5Vc2VSYXdLZXkgJiYgcGFyYW1zLktleSAmJiBwYXJhbXMuS2V5LnN1YnN0cigwLCAxKSA9PT0gJy8nKSB7XG4gICAgICAgICAgcGFyYW1zLktleSA9IHBhcmFtcy5LZXkuc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBlcnJNc2cgPSBjaGVja1BhcmFtcygpO1xuICAgIHZhciBpc1N5bmMgPSBhcGlOYW1lID09PSAnZ2V0QXV0aCcgfHwgYXBpTmFtZSA9PT0gJ2dldE9iamVjdFVybCc7XG5cbiAgICBpZiAodHlwZW9mIFByb21pc2UgPT09ICdmdW5jdGlvbicgJiYgIWlzU3luYyAmJiAhY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soZXJyLCBkYXRhKSB7XG4gICAgICAgICAgZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChlcnJNc2cpIHJldHVybiBfY2FsbGJhY2sodXRpbC5lcnJvcihuZXcgRXJyb3IoZXJyTXNnKSkpO1xuICAgICAgICBhcGlGbi5jYWxsKHNlbGYsIHBhcmFtcywgX2NhbGxiYWNrKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZXJyTXNnKSByZXR1cm4gX2NhbGxiYWNrKHV0aWwuZXJyb3IobmV3IEVycm9yKGVyck1zZykpKTtcbiAgICAgIHZhciByZXMgPSBhcGlGbi5jYWxsKHNlbGYsIHBhcmFtcywgX2NhbGxiYWNrKTtcbiAgICAgIGlmIChpc1N5bmMpIHJldHVybiByZXM7XG4gICAgfVxuICB9O1xufTtcblxudmFyIHRocm90dGxlT25Qcm9ncmVzcyA9IGZ1bmN0aW9uIHRocm90dGxlT25Qcm9ncmVzcyh0b3RhbCwgb25Qcm9ncmVzcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzaXplMCA9IDA7XG4gIHZhciBzaXplMSA9IDA7XG4gIHZhciB0aW1lMCA9IERhdGUubm93KCk7XG4gIHZhciB0aW1lMTtcbiAgdmFyIHRpbWVyO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICB0aW1lciA9IDA7XG5cbiAgICBpZiAob25Qcm9ncmVzcyAmJiB0eXBlb2Ygb25Qcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGltZTEgPSBEYXRlLm5vdygpO1xuICAgICAgdmFyIHNwZWVkID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCgoc2l6ZTEgLSBzaXplMCkgLyAoKHRpbWUxIC0gdGltZTApIC8gMTAwMCkgKiAxMDApIC8gMTAwKSB8fCAwO1xuICAgICAgdmFyIHBlcmNlbnQ7XG5cbiAgICAgIGlmIChzaXplMSA9PT0gMCAmJiB0b3RhbCA9PT0gMCkge1xuICAgICAgICBwZXJjZW50ID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlcmNlbnQgPSBNYXRoLmZsb29yKHNpemUxIC8gdG90YWwgKiAxMDApIC8gMTAwIHx8IDA7XG4gICAgICB9XG5cbiAgICAgIHRpbWUwID0gdGltZTE7XG4gICAgICBzaXplMCA9IHNpemUxO1xuXG4gICAgICB0cnkge1xuICAgICAgICBvblByb2dyZXNzKHtcbiAgICAgICAgICBsb2FkZWQ6IHNpemUxLFxuICAgICAgICAgIHRvdGFsOiB0b3RhbCxcbiAgICAgICAgICBzcGVlZDogc3BlZWQsXG4gICAgICAgICAgcGVyY2VudDogcGVyY2VudFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChpbmZvLCBpbW1lZGlhdGVseSkge1xuICAgIGlmIChpbmZvKSB7XG4gICAgICBzaXplMSA9IGluZm8ubG9hZGVkO1xuICAgICAgdG90YWwgPSBpbmZvLnRvdGFsO1xuICAgIH1cblxuICAgIGlmIChpbW1lZGlhdGVseSkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHVwZGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGltZXIpIHJldHVybjtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dCh1cGRhdGUsIHNlbGYub3B0aW9ucy5Qcm9ncmVzc0ludGVydmFsKTtcbiAgICB9XG4gIH07XG59O1xuXG52YXIgZ2V0RmlsZVNpemUgPSBmdW5jdGlvbiBnZXRGaWxlU2l6ZShhcGksIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgdmFyIHNpemU7XG5cbiAgaWYgKHR5cGVvZiBwYXJhbXMuQm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXJhbXMuQm9keSA9IG5ldyBCbG9iKFtwYXJhbXMuQm9keV0sIHtcbiAgICAgIHR5cGU6ICd0ZXh0L3BsYWluJ1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHBhcmFtcy5Cb2R5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICBwYXJhbXMuQm9keSA9IG5ldyBCbG9iKFtwYXJhbXMuQm9keV0pO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5Cb2R5ICYmIChwYXJhbXMuQm9keSBpbnN0YW5jZW9mIEJsb2IgfHwgcGFyYW1zLkJvZHkudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgRmlsZV0nIHx8IHBhcmFtcy5Cb2R5LnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IEJsb2JdJykpIHtcbiAgICBzaXplID0gcGFyYW1zLkJvZHkuc2l6ZTtcbiAgfSBlbHNlIHtcbiAgICBjYWxsYmFjayh1dGlsLmVycm9yKG5ldyBFcnJvcigncGFyYW1zIGJvZHkgZm9ybWF0IGVycm9yLCBPbmx5IGFsbG93IEZpbGV8QmxvYnxTdHJpbmcuJykpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBwYXJhbXMuQ29udGVudExlbmd0aCA9IHNpemU7XG4gIGNhbGxiYWNrKG51bGwsIHNpemUpO1xufTsgLy8g6I635Y+W6LCD5q2j55qE5pe26Ze05oizXG5cblxudmFyIGdldFNrZXdUaW1lID0gZnVuY3Rpb24gZ2V0U2tld1RpbWUob2Zmc2V0KSB7XG4gIHJldHVybiBEYXRlLm5vdygpICsgKG9mZnNldCB8fCAwKTtcbn07XG5cbnZhciBlcnJvciA9IGZ1bmN0aW9uIGVycm9yKGVyciwgb3B0KSB7XG4gIHZhciBzb3VyY2VFcnIgPSBlcnI7XG4gIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UgfHwgbnVsbDtcblxuICBpZiAodHlwZW9mIG9wdCA9PT0gJ3N0cmluZycpIHtcbiAgICBlcnIuZXJyb3IgPSBvcHQ7XG4gICAgZXJyLm1lc3NhZ2UgPSBvcHQ7XG4gIH0gZWxzZSBpZiAoX3R5cGVvZihvcHQpID09PSAnb2JqZWN0JyAmJiBvcHQgIT09IG51bGwpIHtcbiAgICBleHRlbmQoZXJyLCBvcHQpO1xuICAgIGlmIChvcHQuY29kZSB8fCBvcHQubmFtZSkgZXJyLmNvZGUgPSBvcHQuY29kZSB8fCBvcHQubmFtZTtcbiAgICBpZiAob3B0Lm1lc3NhZ2UpIGVyci5tZXNzYWdlID0gb3B0Lm1lc3NhZ2U7XG4gICAgaWYgKG9wdC5zdGFjaykgZXJyLnN0YWNrID0gb3B0LnN0YWNrO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCAnbmFtZScsIHtcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCAnbWVzc2FnZScsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIGVyci5uYW1lID0gb3B0ICYmIG9wdC5uYW1lIHx8IGVyci5uYW1lIHx8IGVyci5jb2RlIHx8ICdFcnJvcic7XG4gIGlmICghZXJyLmNvZGUpIGVyci5jb2RlID0gZXJyLm5hbWU7XG4gIGlmICghZXJyLmVycm9yKSBlcnIuZXJyb3IgPSBjbG9uZShzb3VyY2VFcnIpOyAvLyDlhbzlrrnogIHnmoTplJnor6/moLzlvI9cblxuICByZXR1cm4gZXJyO1xufTtcblxudmFyIGlzV2ViV29ya2VyID0gZnVuY3Rpb24gaXNXZWJXb3JrZXIoKSB7XG4gIC8vIOaciemZkOWIpOaWrSB3b3JrZXIg546v5aKD55qEIGNvbnN0cnVjdG9yIG5hbWUg5YW25qyh55SoIHdvcmtlciDni6zmnInnmoQgRmlsZVJlYWRlclN5bmMg5YWc5bqVIOivpue7huWPguiAgyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy96aC1DTi9kb2NzL1dlYi9BUEkvV2ViX1dvcmtlcnNfQVBJL1VzaW5nX3dlYl93b3JrZXJzXG4gIHJldHVybiAodHlwZW9mIGdsb2JhbFRoaXMgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihnbG9iYWxUaGlzKSkgPT09ICdvYmplY3QnICYmIChnbG9iYWxUaGlzLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZScgfHwgZ2xvYmFsVGhpcy5GaWxlUmVhZGVyU3luYyk7XG59O1xuXG52YXIgaXNOb2RlID0gZnVuY3Rpb24gaXNOb2RlKCkge1xuICAvLyDlvpflhZzlupUgd2ViIHdvcmtlciDnjq/looPkuK0gd2VicGFjayDnlKjkuoYgcHJvY2VzcyDmj5Lku7bkuYvnsbvnmoTmg4XlhrVcbiAgcmV0dXJuICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yod2luZG93KSkgIT09ICdvYmplY3QnICYmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKHByb2Nlc3MpKSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgJiYgIWlzV2ViV29ya2VyKCk7XG59O1xuXG52YXIgaXNDSUhvc3QgPSBmdW5jdGlvbiBpc0NJSG9zdCh1cmwpIHtcbiAgcmV0dXJuIC9eaHR0cHM/OlxcL1xcLyhbXi9dK1xcLik/Y2lcXC5bXi9dKy8udGVzdCh1cmwpO1xufTtcblxudmFyIHV0aWwgPSB7XG4gIG5vb3A6IG5vb3AsXG4gIGZvcm1hdFBhcmFtczogZm9ybWF0UGFyYW1zLFxuICBhcGlXcmFwcGVyOiBhcGlXcmFwcGVyLFxuICB4bWwyanNvbjogeG1sMmpzb24sXG4gIGpzb24yeG1sOiBqc29uMnhtbCxcbiAgbWQ1OiBtZDUsXG4gIGNsZWFyS2V5OiBjbGVhcktleSxcbiAgZmlsZVNsaWNlOiBmaWxlU2xpY2UsXG4gIGdldEJvZHlNZDU6IGdldEJvZHlNZDUsXG4gIGdldEZpbGVNZDU6IGdldEZpbGVNZDUsXG4gIGJpbmFyeUJhc2U2NDogYmluYXJ5QmFzZTY0LFxuICBleHRlbmQ6IGV4dGVuZCxcbiAgaXNBcnJheTogaXNBcnJheSxcbiAgaXNJbkFycmF5OiBpc0luQXJyYXksXG4gIG1ha2VBcnJheTogbWFrZUFycmF5LFxuICBlYWNoOiBlYWNoLFxuICBtYXA6IG1hcCxcbiAgZmlsdGVyOiBmaWx0ZXIsXG4gIGNsb25lOiBjbG9uZSxcbiAgYXR0cjogYXR0cixcbiAgdXVpZDogdXVpZCxcbiAgY2FtU2FmZVVybEVuY29kZTogY2FtU2FmZVVybEVuY29kZSxcbiAgdGhyb3R0bGVPblByb2dyZXNzOiB0aHJvdHRsZU9uUHJvZ3Jlc3MsXG4gIGdldEZpbGVTaXplOiBnZXRGaWxlU2l6ZSxcbiAgZ2V0U2tld1RpbWU6IGdldFNrZXdUaW1lLFxuICBlcnJvcjogZXJyb3IsXG4gIG9iajJzdHI6IG9iajJzdHIsXG4gIGdldEF1dGg6IGdldEF1dGgsXG4gIHBhcnNlU2VsZWN0UGF5bG9hZDogcGFyc2VTZWxlY3RQYXlsb2FkLFxuICBnZXRTb3VyY2VQYXJhbXM6IGdldFNvdXJjZVBhcmFtcyxcbiAgaXNCcm93c2VyOiB0cnVlLFxuICBpc05vZGU6IGlzTm9kZSxcbiAgaXNDSUhvc3Q6IGlzQ0lIb3N0XG59O1xubW9kdWxlLmV4cG9ydHMgPSB1dGlsOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2xGQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3pqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDL1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNqS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDaHFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDNUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN6S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2pVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDNy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2hSQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDem9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdkxBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDNXlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM5aElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUM5R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ2xTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzliQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0EiLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/dist/cos-js-sdk-v5.min.js b/dist/cos-js-sdk-v5.min.js index b40b379..e9545a5 100644 --- a/dist/cos-js-sdk-v5.min.js +++ b/dist/cos-js-sdk-v5.min.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.COS=t():e.COS=t()}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=10)}([function(e,t,n){"use strict";(function(t){function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}var o=n(12),i=n(14),a=n(15),s=n(20),c=n(6);function u(e){return encodeURIComponent(e).replace(/!/g,"%21").replace(/'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\*/g,"%2A")}function l(e,t){var n=[];for(var r in e)e.hasOwnProperty(r)&&n.push(t?u(r).toLowerCase():r);return n.sort((function(e,t){return(e=e.toLowerCase())===(t=t.toLowerCase())?0:e>t?1:-1}))}var d,p=["content-disposition","content-encoding","content-length","content-md5","expect","host","if-match","if-modified-since","if-none-match","if-unmodified-since","origin","range","response-cache-control","response-content-disposition","response-content-encoding","response-content-language","response-content-type","response-expires","transfer-encoding","versionid"],f=function(e,t,n){var r=t/8,o=e.slice(n,n+r);return new Uint8Array(o).reverse(),new{8:Uint8Array,16:Uint16Array,32:Uint32Array}[t](o)[0]},h=function(e,t,n,r){var o=e.slice(t,n),i="";return new Uint8Array(o).forEach((function(e){i+=String.fromCharCode(e)})),r&&(i=decodeURIComponent(escape(i))),i},m=function(){},g=function(e){var t={};for(var n in e)e.hasOwnProperty(n)&&void 0!==e[n]&&null!==e[n]&&(t[n]=e[n]);return t},y=(d=function(e,t){e=e.split("."),t=t.split(".");for(var n=0;nparseInt(t[n])?1:-1;return 0},function(e){if(!e)return!1;var t=(e.match(/Chrome\/([.\d]+)/)||[])[1],n=(e.match(/QBCore\/([.\d]+)/)||[])[1],r=(e.match(/QQBrowser\/([.\d]+)/)||[])[1];return t&&d(t,"53.0.2785.116")<0&&n&&d(n,"3.53.991.400")<0&&r&&d(r,"9.0.2524.400")<=0||!1}("undefined"!=typeof navigator&&navigator.userAgent)),v=1048576;function C(e){return w(e,(function(e){return"object"===r(e)&&null!==e?C(e):e}))}function k(e,t){return S(t,(function(n,r){e[r]=t[r]})),e}function b(e){return e instanceof Array}function S(e,t){for(var n in e)e.hasOwnProperty(n)&&t(e[n],n)}function w(e,t){var n=b(e)?[]:{};for(var r in e)e.hasOwnProperty(r)&&(n[r]=t(e[r],r));return n}var T=function(e,t){var n=t.Bucket,r=t.Region,o=t.Key,i=this.options.Domain,a=!i||"string"==typeof i&&i.indexOf("{Bucket}")>-1,s=!i||"string"==typeof i&&i.indexOf("{Region}")>-1;if(e.indexOf("Bucket")>-1||"deleteMultipleObject"===e||"multipartList"===e||"listObjectVersions"===e){if(a&&!n)return"Bucket";if(s&&!r)return"Region"}else if(e.indexOf("Object")>-1||e.indexOf("multipart")>-1||"sliceUploadFile"===e||"abortUploadTask"===e){if(a&&!n)return"Bucket";if(s&&!r)return"Region";if(!o)return"Key"}return!1},R=function(e,t){if(t=k({},t),"getAuth"!==e&&"getV4Auth"!==e&&"getObjectUrl"!==e){var n=t.Headers||{};if(t&&"object"===r(t)){!function(){for(var e in t)t.hasOwnProperty(e)&&e.indexOf("x-cos-")>-1&&(n[e]=t[e])}();x.each({"x-cos-mfa":"MFA","Content-MD5":"ContentMD5","Content-Length":"ContentLength","Content-Type":"ContentType",Expect:"Expect",Expires:"Expires","Cache-Control":"CacheControl","Content-Disposition":"ContentDisposition","Content-Encoding":"ContentEncoding",Range:"Range","If-Modified-Since":"IfModifiedSince","If-Unmodified-Since":"IfUnmodifiedSince","If-Match":"IfMatch","If-None-Match":"IfNoneMatch","x-cos-copy-source":"CopySource","x-cos-copy-source-Range":"CopySourceRange","x-cos-metadata-directive":"MetadataDirective","x-cos-copy-source-If-Modified-Since":"CopySourceIfModifiedSince","x-cos-copy-source-If-Unmodified-Since":"CopySourceIfUnmodifiedSince","x-cos-copy-source-If-Match":"CopySourceIfMatch","x-cos-copy-source-If-None-Match":"CopySourceIfNoneMatch","x-cos-acl":"ACL","x-cos-grant-read":"GrantRead","x-cos-grant-write":"GrantWrite","x-cos-grant-full-control":"GrantFullControl","x-cos-grant-read-acp":"GrantReadAcp","x-cos-grant-write-acp":"GrantWriteAcp","x-cos-storage-class":"StorageClass","x-cos-traffic-limit":"TrafficLimit","x-cos-mime-limit":"MimeLimit","x-cos-server-side-encryption-customer-algorithm":"SSECustomerAlgorithm","x-cos-server-side-encryption-customer-key":"SSECustomerKey","x-cos-server-side-encryption-customer-key-MD5":"SSECustomerKeyMD5","x-cos-server-side-encryption":"ServerSideEncryption","x-cos-server-side-encryption-cos-kms-key-id":"SSEKMSKeyId","x-cos-server-side-encryption-context":"SSEContext"},(function(e,r){void 0!==t[e]&&(n[r]=t[e])})),t.Headers=g(n)}}return t},E=function(e){return Date.now()+(e||0)},x={noop:m,formatParams:R,apiWrapper:function(e,t){return function(n,r){var o,i=this;if("function"==typeof n&&(r=n,n={}),n=R(e,n),i.options.EnableTracker)if("sliceUploadFile"===n.calledBySdk)o=n.tracker&&n.tracker.generateSubTracker({apiName:e});else if(["uploadFile","uploadFiles"].includes(e))o=null;else{var a=-1;n.Body&&(a="string"==typeof n.Body?n.Body.length:n.Body.size||n.Body.byteLength||-1),o=new c({bucket:n.Bucket,region:n.Region,apiName:e,fileKey:n.Key,fileSize:a,deepTracker:i.options.DeepTracker,customId:i.options.CustomId,delay:i.options.TrackerDelay})}n.tracker=o;var s=function(e){return e&&e.headers&&(e.headers["x-cos-request-id"]&&(e.RequestId=e.headers["x-cos-request-id"]),e.headers["x-ci-request-id"]&&(e.RequestId=e.headers["x-ci-request-id"]),e.headers["x-cos-version-id"]&&(e.VersionId=e.headers["x-cos-version-id"]),e.headers["x-cos-delete-marker"]&&(e.DeleteMarker=e.headers["x-cos-delete-marker"])),e},u=function(e,t){o&&o.formatResult(e,t),r&&r(s(e),s(t))},l=function(){if("getService"!==e&&"abortUploadTask"!==e){var t=T.call(i,e,n);if(t)return"missing param "+t;if(n.Region){if(i.options.CompatibilityMode){if(!/^([a-z\d-.]+)$/.test(n.Region))return"Region format error."}else{if(n.Region.indexOf("cos.")>-1)return'param Region should not be start with "cos."';if(!/^([a-z\d-]+)$/.test(n.Region))return"Region format error."}!i.options.CompatibilityMode&&-1===n.Region.indexOf("-")&&"yfb"!==n.Region&&"default"!==n.Region&&n.Region}if(n.Bucket){if(!/^([a-z\d-]+)-(\d+)$/.test(n.Bucket))if(n.AppId)n.Bucket=n.Bucket+"-"+n.AppId;else{if(!i.options.AppId)return'Bucket should format as "test-1250000000".';n.Bucket=n.Bucket+"-"+i.options.AppId}n.AppId&&delete n.AppId}!i.options.UseRawKey&&n.Key&&"/"===n.Key.substr(0,1)&&(n.Key=n.Key.substr(1))}}(),d="getAuth"===e||"getObjectUrl"===e;if("function"==typeof Promise&&!d&&!r)return new Promise((function(e,o){if(r=function(t,n){t?o(t):e(n)},l)return u(x.error(new Error(l)));t.call(i,n,u)}));if(l)return u(x.error(new Error(l)));var p=t.call(i,n,u);return d?p:void 0}},xml2json:a,json2xml:s,md5:o,clearKey:g,fileSlice:function(e,t,n,r,o){var i;if(e.slice?i=e.slice(t,n):e.mozSlice?i=e.mozSlice(t,n):e.webkitSlice&&(i=e.webkitSlice(t,n)),r&&y){var a=new FileReader;a.onload=function(e){i=null,o(new Blob([a.result]))},a.readAsArrayBuffer(i)}else o(i)},getBodyMd5:function(e,t,n,r){n=n||m,e?"string"==typeof t?n(x.md5(t,!0)):Blob&&t instanceof Blob?x.getFileMd5(t,(function(e,t){n(t)}),r):n():n()},getFileMd5:function(e,t,n){var r=e.size,i=0,a=o.getCtx();!function o(s){if(s>=r){var c=a.digest("hex");t(null,c)}else{var u=Math.min(r,s+v);x.fileSlice(e,s,u,!1,(function(e){!function(e,t){var n,r=new FileReader;FileReader.prototype.readAsBinaryString?(n=FileReader.prototype.readAsBinaryString,r.onload=function(){t(this.result)}):FileReader.prototype.readAsArrayBuffer&&(n=function(e){var n="",r=new FileReader;r.onload=function(e){for(var o=new Uint8Array(r.result),i=o.byteLength,a=0;a-1||p.indexOf(r)>-1)&&(t[n]=e[n])}return t}(C(e.Headers||e.headers||{})),u=e.Key||"";e.UseRawKey?t=e.Pathname||e.pathname||"/"+u:0!==(t=e.Pathname||e.pathname||u).indexOf("/")&&(t="/"+t);var d=!1!==e.ForceSignHost;if(!c.Host&&!c.host&&e.Bucket&&e.Region&&d&&(c.Host=e.Bucket+".cos."+e.Region+".myqcloud.com"),!n)throw new Error("missing param SecretId");if(!r)throw new Error("missing param SecretKey");var f=Math.round(E(e.SystemClockOffset)/1e3)-1,h=f,m=e.Expires||e.expires;h+=void 0===m?900:1*m||0;var g=n,y=o||f+";"+h,v=o||f+";"+h,k=l(c,!0).join(";").toLowerCase(),b=l(s,!0).join(";").toLowerCase(),S=i.HmacSHA1(v,r).toString(),w=[a,t,x.obj2str(s,!0),x.obj2str(c,!0),""].join("\n"),T=["sha1",y,i.SHA1(w).toString(),""].join("\n");return["q-sign-algorithm=sha1","q-ak="+g,"q-sign-time="+y,"q-key-time="+v,"q-header-list="+k,"q-url-param-list="+b,"q-signature="+i.HmacSHA1(T,S).toString()].join("&")},parseSelectPayload:function(e){for(var t={},n=h(e),r={records:[]};e.byteLength;){var o,i=f(e,32,0),a=f(e,32,4),s=i-a-16,c=0;for(e=e.slice(12);c1)for(var n=1;n=0))throw x(R,new Error(e.tagName+"@"+n));for(var o=t.length-1;r"==e&&">")||"&"==e&&"&"||'"'==e&&"""||"&#"+e.charCodeAt()+";"}function L(e,t){if(t(e))return!0;if(e=e.firstChild)do{if(L(e,t))return!0}while(e=e.nextSibling)}function H(){}function j(e,t,n,o){e&&e._inc++,n.namespaceURI===r.XMLNS&&delete t._nsMap[n.prefix?n.localName:""]}function F(e,t,n){if(e&&e._inc){e._inc++;var r=t.childNodes;if(n)r[r.length++]=n;else{for(var o=t.firstChild,i=0;o;)r[i++]=o,o=o.nextSibling;r.length=i,delete r[r.length]}}}function K(e,t){var n=t.previousSibling,r=t.nextSibling;return n?n.nextSibling=r:e.firstChild=r,r?r.previousSibling=n:e.lastChild=n,t.parentNode=null,t.previousSibling=null,t.nextSibling=null,F(e.ownerDocument,e),t}function q(e,t,n){var r=t.parentNode;if(r&&r.removeChild(t),t.nodeType===k){var o=t.firstChild;if(null==o)return t;var i=t.lastChild}else o=i=t;var a=n?n.previousSibling:e.lastChild;o.previousSibling=a,i.nextSibling=n,a?a.nextSibling=o:e.firstChild=o,null==n?e.lastChild=i:n.previousSibling=i;do{o.parentNode=e}while(o!==i&&(o=o.nextSibling));return F(e.ownerDocument||e,e),t.nodeType==k&&(t.firstChild=t.lastChild=null),t}function z(){this._nsMap={}}function G(){}function V(){}function X(){}function W(){}function J(){}function Q(){}function $(){}function Y(){}function Z(){}function ee(){}function te(){}function ne(){}function re(e,t){var n=[],r=9==this.nodeType&&this.documentElement||this,o=r.prefix,i=r.namespaceURI;if(i&&null==o&&null==(o=r.lookupPrefix(i)))var a=[{namespace:i,prefix:null}];return ae(this,n,e,t,a),n.join("")}function oe(e,t,n){var o=e.prefix||"",i=e.namespaceURI;if(!i)return!1;if("xml"===o&&i===r.XML||i===r.XMLNS)return!1;for(var a=n.length;a--;){var s=n[a];if(s.prefix===o)return s.namespace!==i}return!0}function ie(e,t,n){e.push(" ",t,'="',n.replace(/[<>&"\t\n\r]/g,M),'"')}function ae(e,t,n,o,i){if(i||(i=[]),o){if(!(e=o(e)))return;if("string"==typeof e)return void t.push(e)}switch(e.nodeType){case l:var a=e.attributes,s=a.length,c=e.firstChild,u=e.tagName,m=u;if(!(n=r.isHTML(e.namespaceURI)||n)&&!e.prefix&&e.namespaceURI){for(var b,S=0;S=0;w--){if(""===(T=i[w]).prefix&&T.namespace===e.namespaceURI){b=T.namespace;break}}if(b!==e.namespaceURI)for(w=i.length-1;w>=0;w--){var T;if((T=i[w]).namespace===e.namespaceURI){T.prefix&&(m=T.prefix+":"+u);break}}}t.push("<",m);for(var R=0;R"),n&&/^script$/i.test(u))for(;c;)c.data?t.push(c.data):ae(c,t,n,o,i.slice()),c=c.nextSibling;else for(;c;)ae(c,t,n,o,i.slice()),c=c.nextSibling;t.push("")}else t.push("/>");return;case v:case k:for(c=e.firstChild;c;)ae(c,t,n,o,i.slice()),c=c.nextSibling;return;case d:return ie(t,e.name,e.value);case p:return t.push(e.data.replace(/[<&>]/g,M));case f:return t.push("");case y:return t.push("\x3c!--",e.data,"--\x3e");case C:var B=e.publicId,I=e.systemId;if(t.push("");else if(I&&"."!=I)t.push(" SYSTEM ",I,">");else{var O=e.internalSubset;O&&t.push(" [",O,"]"),t.push(">")}return;case g:return t.push("");case h:return t.push("&",e.nodeName,";");default:t.push("??",e.nodeName)}}function se(e,t,n){var r;switch(t.nodeType){case l:(r=t.cloneNode(!1)).ownerDocument=e;case k:break;case d:n=!0}if(r||(r=t.cloneNode(!1)),r.ownerDocument=e,r.parentNode=null,n)for(var o=t.firstChild;o;)r.appendChild(se(e,o,n)),o=o.nextSibling;return r}function ce(e,t,n){var r=new t.constructor;for(var o in t){var i=t[o];"object"!=typeof i&&i!=r[o]&&(r[o]=i)}switch(t.childNodes&&(r.childNodes=new A),r.ownerDocument=e,r.nodeType){case l:var a=t.attributes,s=r.attributes=new O,c=a.length;s._ownerElement=r;for(var u=0;u0},lookupPrefix:function(e){for(var t=this;t;){var n=t._nsMap;if(n)for(var r in n)if(n[r]==e)return r;t=t.nodeType==d?t.ownerDocument:t.parentNode}return null},lookupNamespaceURI:function(e){for(var t=this;t;){var n=t._nsMap;if(n&&e in n)return n[e];t=t.nodeType==d?t.ownerDocument:t.parentNode}return null},isDefaultNamespace:function(e){return null==this.lookupPrefix(e)}},s(u,U),s(u,U.prototype),H.prototype={nodeName:"#document",nodeType:v,doctype:null,documentElement:null,_inc:1,insertBefore:function(e,t){if(e.nodeType==k){for(var n=e.firstChild;n;){var r=n.nextSibling;this.insertBefore(n,t),n=r}return e}return null==this.documentElement&&e.nodeType==l&&(this.documentElement=e),q(this,e,t),e.ownerDocument=this,e},removeChild:function(e){return this.documentElement==e&&(this.documentElement=null),K(this,e)},importNode:function(e,t){return se(this,e,t)},getElementById:function(e){var t=null;return L(this.documentElement,(function(n){if(n.nodeType==l&&n.getAttribute("id")==e)return t=n,!0})),t},getElementsByClassName:function(e){var t=a(e);return new B(this,(function(n){var r=[];return t.length>0&&L(n.documentElement,(function(o){if(o!==n&&o.nodeType===l){var i=o.getAttribute("class");if(i){var s=e===i;if(!s){var c=a(i);s=t.every((u=c,function(e){return u&&-1!==u.indexOf(e)}))}s&&r.push(o)}}var u})),r}))},createElement:function(e){var t=new z;return t.ownerDocument=this,t.nodeName=e,t.tagName=e,t.localName=e,t.childNodes=new A,(t.attributes=new O)._ownerElement=t,t},createDocumentFragment:function(){var e=new ee;return e.ownerDocument=this,e.childNodes=new A,e},createTextNode:function(e){var t=new X;return t.ownerDocument=this,t.appendData(e),t},createComment:function(e){var t=new W;return t.ownerDocument=this,t.appendData(e),t},createCDATASection:function(e){var t=new J;return t.ownerDocument=this,t.appendData(e),t},createProcessingInstruction:function(e,t){var n=new te;return n.ownerDocument=this,n.tagName=n.target=e,n.nodeValue=n.data=t,n},createAttribute:function(e){var t=new G;return t.ownerDocument=this,t.name=e,t.nodeName=e,t.localName=e,t.specified=!0,t},createEntityReference:function(e){var t=new Z;return t.ownerDocument=this,t.nodeName=e,t},createElementNS:function(e,t){var n=new z,r=t.split(":"),o=n.attributes=new O;return n.childNodes=new A,n.ownerDocument=this,n.nodeName=t,n.tagName=t,n.namespaceURI=e,2==r.length?(n.prefix=r[0],n.localName=r[1]):n.localName=t,o._ownerElement=n,n},createAttributeNS:function(e,t){var n=new G,r=t.split(":");return n.ownerDocument=this,n.nodeName=t,n.name=t,n.namespaceURI=e,n.specified=!0,2==r.length?(n.prefix=r[0],n.localName=r[1]):n.localName=t,n}},c(H,U),z.prototype={nodeType:l,hasAttribute:function(e){return null!=this.getAttributeNode(e)},getAttribute:function(e){var t=this.getAttributeNode(e);return t&&t.value||""},getAttributeNode:function(e){return this.attributes.getNamedItem(e)},setAttribute:function(e,t){var n=this.ownerDocument.createAttribute(e);n.value=n.nodeValue=""+t,this.setAttributeNode(n)},removeAttribute:function(e){var t=this.getAttributeNode(e);t&&this.removeAttributeNode(t)},appendChild:function(e){return e.nodeType===k?this.insertBefore(e,null):function(e,t){return t.parentNode&&t.parentNode.removeChild(t),t.parentNode=e,t.previousSibling=e.lastChild,t.nextSibling=null,t.previousSibling?t.previousSibling.nextSibling=t:e.firstChild=t,e.lastChild=t,F(e.ownerDocument,e,t),t}(this,e)},setAttributeNode:function(e){return this.attributes.setNamedItem(e)},setAttributeNodeNS:function(e){return this.attributes.setNamedItemNS(e)},removeAttributeNode:function(e){return this.attributes.removeNamedItem(e.nodeName)},removeAttributeNS:function(e,t){var n=this.getAttributeNodeNS(e,t);n&&this.removeAttributeNode(n)},hasAttributeNS:function(e,t){return null!=this.getAttributeNodeNS(e,t)},getAttributeNS:function(e,t){var n=this.getAttributeNodeNS(e,t);return n&&n.value||""},setAttributeNS:function(e,t,n){var r=this.ownerDocument.createAttributeNS(e,t);r.value=r.nodeValue=""+n,this.setAttributeNode(r)},getAttributeNodeNS:function(e,t){return this.attributes.getNamedItemNS(e,t)},getElementsByTagName:function(e){return new B(this,(function(t){var n=[];return L(t,(function(r){r===t||r.nodeType!=l||"*"!==e&&r.tagName!=e||n.push(r)})),n}))},getElementsByTagNameNS:function(e,t){return new B(this,(function(n){var r=[];return L(n,(function(o){o===n||o.nodeType!==l||"*"!==e&&o.namespaceURI!==e||"*"!==t&&o.localName!=t||r.push(o)})),r}))}},H.prototype.getElementsByTagName=z.prototype.getElementsByTagName,H.prototype.getElementsByTagNameNS=z.prototype.getElementsByTagNameNS,c(z,U),G.prototype.nodeType=d,c(G,U),V.prototype={data:"",substringData:function(e,t){return this.data.substring(e,e+t)},appendData:function(e){e=this.data+e,this.nodeValue=this.data=e,this.length=e.length},insertData:function(e,t){this.replaceData(e,0,t)},appendChild:function(e){throw new Error(w[T])},deleteData:function(e,t){this.replaceData(e,t,"")},replaceData:function(e,t,n){n=this.data.substring(0,e)+n+this.data.substring(e+t),this.nodeValue=this.data=n,this.length=n.length}},c(V,U),X.prototype={nodeName:"#text",nodeType:p,splitText:function(e){var t=this.data,n=t.substring(e);t=t.substring(0,e),this.data=this.nodeValue=t,this.length=t.length;var r=this.ownerDocument.createTextNode(n);return this.parentNode&&this.parentNode.insertBefore(r,this.nextSibling),r}},c(X,V),W.prototype={nodeName:"#comment",nodeType:y},c(W,V),J.prototype={nodeName:"#cdata-section",nodeType:f},c(J,V),Q.prototype.nodeType=C,c(Q,U),$.prototype.nodeType=b,c($,U),Y.prototype.nodeType=m,c(Y,U),Z.prototype.nodeType=h,c(Z,U),ee.prototype.nodeName="#document-fragment",ee.prototype.nodeType=k,c(ee,U),te.prototype.nodeType=g,c(te,U),ne.prototype.serializeToString=function(e,t,n){return re.call(e,t,n)},U.prototype.toString=re;try{if(Object.defineProperty){function le(e){switch(e.nodeType){case l:case k:var t=[];for(e=e.firstChild;e;)7!==e.nodeType&&8!==e.nodeType&&t.push(le(e)),e=e.nextSibling;return t.join("");default:return e.nodeValue}}Object.defineProperty(B.prototype,"length",{get:function(){return I(this),this.$$length}}),Object.defineProperty(U.prototype,"textContent",{get:function(){return le(this)},set:function(e){switch(this.nodeType){case l:case k:for(;this.firstChild;)this.removeChild(this.firstChild);(e||String(e))&&this.appendChild(this.ownerDocument.createTextNode(e));break;default:this.data=e,this.value=e,this.nodeValue=e}}}),ue=function(e,t,n){e["$$"+t]=n}}}catch(de){}t.DocumentType=Q,t.DOMException=x,t.DOMImplementation=N,t.Element=z,t.Node=U,t.NodeList=A,t.XMLSerializer=ne},function(e,t,n){function r(e,t){for(var n=0;n=0||e.indexOf("wow32")>=0?"win32":e.indexOf("win64")>=0||e.indexOf("wow64")>=0?"win64":t?"mac":"unknown os"},d=function(){return!("object"!==("undefined"==typeof navigator?"undefined":o(navigator))||!navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))},p=function(){return!("object"!==("undefined"==typeof navigator?"undefined":o(navigator))||!navigator.userAgent.match(/(Android|Adr|Linux)/i))},f=function(){return!("object"!==("undefined"==typeof navigator?"undefined":o(navigator))||!navigator.userAgent.match(/(iPhone|iPod|iPad|iOS)/i))},h=function(){if("object"!==("undefined"==typeof navigator?"undefined":o(navigator)))return"unknown device";var e=navigator.userAgent.toLowerCase();if(e.includes("app/tencent_wemeet"))return"tencent_wemeet";if(e.indexOf("maxthon")>=0){var t=e.match(/maxthon\/([\d.]+)/),n=t&&t[1]||"";return"傲游浏览器 ".concat(n).trim()}if(e.indexOf("qqbrowser")>=0){var r=e.match(/qqbrowser\/([\d.]+)/),i=r&&r[1]||"";return"QQ浏览器 ".concat(i).trim()}if(e.indexOf("se 2.x")>=0)return"搜狗浏览器";if(e.indexOf("wxwork")>=0)return"微信内置浏览器";if(e.indexOf("msie")>=0){var a=e.match(/msie ([\d.]+)/),s=a&&a[1]||"";return"IE ".concat(s).trim()}if(e.indexOf("firefox")>=0){var c=e.match(/firefox\/([\d.]+)/),u=c&&c[1]||"";return"Firefox ".concat(u).trim()}if(e.indexOf("chrome")>=0){var l=e.match(/chrome\/([\d.]+)/),d=l&&l[1]||"";return"Chrome ".concat(d).trim()}if(e.indexOf("opera")>=0){var p=e.match(/opera.([\d.]+)/),f=p&&p[1]||"";return"Opera ".concat(f).trim()}if(e.indexOf("safari")>=0){var h=e.match(/version\/([\d.]+)/),m=h&&h[1]||"";return"Safari ".concat(m).trim()}if(e.indexOf("edge")>=0){var g=e.match(/edge\/([\d.]+)/),y=g&&g[1]||"";return"edge ".concat(y).trim()}return e.substr(0,200)},m={isMobile:d(),isBrowser:!d(),mobileOsType:p()?"android":f?"ios":"other_mobile",pcOsType:l()},g={deviceType:m.isMobile?"mobile":m.isBrowser?"browser":"unknown",devicePlatform:m.isMobile?m.mobileOsType:m.pcOsType,deviceName:h()},y=["multipartInit","multipartUpload","multipartComplete","multipartList","multipartListPart","multipartAbort"],v=["putObject","postObject","appendObject","sliceUploadFile","uploadFile","uploadFiles"].concat(y),C=["getObject"];function k(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase()}var b=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e);var n=t.parent,r=t.traceId,o=t.bucket,u=t.region,l=t.apiName,d=t.fileKey,p=t.fileSize,f=t.accelerate,h=t.customId,m=t.delay,y=t.deepTracker,v=o&&o.substr(o.lastIndexOf("-")+1)||"";this.parent=n,this.deepTracker=y,this.params={cossdkVersion:i.version,region:u,networkType:"",host:"",accelerate:f?"Y":"N",requestPath:d||"",size:p||-1,httpMd5:0,httpSign:0,httpFull:0,name:l||"",result:"",tookTime:0,errorNode:"",errorCode:"",errorMessage:"",errorRequestId:"",errorStatusCode:0,errorServiceName:"",tracePlatform:"cos-js-sdk-v5",traceId:r||c(),bucket:o,appid:v,partNumber:0,retryTimes:0,reqUrl:"",customId:h||"",deviceType:g.deviceType,devicePlatform:g.devicePlatform,deviceName:g.deviceName,md5StartTime:0,md5EndTime:0,signStartTime:0,signEndTime:0,httpStartTime:0,httpEndTime:0,startTime:(new Date).getTime(),endTime:0},this.beacon=function(e){return s||(s=new a({appkey:"0AND0VEVB24UBGDU",versionCode:i.version,channelID:"js_sdk",openid:"openid",unionid:"unid",strictMode:!1,delay:e,sessionDuration:6e4})),s}(m)}var t,n,o;return t=e,(n=[{key:"formatResult",value:function(e,t){var n,r,o,i,a,s,c=(new Date).getTime()-this.params.startTime,l=u(),d=e?(null==e?void 0:e.code)||(null==e||null===(n=e.error)||void 0===n?void 0:n.code)||(null==e||null===(r=e.error)||void 0===r?void 0:r.Code):"",p=e?(null==e?void 0:e.message)||(null==e||null===(o=e.error)||void 0===o?void 0:o.message)||(null==e||null===(i=e.error)||void 0===i?void 0:i.Message):"",f=e?(null==e?void 0:e.resource)||(null==e||null===(a=e.error)||void 0===a?void 0:a.resource)||(null==e||null===(s=e.error)||void 0===s?void 0:s.Resource):"",h=e?null==e?void 0:e.statusCode:t.statusCode,m=e?(null==e?void 0:e.headers)&&(null==e?void 0:e.headers["x-cos-request-id"]):(null==t?void 0:t.headers)&&(null==t?void 0:t.headers["x-cos-request-id"]),g=e?m?"Server":"Client":"";if(Object.assign(this.params,{tookTime:c,networkType:l,httpMd5:this.params.md5EndTime-this.params.md5StartTime,httpSign:this.params.signEndTime-this.params.signStartTime,httpFull:this.params.httpEndTime-this.params.httpStartTime,result:e?"Fail":"Success",errorType:g,errorCode:d,errorStatusCode:h,errorMessage:p,errorServiceName:f,errorRequestId:m}),!e||d&&p||(this.params.fullError=e?JSON.stringify(e):""),"getObject"===this.params.name&&(this.params.size=t?t.headers&&t.headers["content-length"]:-1),this.params.reqUrl)try{var y=/^http(s)?:\/\/(.*?)\//.exec(this.params.reqUrl);this.params.host=y[2]}catch(e){this.params.host=this.params.reqUrl}this.sendEvents()}},{key:"setParams",value:function(e){Object.assign(this.params,e)}},{key:"sendEvents",value:function(){if(!y.includes(this.params.name)||this.deepTracker){var e,t=(e=this.params.name,v.includes(e)?"cos_upload":C.includes(e)?"cos_download":"base_service"),n=function(e){var t={},n="Success"===e.result?["tracePlatform","cossdkVersion","region","bucket","appid","networkType","host","accelerate","requestPath","partNumber","size","name","result","tookTime","errorRequestId","retryTimes","reqUrl","customId","deviceType","devicePlatform","deviceName"]:["tracePlatform","cossdkVersion","region","networkType","host","accelerate","requestPath","size","httpMd5","httpSign","httpFull","name","result","tookTime","errorNode","errorCode","errorMessage","errorRequestId","errorStatusCode","errorServiceName","errorType","traceId","bucket","appid","partNumber","retryTimes","reqUrl","customId","fullError","deviceType","devicePlatform","deviceName"];for(var r in e)n.includes(r)&&(t[k(r)]=e[r]);return t}(this.params);0===this.params.delay?this.beacon.onDirectUserAction(t,n):this.beacon.onUserAction(t,n),this.destroy()}}},{key:"generateSubTracker",value:function(t){return Object.assign(t,{parent:this,deepTracker:this.deepTracker,traceId:this.params.traceId,bucket:this.params.bucket,region:this.params.region,fileKey:this.params.requestPath,customId:this.params.customId,delay:this.params.delay}),new e(t)}},{key:"destroy",value:function(){this.beacon=null,this.params={}}}])&&r(t.prototype,n),o&&r(t,o),Object.defineProperty(t,"prototype",{writable:!1}),e}();e.exports=b},function(e){e.exports=JSON.parse('{"name":"cos-js-sdk-v5","version":"1.4.0","description":"JavaScript SDK for [腾讯云对象存储](https://cloud.tencent.com/product/cos)","main":"index.js","types":"index.d.ts","scripts":{"server":"node server/sts.js","dev":"cross-env NODE_ENV=development webpack -w --mode=development","build":"cross-env NODE_ENV=production webpack --mode=production","cos-auth.min.js":"uglifyjs ./demo/common/cos-auth.js -o ./demo/common/cos-auth.min.js -c -m","nyc":"node test/watcher.js && nyc report --reporter=clover --reporter=cobertura"},"repository":{"type":"git","url":"git+https://github.com/tencentyun/cos-js-sdk-v5.git"},"keywords":[],"author":"carsonxu","license":"ISC","bugs":{"url":"https://github.com/tencentyun/cos-js-sdk-v5/issues"},"homepage":"https://github.com/tencentyun/cos-js-sdk-v5#readme","dependencies":{"@xmldom/xmldom":"^0.8.2"},"devDependencies":{"@babel/core":"7.17.9","@babel/preset-env":"7.16.11","babel-loader":"8.2.5","body-parser":"^1.18.3","cross-env":"^5.2.0","express":"^4.16.4","nyc":"^15.1.0","puppeteer":"^5.3.1","puppeteer-to-istanbul":"^1.4.0","qcloud-cos-sts":"^3.0.2","request":"^2.87.0","webpack":"4.46.0","webpack-cli":"4.10.0","terser-webpack-plugin":"4.2.3"}}')},function(e,t){var n=function(e){var t={},n=function(e){return!t[e]&&(t[e]=[]),t[e]};e.on=function(e,t){n(e).push(t)},e.off=function(e,t){for(var r=n(e),o=r.length-1;o>=0;o--)t===r[o]&&r.splice(o,1)},e.emit=function(e,t){for(var r=n(e).map((function(e){return e})),o=0;o=0;n--){var o=r[n][2];(!o||o+2592e3=0;o--){var i=r[o];i[0]===e&&i[1]===t&&r.splice(o,1)}r.unshift([e,t,Math.round(Date.now()/1e3)]),r.length>n&&r.splice(n),l()}},removeUploadId:function(e){u.call(this),delete d.using[e];for(var t=r.length-1;t>=0;t--)r[t][1]===e&&r.splice(t,1);l()}};e.exports=d},function(e,t,n){var r=n(11);e.exports=r},function(e,t,n){"use strict";var r=n(0),o=n(8),i=n(22),a=n(23),s=n(25),c=n(7),u={AppId:"",SecretId:"",SecretKey:"",SecurityToken:"",ChunkRetryTimes:2,FileParallelLimit:3,ChunkParallelLimit:3,ChunkSize:1048576,SliceSize:1048576,CopyChunkParallelLimit:20,CopyChunkSize:10485760,CopySliceSize:10485760,MaxPartNumber:1e4,ProgressInterval:1e3,Domain:"",ServiceDomain:"",Protocol:"",CompatibilityMode:!1,ForcePathStyle:!1,UseRawKey:!1,Timeout:0,CorrectClockSkew:!0,SystemClockOffset:0,UploadCheckContentMd5:!1,UploadQueueSize:1e4,UploadAddMetaMd5:!1,UploadIdCacheLimit:50,UseAccelerate:!1,ForceSignHost:!0,EnableTracker:!1,DeepTracker:!1,TrackerDelay:5e3,CustomId:""},l=function(e){this.options=r.extend(r.clone(u),e||{}),this.options.FileParallelLimit=Math.max(1,this.options.FileParallelLimit),this.options.ChunkParallelLimit=Math.max(1,this.options.ChunkParallelLimit),this.options.ChunkRetryTimes=Math.max(0,this.options.ChunkRetryTimes),this.options.ChunkSize=Math.max(1048576,this.options.ChunkSize),this.options.CopyChunkParallelLimit=Math.max(1,this.options.CopyChunkParallelLimit),this.options.CopyChunkSize=Math.max(1048576,this.options.CopyChunkSize),this.options.CopySliceSize=Math.max(0,this.options.CopySliceSize),this.options.MaxPartNumber=Math.max(1024,Math.min(1e4,this.options.MaxPartNumber)),this.options.Timeout=Math.max(0,this.options.Timeout),this.options.AppId,this.options.SecretId&&this.options.SecretId.indexOf(" "),this.options.SecretKey&&this.options.SecretKey.indexOf(" "),r.isNode(),o.init(this),i.init(this)};a.init(l,i),s.init(l,i),l.util={md5:r.md5,xml2json:r.xml2json,json2xml:r.json2xml},l.getAuthorization=r.getAuth,l.version=c.version,e.exports=l},function(module,exports,__webpack_require__){(function(process,global,module){var __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}(function(){"use strict";var ERROR="input is invalid type",WINDOW="object"===("undefined"==typeof window?"undefined":_typeof(window)),root=WINDOW?window:{};root.JS_MD5_NO_WINDOW&&(WINDOW=!1);var WEB_WORKER=!WINDOW&&"object"===("undefined"==typeof self?"undefined":_typeof(self)),NODE_JS=!root.JS_MD5_NO_NODE_JS&&"object"===(void 0===process?"undefined":_typeof(process))&&process.versions&&process.versions.node;NODE_JS?root=global:WEB_WORKER&&(root=self);var COMMON_JS=!root.JS_MD5_NO_COMMON_JS&&"object"===_typeof(module)&&module.exports,AMD=__webpack_require__(13),ARRAY_BUFFER=!root.JS_MD5_NO_ARRAY_BUFFER&&"undefined"!=typeof ArrayBuffer,HEX_CHARS="0123456789abcdef".split(""),EXTRA=[128,32768,8388608,-2147483648],SHIFT=[0,8,16,24],OUTPUT_TYPES=["hex","array","digest","buffer","arrayBuffer","base64"],BASE64_ENCODE_CHAR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),blocks=[],buffer8;if(ARRAY_BUFFER){var buffer=new ArrayBuffer(68);buffer8=new Uint8Array(buffer),blocks=new Uint32Array(buffer)}!root.JS_MD5_NO_NODE_JS&&Array.isArray||(Array.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)}),!ARRAY_BUFFER||!root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW&&ArrayBuffer.isView||(ArrayBuffer.isView=function(e){return"object"===_typeof(e)&&e.buffer&&e.buffer.constructor===ArrayBuffer});var createOutputMethod=function(e){return function(t,n){return new Md5(!0).update(t,n)[e]()}},createMethod=function(){var e=createOutputMethod("hex");NODE_JS&&(e=nodeWrap(e)),e.getCtx=e.create=function(){return new Md5},e.update=function(t){return e.create().update(t)};for(var t=0;t>6,s[r++]=128|63&n):n<55296||n>=57344?(s[r++]=224|n>>12,s[r++]=128|n>>6&63,s[r++]=128|63&n):(n=65536+((1023&n)<<10|1023&e.charCodeAt(++o)),s[r++]=240|n>>18,s[r++]=128|n>>12&63,s[r++]=128|n>>6&63,s[r++]=128|63&n);else for(r=this.start;o>2]|=n<>2]|=(192|n>>6)<>2]|=(128|63&n)<=57344?(a[r>>2]|=(224|n>>12)<>2]|=(128|n>>6&63)<>2]|=(128|63&n)<>2]|=(240|n>>18)<>2]|=(128|n>>12&63)<>2]|=(128|n>>6&63)<>2]|=(128|63&n)<=64?(this.start=r-64,this.hash(),this.hashed=!0):this.start=r}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296<<0,this.bytes=this.bytes%4294967296),this}},Md5.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var e=this.blocks,t=this.lastByteIndex;e[t>>2]|=EXTRA[3&t],t>=56&&(this.hashed||this.hash(),e[0]=e[16],e[16]=e[1]=e[2]=e[3]=e[4]=e[5]=e[6]=e[7]=e[8]=e[9]=e[10]=e[11]=e[12]=e[13]=e[14]=e[15]=0),e[14]=this.bytes<<3,e[15]=this.hBytes<<3|this.bytes>>>29,this.hash()}},Md5.prototype.hash=function(){var e,t,n,r,o,i,a=this.blocks;this.first?t=((t=((e=((e=a[0]-680876937)<<7|e>>>25)-271733879<<0)^(n=((n=(-271733879^(r=((r=(-1732584194^2004318071&e)+a[1]-117830708)<<12|r>>>20)+e<<0)&(-271733879^e))+a[2]-1126478375)<<17|n>>>15)+r<<0)&(r^e))+a[3]-1316259209)<<22|t>>>10)+n<<0:(e=this.h0,t=this.h1,n=this.h2,t=((t+=((e=((e+=((r=this.h3)^t&(n^r))+a[0]-680876936)<<7|e>>>25)+t<<0)^(n=((n+=(t^(r=((r+=(n^e&(t^n))+a[1]-389564586)<<12|r>>>20)+e<<0)&(e^t))+a[2]+606105819)<<17|n>>>15)+r<<0)&(r^e))+a[3]-1044525330)<<22|t>>>10)+n<<0),t=((t+=((e=((e+=(r^t&(n^r))+a[4]-176418897)<<7|e>>>25)+t<<0)^(n=((n+=(t^(r=((r+=(n^e&(t^n))+a[5]+1200080426)<<12|r>>>20)+e<<0)&(e^t))+a[6]-1473231341)<<17|n>>>15)+r<<0)&(r^e))+a[7]-45705983)<<22|t>>>10)+n<<0,t=((t+=((e=((e+=(r^t&(n^r))+a[8]+1770035416)<<7|e>>>25)+t<<0)^(n=((n+=(t^(r=((r+=(n^e&(t^n))+a[9]-1958414417)<<12|r>>>20)+e<<0)&(e^t))+a[10]-42063)<<17|n>>>15)+r<<0)&(r^e))+a[11]-1990404162)<<22|t>>>10)+n<<0,t=((t+=((e=((e+=(r^t&(n^r))+a[12]+1804603682)<<7|e>>>25)+t<<0)^(n=((n+=(t^(r=((r+=(n^e&(t^n))+a[13]-40341101)<<12|r>>>20)+e<<0)&(e^t))+a[14]-1502002290)<<17|n>>>15)+r<<0)&(r^e))+a[15]+1236535329)<<22|t>>>10)+n<<0,t=((t+=((r=((r+=(t^n&((e=((e+=(n^r&(t^n))+a[1]-165796510)<<5|e>>>27)+t<<0)^t))+a[6]-1069501632)<<9|r>>>23)+e<<0)^e&((n=((n+=(e^t&(r^e))+a[11]+643717713)<<14|n>>>18)+r<<0)^r))+a[0]-373897302)<<20|t>>>12)+n<<0,t=((t+=((r=((r+=(t^n&((e=((e+=(n^r&(t^n))+a[5]-701558691)<<5|e>>>27)+t<<0)^t))+a[10]+38016083)<<9|r>>>23)+e<<0)^e&((n=((n+=(e^t&(r^e))+a[15]-660478335)<<14|n>>>18)+r<<0)^r))+a[4]-405537848)<<20|t>>>12)+n<<0,t=((t+=((r=((r+=(t^n&((e=((e+=(n^r&(t^n))+a[9]+568446438)<<5|e>>>27)+t<<0)^t))+a[14]-1019803690)<<9|r>>>23)+e<<0)^e&((n=((n+=(e^t&(r^e))+a[3]-187363961)<<14|n>>>18)+r<<0)^r))+a[8]+1163531501)<<20|t>>>12)+n<<0,t=((t+=((r=((r+=(t^n&((e=((e+=(n^r&(t^n))+a[13]-1444681467)<<5|e>>>27)+t<<0)^t))+a[2]-51403784)<<9|r>>>23)+e<<0)^e&((n=((n+=(e^t&(r^e))+a[7]+1735328473)<<14|n>>>18)+r<<0)^r))+a[12]-1926607734)<<20|t>>>12)+n<<0,t=((t+=((i=(r=((r+=((o=t^n)^(e=((e+=(o^r)+a[5]-378558)<<4|e>>>28)+t<<0))+a[8]-2022574463)<<11|r>>>21)+e<<0)^e)^(n=((n+=(i^t)+a[11]+1839030562)<<16|n>>>16)+r<<0))+a[14]-35309556)<<23|t>>>9)+n<<0,t=((t+=((i=(r=((r+=((o=t^n)^(e=((e+=(o^r)+a[1]-1530992060)<<4|e>>>28)+t<<0))+a[4]+1272893353)<<11|r>>>21)+e<<0)^e)^(n=((n+=(i^t)+a[7]-155497632)<<16|n>>>16)+r<<0))+a[10]-1094730640)<<23|t>>>9)+n<<0,t=((t+=((i=(r=((r+=((o=t^n)^(e=((e+=(o^r)+a[13]+681279174)<<4|e>>>28)+t<<0))+a[0]-358537222)<<11|r>>>21)+e<<0)^e)^(n=((n+=(i^t)+a[3]-722521979)<<16|n>>>16)+r<<0))+a[6]+76029189)<<23|t>>>9)+n<<0,t=((t+=((i=(r=((r+=((o=t^n)^(e=((e+=(o^r)+a[9]-640364487)<<4|e>>>28)+t<<0))+a[12]-421815835)<<11|r>>>21)+e<<0)^e)^(n=((n+=(i^t)+a[15]+530742520)<<16|n>>>16)+r<<0))+a[2]-995338651)<<23|t>>>9)+n<<0,t=((t+=((r=((r+=(t^((e=((e+=(n^(t|~r))+a[0]-198630844)<<6|e>>>26)+t<<0)|~n))+a[7]+1126891415)<<10|r>>>22)+e<<0)^((n=((n+=(e^(r|~t))+a[14]-1416354905)<<15|n>>>17)+r<<0)|~e))+a[5]-57434055)<<21|t>>>11)+n<<0,t=((t+=((r=((r+=(t^((e=((e+=(n^(t|~r))+a[12]+1700485571)<<6|e>>>26)+t<<0)|~n))+a[3]-1894986606)<<10|r>>>22)+e<<0)^((n=((n+=(e^(r|~t))+a[10]-1051523)<<15|n>>>17)+r<<0)|~e))+a[1]-2054922799)<<21|t>>>11)+n<<0,t=((t+=((r=((r+=(t^((e=((e+=(n^(t|~r))+a[8]+1873313359)<<6|e>>>26)+t<<0)|~n))+a[15]-30611744)<<10|r>>>22)+e<<0)^((n=((n+=(e^(r|~t))+a[6]-1560198380)<<15|n>>>17)+r<<0)|~e))+a[13]+1309151649)<<21|t>>>11)+n<<0,t=((t+=((r=((r+=(t^((e=((e+=(n^(t|~r))+a[4]-145523070)<<6|e>>>26)+t<<0)|~n))+a[11]-1120210379)<<10|r>>>22)+e<<0)^((n=((n+=(e^(r|~t))+a[2]+718787259)<<15|n>>>17)+r<<0)|~e))+a[9]-343485551)<<21|t>>>11)+n<<0,this.first?(this.h0=e+1732584193<<0,this.h1=t-271733879<<0,this.h2=n-1732584194<<0,this.h3=r+271733878<<0,this.first=!1):(this.h0=this.h0+e<<0,this.h1=this.h1+t<<0,this.h2=this.h2+n<<0,this.h3=this.h3+r<<0)},Md5.prototype.hex=function(){this.finalize();var e=this.h0,t=this.h1,n=this.h2,r=this.h3;return HEX_CHARS[e>>4&15]+HEX_CHARS[15&e]+HEX_CHARS[e>>12&15]+HEX_CHARS[e>>8&15]+HEX_CHARS[e>>20&15]+HEX_CHARS[e>>16&15]+HEX_CHARS[e>>28&15]+HEX_CHARS[e>>24&15]+HEX_CHARS[t>>4&15]+HEX_CHARS[15&t]+HEX_CHARS[t>>12&15]+HEX_CHARS[t>>8&15]+HEX_CHARS[t>>20&15]+HEX_CHARS[t>>16&15]+HEX_CHARS[t>>28&15]+HEX_CHARS[t>>24&15]+HEX_CHARS[n>>4&15]+HEX_CHARS[15&n]+HEX_CHARS[n>>12&15]+HEX_CHARS[n>>8&15]+HEX_CHARS[n>>20&15]+HEX_CHARS[n>>16&15]+HEX_CHARS[n>>28&15]+HEX_CHARS[n>>24&15]+HEX_CHARS[r>>4&15]+HEX_CHARS[15&r]+HEX_CHARS[r>>12&15]+HEX_CHARS[r>>8&15]+HEX_CHARS[r>>20&15]+HEX_CHARS[r>>16&15]+HEX_CHARS[r>>28&15]+HEX_CHARS[r>>24&15]},Md5.prototype.toString=Md5.prototype.hex,Md5.prototype.digest=function(e){if("hex"===e)return this.hex();this.finalize();var t=this.h0,n=this.h1,r=this.h2,o=this.h3;return[255&t,t>>8&255,t>>16&255,t>>24&255,255&n,n>>8&255,n>>16&255,n>>24&255,255&r,r>>8&255,r>>16&255,r>>24&255,255&o,o>>8&255,o>>16&255,o>>24&255]},Md5.prototype.array=Md5.prototype.digest,Md5.prototype.arrayBuffer=function(){this.finalize();var e=new ArrayBuffer(16),t=new Uint32Array(e);return t[0]=this.h0,t[1]=this.h1,t[2]=this.h2,t[3]=this.h3,e},Md5.prototype.buffer=Md5.prototype.arrayBuffer,Md5.prototype.base64=function(){for(var e,t,n,r="",o=this.array(),i=0;i<15;)e=o[i++],t=o[i++],n=o[i++],r+=BASE64_ENCODE_CHAR[e>>>2]+BASE64_ENCODE_CHAR[63&(e<<4|t>>>4)]+BASE64_ENCODE_CHAR[63&(t<<2|n>>>6)]+BASE64_ENCODE_CHAR[63&n];return e=o[i],r+=BASE64_ENCODE_CHAR[e>>>2]+BASE64_ENCODE_CHAR[e<<4&63]+"=="};var exports=createMethod();COMMON_JS?module.exports=exports:(root.md5=exports,AMD&&(__WEBPACK_AMD_DEFINE_RESULT__=function(){return exports}.call(exports,__webpack_require__,exports,module),void 0===__WEBPACK_AMD_DEFINE_RESULT__||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)))})()}).call(this,__webpack_require__(2),__webpack_require__(3),__webpack_require__(4)(module))},function(e,t){(function(t){e.exports=t}).call(this,{})},function(e,t,n){(function(e){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(e)}var n,r,o,i,a,s,c,u=u||function(e,t){var n={},r=n.lib={},o=function(){},i=r.Base={extend:function(e){o.prototype=this;var t=new o;return e&&t.mixIn(e),t.hasOwnProperty("init")||(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}},a=r.WordArray=i.extend({init:function(e,t){e=this.words=e||[],this.sigBytes=null!=t?t:4*e.length},toString:function(e){return(e||c).stringify(this)},concat:function(e){var t=this.words,n=e.words,r=this.sigBytes;if(e=e.sigBytes,this.clamp(),r%4)for(var o=0;o>>2]|=(n[o>>>2]>>>24-o%4*8&255)<<24-(r+o)%4*8;else if(65535>>2]=n[o>>>2];else t.push.apply(t,n);return this.sigBytes+=e,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-n%4*8,t.length=e.ceil(n/4)},clone:function(){var e=i.clone.call(this);return e.words=this.words.slice(0),e},random:function(t){for(var n=[],r=0;r>>2]>>>24-r%4*8&255;n.push((o>>>4).toString(16)),n.push((15&o).toString(16))}return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r>>3]|=parseInt(e.substr(r,2),16)<<24-r%8*4;return new a.init(n,t/2)}},u=s.Latin1={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;r>>2]>>>24-r%4*8&255));return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r>>2]|=(255&e.charCodeAt(r))<<24-r%4*8;return new a.init(n,t)}},l=s.Utf8={stringify:function(e){try{return decodeURIComponent(escape(u.stringify(e)))}catch(e){throw Error("Malformed UTF-8 data")}},parse:function(e){return u.parse(unescape(encodeURIComponent(e)))}},d=r.BufferedBlockAlgorithm=i.extend({reset:function(){this._data=new a.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=l.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var n=this._data,r=n.words,o=n.sigBytes,i=this.blockSize,s=o/(4*i);if(t=(s=t?e.ceil(s):e.max((0|s)-this._minBufferSize,0))*i,o=e.min(4*t,o),t){for(var c=0;cu;u++){if(16>u)i[u]=0|e[t+u];else{var l=i[u-3]^i[u-8]^i[u-14]^i[u-16];i[u]=l<<1|l>>>31}l=(r<<5|r>>>27)+c+i[u],l=20>u?l+(1518500249+(o&a|~o&s)):40>u?l+(1859775393+(o^a^s)):60>u?l+((o&a|o&s|a&s)-1894007588):l+((o^a^s)-899497514),c=s,s=a,a=o<<30|o>>>2,o=r,r=l}n[0]=n[0]+r|0,n[1]=n[1]+o|0,n[2]=n[2]+a|0,n[3]=n[3]+s|0,n[4]=n[4]+c|0},_doFinalize:function(){var e=this._data,t=e.words,n=8*this._nDataBytes,r=8*e.sigBytes;return t[r>>>5]|=128<<24-r%32,t[14+(r+64>>>9<<4)]=Math.floor(n/4294967296),t[15+(r+64>>>9<<4)]=n,e.sigBytes=4*t.length,this._process(),this._hash},clone:function(){var e=o.clone.call(this);return e._hash=this._hash.clone(),e}}),n.SHA1=o._createHelper(a),n.HmacSHA1=o._createHmacHelper(a),function(){var e=u,t=e.enc.Utf8;e.algo.HMAC=e.lib.Base.extend({init:function(e,n){e=this._hasher=new e.init,"string"==typeof n&&(n=t.parse(n));var r=e.blockSize,o=4*r;n.sigBytes>o&&(n=e.finalize(n)),n.clamp();for(var i=this._oKey=n.clone(),a=this._iKey=n.clone(),s=i.words,c=a.words,u=0;u>>2]>>>24-i%4*8&255)<<16|(t[i+1>>>2]>>>24-(i+1)%4*8&255)<<8|t[i+2>>>2]>>>24-(i+2)%4*8&255,s=0;s<4&&i+.75*s>>6*(3-s)&63));var c=r.charAt(64);if(c)for(;o.length%4;)o.push(c);return o.join("")},parse:function(e){var t=e.length,n=this._map,r=n.charAt(64);if(r){var o=e.indexOf(r);-1!=o&&(t=o)}for(var i=[],a=0,s=0;s>>6-s%4*2;i[a>>>2]|=(u|l)<<24-a%4*8,a++}return c.create(i,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},"object"===t(e)?e.exports=u:window.CryptoJS=u}).call(this,n(4)(e))},function(e,t,n){var r=n(16).DOMParser,o=function(){this.version="1.3.5";var e={mergeCDATA:!0,normalize:!0,stripElemPrefix:!0},t=new RegExp(/(?!xmlns)^.*:/);new RegExp(/^\s+|\s+$/g);return this.grokType=function(e){return/^\s*$/.test(e)?null:/^(?:true|false)$/i.test(e)?"true"===e.toLowerCase():isFinite(e)?parseFloat(e):e},this.parseString=function(e,t){if(e){var n=this.stringToXML(e);return n.getElementsByTagName("parsererror").length?null:this.parseXML(n,t)}return null},this.parseXML=function(n,r){for(var i in r)e[i]=r[i];var a={},s=0,c="";if(n.childNodes.length)for(var u,l,d,p=0;p=t+n||t?new java.lang.String(e,t,n)+"":e}function g(e,t){e.currentElement?e.currentElement.appendChild(t):e.doc.appendChild(t)}p.prototype.parseFromString=function(e,t){var n=this.options,r=new l,o=n.domBuilder||new f,a=n.errorHandler,s=n.locator,u=n.xmlns||{},p=/\/x?html?$/.test(t),h=p?i.HTML_ENTITIES:i.XML_ENTITIES;s&&o.setDocumentLocator(s),r.errorHandler=function(e,t,n){if(!e){if(t instanceof f)return t;e=t}var r={},o=e instanceof Function;function i(t){var i=e[t];!i&&o&&(i=2==e.length?function(n){e(t,n)}:e),r[t]=i&&function(e){i("[xmldom "+t+"]\t"+e+function(e){if(e)return"\n@"+(e.systemId||"")+"#[line:"+e.lineNumber+",col:"+e.columnNumber+"]"}(n))}||function(){}}return n=n||{},i("warning"),i("error"),i("fatalError"),r}(a,o,s),r.domBuilder=n.domBuilder||o,p&&(u[""]=c.HTML),u.xml=u.xml||c.XML;var m=n.normalizeLineEndings||d;return e&&"string"==typeof e?r.parse(m(e),u,h):r.errorHandler.error("invalid doc source"),o.doc},f.prototype={startDocument:function(){this.doc=(new s).createDocument(null,null,null),this.locator&&(this.doc.documentURI=this.locator.systemId)},startElement:function(e,t,n,r){var o=this.doc,i=o.createElementNS(e,n||t),a=r.length;g(this,i),this.currentElement=i,this.locator&&h(this.locator,i);for(var s=0;s",lt:"<",quot:'"'}),t.HTML_ENTITIES=r({lt:"<",gt:">",amp:"&",quot:'"',apos:"'",Agrave:"À",Aacute:"Á",Acirc:"Â",Atilde:"Ã",Auml:"Ä",Aring:"Å",AElig:"Æ",Ccedil:"Ç",Egrave:"È",Eacute:"É",Ecirc:"Ê",Euml:"Ë",Igrave:"Ì",Iacute:"Í",Icirc:"Î",Iuml:"Ï",ETH:"Ð",Ntilde:"Ñ",Ograve:"Ò",Oacute:"Ó",Ocirc:"Ô",Otilde:"Õ",Ouml:"Ö",Oslash:"Ø",Ugrave:"Ù",Uacute:"Ú",Ucirc:"Û",Uuml:"Ü",Yacute:"Ý",THORN:"Þ",szlig:"ß",agrave:"à",aacute:"á",acirc:"â",atilde:"ã",auml:"ä",aring:"å",aelig:"æ",ccedil:"ç",egrave:"è",eacute:"é",ecirc:"ê",euml:"ë",igrave:"ì",iacute:"í",icirc:"î",iuml:"ï",eth:"ð",ntilde:"ñ",ograve:"ò",oacute:"ó",ocirc:"ô",otilde:"õ",ouml:"ö",oslash:"ø",ugrave:"ù",uacute:"ú",ucirc:"û",uuml:"ü",yacute:"ý",thorn:"þ",yuml:"ÿ",nbsp:" ",iexcl:"¡",cent:"¢",pound:"£",curren:"¤",yen:"¥",brvbar:"¦",sect:"§",uml:"¨",copy:"©",ordf:"ª",laquo:"«",not:"¬",shy:"­­",reg:"®",macr:"¯",deg:"°",plusmn:"±",sup2:"²",sup3:"³",acute:"´",micro:"µ",para:"¶",middot:"·",cedil:"¸",sup1:"¹",ordm:"º",raquo:"»",frac14:"¼",frac12:"½",frac34:"¾",iquest:"¿",times:"×",divide:"÷",forall:"∀",part:"∂",exist:"∃",empty:"∅",nabla:"∇",isin:"∈",notin:"∉",ni:"∋",prod:"∏",sum:"∑",minus:"−",lowast:"∗",radic:"√",prop:"∝",infin:"∞",ang:"∠",and:"∧",or:"∨",cap:"∩",cup:"∪",int:"∫",there4:"∴",sim:"∼",cong:"≅",asymp:"≈",ne:"≠",equiv:"≡",le:"≤",ge:"≥",sub:"⊂",sup:"⊃",nsub:"⊄",sube:"⊆",supe:"⊇",oplus:"⊕",otimes:"⊗",perp:"⊥",sdot:"⋅",Alpha:"Α",Beta:"Β",Gamma:"Γ",Delta:"Δ",Epsilon:"Ε",Zeta:"Ζ",Eta:"Η",Theta:"Θ",Iota:"Ι",Kappa:"Κ",Lambda:"Λ",Mu:"Μ",Nu:"Ν",Xi:"Ξ",Omicron:"Ο",Pi:"Π",Rho:"Ρ",Sigma:"Σ",Tau:"Τ",Upsilon:"Υ",Phi:"Φ",Chi:"Χ",Psi:"Ψ",Omega:"Ω",alpha:"α",beta:"β",gamma:"γ",delta:"δ",epsilon:"ε",zeta:"ζ",eta:"η",theta:"θ",iota:"ι",kappa:"κ",lambda:"λ",mu:"μ",nu:"ν",xi:"ξ",omicron:"ο",pi:"π",rho:"ρ",sigmaf:"ς",sigma:"σ",tau:"τ",upsilon:"υ",phi:"φ",chi:"χ",psi:"ψ",omega:"ω",thetasym:"ϑ",upsih:"ϒ",piv:"ϖ",OElig:"Œ",oelig:"œ",Scaron:"Š",scaron:"š",Yuml:"Ÿ",fnof:"ƒ",circ:"ˆ",tilde:"˜",ensp:" ",emsp:" ",thinsp:" ",zwnj:"‌",zwj:"‍",lrm:"‎",rlm:"‏",ndash:"–",mdash:"—",lsquo:"‘",rsquo:"’",sbquo:"‚",ldquo:"“",rdquo:"”",bdquo:"„",dagger:"†",Dagger:"‡",bull:"•",hellip:"…",permil:"‰",prime:"′",Prime:"″",lsaquo:"‹",rsaquo:"›",oline:"‾",euro:"€",trade:"™",larr:"←",uarr:"↑",rarr:"→",darr:"↓",harr:"↔",crarr:"↵",lceil:"⌈",rceil:"⌉",lfloor:"⌊",rfloor:"⌋",loz:"◊",spades:"♠",clubs:"♣",hearts:"♥",diams:"♦"}),t.entityMap=t.HTML_ENTITIES},function(e,t,n){var r=n(1).NAMESPACE,o=/[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,i=new RegExp("[\\-\\.0-9"+o.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]"),a=new RegExp("^"+o.source+i.source+"*(?::"+o.source+i.source+"*)?$");function s(e,t){this.message=e,this.locator=t,Error.captureStackTrace&&Error.captureStackTrace(this,s)}function c(){}function u(e,t){return t.lineNumber=e.lineNumber,t.columnNumber=e.columnNumber,t}function l(e,t,n,o,i,a){function s(e,t,r){n.attributeNames.hasOwnProperty(e)&&a.fatalError("Attribute "+e+" redefined"),n.addValue(e,t.replace(/[\t\n\r]/g," ").replace(/&#?\w+;/g,i),r)}for(var c,u=++t,l=0;;){var d=e.charAt(u);switch(d){case"=":if(1===l)c=e.slice(t,u),l=3;else{if(2!==l)throw new Error("attribute equal must after attrName");l=3}break;case"'":case'"':if(3===l||1===l){if(1===l&&(a.warning('attribute value must after "="'),c=e.slice(t,u)),t=u+1,!((u=e.indexOf(d,t))>0))throw new Error("attribute value no end '"+d+"' match");s(c,p=e.slice(t,u),t-1),l=5}else{if(4!=l)throw new Error('attribute value must after "="');s(c,p=e.slice(t,u),t),a.warning('attribute "'+c+'" missed start quot('+d+")!!"),t=u+1,l=5}break;case"/":switch(l){case 0:n.setTagName(e.slice(t,u));case 5:case 6:case 7:l=7,n.closed=!0;case 4:case 1:case 2:break;default:throw new Error("attribute invalid close char('/')")}break;case"":return a.error("unexpected end of input"),0==l&&n.setTagName(e.slice(t,u)),u;case">":switch(l){case 0:n.setTagName(e.slice(t,u));case 5:case 6:case 7:break;case 4:case 1:"/"===(p=e.slice(t,u)).slice(-1)&&(n.closed=!0,p=p.slice(0,-1));case 2:2===l&&(p=c),4==l?(a.warning('attribute "'+p+'" missed quot(")!'),s(c,p,t)):(r.isHTML(o[""])&&p.match(/^(?:disabled|checked|selected)$/i)||a.warning('attribute "'+p+'" missed value!! "'+p+'" instead!!'),s(p,p,t));break;case 3:throw new Error("attribute value missed!!")}return u;case"€":d=" ";default:if(d<=" ")switch(l){case 0:n.setTagName(e.slice(t,u)),l=6;break;case 1:c=e.slice(t,u),l=2;break;case 4:var p=e.slice(t,u);a.warning('attribute "'+p+'" missed quot(")!!'),s(c,p,t);case 5:l=6}else switch(l){case 2:n.tagName;r.isHTML(o[""])&&c.match(/^(?:disabled|checked|selected)$/i)||a.warning('attribute "'+c+'" missed value!! "'+c+'" instead2!!'),s(c,c,t),t=u,l=1;break;case 5:a.warning('attribute space is required"'+c+'"!!');case 6:l=1,t=u;break;case 3:l=4,t=u;break;case 7:throw new Error("elements closed character '/' and '>' must be connected to")}}u++}}function d(e,t,n){for(var o=e.tagName,i=null,a=e.length;a--;){var s=e[a],c=s.qName,u=s.value;if((f=c.indexOf(":"))>0)var l=s.prefix=c.slice(0,f),d=c.slice(f+1),p="xmlns"===l&&d;else d=c,l=null,p="xmlns"===c&&"";s.localName=d,!1!==p&&(null==i&&(i={},h(n,n={})),n[p]=i[p]=u,s.uri=r.XMLNS,t.startPrefixMapping(p,u))}for(a=e.length;a--;){(l=(s=e[a]).prefix)&&("xml"===l&&(s.uri=r.XML),"xmlns"!==l&&(s.uri=n[l||""]))}var f;(f=o.indexOf(":"))>0?(l=e.prefix=o.slice(0,f),d=e.localName=o.slice(f+1)):(l=null,d=e.localName=o);var m=e.uri=n[l||""];if(t.startElement(m,d,o,e),!e.closed)return e.currentNSMap=n,e.localNSMap=i,!0;if(t.endElement(m,d,o),i)for(l in i)t.endPrefixMapping(l)}function p(e,t,n,r,o){if(/^(?:script|textarea)$/i.test(n)){var i=e.indexOf("",t),a=e.substring(t+1,i);if(/[&<]/.test(a))return/^script$/i.test(n)?(o.characters(a,0,a.length),i):(a=a.replace(/&#?\w+;/g,r),o.characters(a,0,a.length),i)}return t+1}function f(e,t,n,r){var o=r[n];return null==o&&((o=e.lastIndexOf(""))t?(n.comment(e,t+4,o-t-4),o+3):(r.error("Unclosed comment"),-1):-1;if("CDATA["==e.substr(t+3,6)){var o=e.indexOf("]]>",t+9);return n.startCDATA(),n.characters(e,t+9,o-t-9),n.endCDATA(),o+3}var i=function(e,t){var n,r=[],o=/'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;o.lastIndex=t,o.exec(e);for(;n=o.exec(e);)if(r.push(n),n[1])return r}(e,t),a=i.length;if(a>1&&/!doctype/i.test(i[0][0])){var s=i[1][0],c=!1,u=!1;a>3&&(/^public$/i.test(i[2][0])?(c=i[3][0],u=a>4&&i[4][0]):/^system$/i.test(i[2][0])&&(u=i[3][0]));var l=i[a-1];return n.startDTD(s,c,u),n.endDTD(),l.index+l[0].length}return-1}function g(e,t,n){var r=e.indexOf("?>",t);if(r){var o=e.substring(t,r).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);if(o){o[0].length;return n.processingInstruction(o[1],o[2]),r+2}return-1}return-1}function y(){this.attributeNames={}}s.prototype=new Error,s.prototype.name=s.name,c.prototype={parse:function(e,t,n){var o=this.domBuilder;o.startDocument(),h(t,t={}),function(e,t,n,o,i){function a(e){if(e>65535){var t=55296+((e-=65536)>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}function c(e){var t=e.slice(1,-1);return Object.hasOwnProperty.call(n,t)?n[t]:"#"===t.charAt(0)?a(parseInt(t.substr(1).replace("x","0x"))):(i.error("entity not found:"+e),e)}function h(t){if(t>R){var n=e.substring(R,t).replace(/&#?\w+;/g,c);S&&v(R),o.characters(n,0,t-R),R=t}}function v(t,n){for(;t>=k&&(n=b.exec(e));)C=n.index,k=C+n[0].length,S.lineNumber++;S.columnNumber=t-C+1}var C=0,k=0,b=/.*(?:\r\n?|\n)|.*$/g,S=o.locator,w=[{currentNSMap:t}],T={},R=0;for(;;){try{var E=e.indexOf("<",R);if(E<0){if(!e.substr(R).match(/^\s*$/)){var x=o.doc,A=x.createTextNode(e.substr(R));x.appendChild(A),o.currentElement=A}return}switch(E>R&&h(E),e.charAt(E+1)){case"/":var B=e.indexOf(">",E+3),I=e.substring(E+2,B).replace(/[ \t\n\r]+$/g,""),O=w.pop();B<0?(I=e.substring(E+2).replace(/[\s<].*/,""),i.error("end tag name: "+I+" is not complete:"+O.tagName),B=E+1+I.length):I.match(/\sR?R=B:h(Math.max(E,R)+1)}}(e,t,n,o,this.errorHandler),o.endDocument()}},y.prototype={setTagName:function(e){if(!a.test(e))throw new Error("invalid tagName:"+e);this.tagName=e},addValue:function(e,t,n){if(!a.test(e))throw new Error("invalid attribute:"+e);this.attributeNames[e]=this.length,this[this.length++]={qName:e,value:t,offset:n}},length:0,getLocalName:function(e){return this[e].localName},getLocator:function(e){return this[e].locator},getQName:function(e){return this[e].qName},getURI:function(e){return this[e].uri},getValue:function(e){return this[e].value}},t.XMLReader=c,t.ParseError=s},function(e,t){function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}var r="a-zA-Z_À-ÖØ-öø-ÿͰ-ͽͿ-῿‌-‍⁰-↏Ⰰ-⿿、-퟿豈-﷏ﷰ-�",o=new RegExp("^([^"+r+"])|^((x|X)(m|M)(l|L))|([^"+r+"-.0-9·̀-ͯ‿⁀])","g"),i=/[^\x09\x0A\x0D\x20-\xFF\x85\xA0-\uD7FF\uE000-\uFDCF\uFDE0-\uFFFD]/gm,a=function(e){var t=[];if(e instanceof Object)for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t},s=function(e,t){var r=function(e,n,r,i,a){var s=void 0!==t.indent?t.indent:"\t",c=t.prettyPrint?"\n"+new Array(i).join(s):"";t.removeIllegalNameCharacters&&(e=e.replace(o,"_"));var u=[c,"<",e,r||""];return n&&n.length>0?(u.push(">"),u.push(n),a&&u.push(c),u.push("")):u.push("/>"),u.join("")};return function e(o,s,c){var u=n(o);switch((Array.isArray?Array.isArray(o):o instanceof Array)?u="array":o instanceof Date&&(u="date"),u){case"array":var l=[];return o.map((function(t){l.push(e(t,1,c+1))})),t.prettyPrint&&l.push("\n"),l.join("");case"date":return o.toJSON?o.toJSON():o+"";case"object":var d=[];for(var p in o)if(o.hasOwnProperty(p))if(o[p]instanceof Array)for(var f=0;f0&&d.push("\n"),d.join("");case"function":return o();default:return t.escape?(""+o).replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(i,""):""+o}}(e,0,0)},c=function(e){var t=['"),t.join("")};e.exports=function(e,t){if(t||(t={xmlHeader:{standalone:!0},prettyPrint:!0,indent:" ",escape:!0}),"string"==typeof e)try{e=JSON.parse(e.toString())}catch(e){return!1}var r="",o="";return t&&("object"==n(t)?(t.xmlHeader&&(r=c(!!t.xmlHeader.standalone)),void 0!==t.docType&&(o="")):r=c()),[r,(t=t||{}).prettyPrint&&o?"\n":"",o,s(e,t)].join("").replace(/\n{2,}/g,"\n").replace(/\s+$/g,"")}},function(e,t,n){(function(r){var o,i,a;function s(e){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s(e)}a=function(){"use strict";var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)},t=function(){return(t=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]60*this.strategy.requestInterval*1e3},e.prototype.getUploadUrl=function(){return this.strategy.httpsUploadUrl+"?appkey="+this.appkey},e.prototype.isBlackEvent=function(e){return-1!=this.strategy.blacklist.indexOf(e)},e.prototype.isEventUpOnOff=function(){return this.strategy.isEventUpOnOff},e.prototype.isSampleEvent=function(e){return!!Object.prototype.hasOwnProperty.call(this.realSample,e)&&this.realSample[e]this.duration)return this.createSession();t=r.sessionId,n=r.sessionStart}catch(e){}return{sessionId:t,sessionStart:n}},e.prototype.createSession=function(){var e=Date.now(),t={sessionId:this.appkey+"_"+e.toString(),sessionStart:e};this.storage.setItem(k,JSON.stringify(t)),this.storage.setItem(c,e.toString());var n="is_new_user",r=this.storage.getItem(n);return this.beacon.onDirectUserAction("rqd_applaunched",{A21:r?"N":"Y"}),this.storage.setItem(n,JSON.stringify(!1)),t},e}();function S(){var e=navigator.userAgent,t=e.indexOf("compatible")>-1&&e.indexOf("MSIE")>-1,n=e.indexOf("Edge")>-1&&!t,r=e.indexOf("Trident")>-1&&e.indexOf("rv:11.0")>-1;if(t){new RegExp("MSIE (\\d+\\.\\d+);").test(e);var o=parseFloat(RegExp.$1);return 7==o?7:8==o?8:9==o?9:10==o?10:6}return n?-2:r?11:-1}var w,T,R=function(){return(R=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0||!window.indexedDB||/X5Lite/.test(navigator.userAgent)?(this.store=new I(t),this.dbEventCount=this.store.getCount()):(this.store=new B(e),this.getCount().then((function(e){n.dbEventCount=e})))}return e.prototype.getCount=function(){return n(this,void 0,void 0,(function(){return o(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,this.store.getCount()];case 1:return[2,e.sent()];case 2:return e.sent(),[2,Promise.reject()];case 3:return[2]}}))}))},e.prototype.insertEvent=function(e,t){return n(this,void 0,void 0,(function(){var n,r;return o(this,(function(o){switch(o.label){case 0:if(this.dbEventCount>=1e4)return[2,Promise.reject()];n=m(e.mapValue),o.label=1;case 1:return o.trys.push([1,3,,4]),this.dbEventCount++,[4,this.store.setItem(n,e)];case 2:return[2,o.sent()];case 3:return r=o.sent(),t&&t(r,e),this.dbEventCount--,[2,Promise.reject()];case 4:return[2]}}))}))},e.prototype.getEvents=function(){return n(this,void 0,void 0,(function(){var e;return o(this,(function(t){switch(t.label){case 0:e=[],t.label=1;case 1:return t.trys.push([1,3,,4]),[4,this.store.iterate((function(t){e.push(t)}))];case 2:case 3:return t.sent(),[2,Promise.all(e)];case 4:return[2]}}))}))},e.prototype.removeEvent=function(e){return n(this,void 0,void 0,(function(){var t;return o(this,(function(n){switch(n.label){case 0:t=m(e.mapValue),n.label=1;case 1:return n.trys.push([1,3,,4]),this.dbEventCount--,[4,this.store.removeItem(t)];case 2:return[2,n.sent()];case 3:return n.sent(),this.dbEventCount++,[2,Promise.reject()];case 4:return[2]}}))}))},e}(),_=function(){return(_=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]+t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]+t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]+t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]+t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]},r=function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]*t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]*t[3],n[1]+=n[2]>>>16,n[2]&=65535,n[2]+=e[3]*t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]*t[3],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[2]*t[2],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[3]*t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]},o=function(e,t){return 32==(t%=64)?[e[1],e[0]]:t<32?[e[0]<>>32-t,e[1]<>>32-t]:[e[1]<<(t-=32)|e[0]>>>32-t,e[0]<>>32-t]},i=function(e,t){return 0==(t%=64)?e:t<32?[e[0]<>>32-t,e[1]<>>1]),e=r(e,[4283543511,3981806797]),e=a(e,[0,e[0]>>>1]),e=r(e,[3301882366,444984403]),a(e,[0,e[0]>>>1])},c=(e=e||"").length%16,u=e.length-c,l=[0,t=t||0],d=[0,t],p=[0,0],f=[0,0],h=[2277735313,289559509],m=[1291169091,658871167],g=0;g>>0).toString(16)).slice(-8)+("00000000"+(l[1]>>>0).toString(16)).slice(-8)+("00000000"+(d[0]>>>0).toString(16)).slice(-8)+("00000000"+(d[1]>>>0).toString(16)).slice(-8)}}])&&t(o.prototype,i),n}()}()}(W={exports:{}}),W.exports),Q="logid_start",$="4.5.6-web";return function(n){function r(e){var t=n.call(this,e)||this;t.qimei36="",t.uselessCycleTaskNum=0,t.underWeakNet=!1,t.send=function(e,n,r){t.storage.setItem(c,Date.now().toString()),t.network.post(t.uploadUrl||t.strategy.getUploadUrl(),e.data).then((function(r){var o;100==(null===(o=null==r?void 0:r.data)||void 0===o?void 0:o.result)?t.delayTime=1e3*r.data.delayTime:t.delayTime=0,n&&n(e.data),e.data.events.forEach((function(e){t.store.removeEvent(e).then((function(){t.removeSendingId(m(e.mapValue))}))})),t.doCustomCycleTask()})).catch((function(n){var o=e.data.events;t.errorReport.reportError(n.code?n.code.toString():"600",n.message),r&&r(e.data);var i=JSON.parse(t.storage.getItem(u));o.forEach((function(e){i&&-1!=i.indexOf(m(e))&&t.store.insertEvent(e,(function(e,n){e&&t.errorReport.reportError("604","insertEvent fail!")})),t.removeSendingId(m(e))})),t.monitorUploadFailed()}))};var r,o,i=S();return t.isUnderIE8=i>0&&i<8,t.isUnderIE8||(t.isUnderIE=i>0,e.needInitQimei&&t.initQimei(e.appkey),t.network=new V(e),t.storage=new X(e.appkey),t.initCommonInfo(e),t.store=new O(e.appkey,t.storage),t.errorReport=new v(t.config,t.commonInfo,"web",t.network),t.strategy=new C(t.config,t.commonInfo,t.storage,t.network),t.logidStartTime=t.storage.getItem(Q),t.logidStartTime||(t.logidStartTime=Date.now().toString(),t.storage.setItem(Q,t.logidStartTime)),r=t.logidStartTime,o=Date.now()-Number.parseFloat(r),Math.floor(o/864e5)>=365&&t.storage.clear(),t.initSession(e),t.onDirectUserAction("rqd_js_init",{}),setTimeout((function(){return t.lifeCycle.emit("init")}),0),t.initDelayTime=e.delay?e.delay:1e3,t.cycleTask(t.initDelayTime)),t}return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}(r,n),r.prototype.initQimei=function(e){var t=this;(new J).getQimei36(e,(function(e){t.qimei36=e.q36}))},r.prototype.initSession=function(e){var t=18e5;e.sessionDuration&&e.sessionDuration>3e4&&(t=e.sessionDuration),this.beaconSession=new b(this.storage,t,this)},r.prototype.initCommonInfo=function(e){var t=Number(this.storage.getItem(c));try{var n=JSON.parse(this.storage.getItem(u));(Date.now()-t>3e4||!n)&&this.storage.setItem(u,JSON.stringify([]))}catch(e){}e.uploadUrl&&(this.uploadUrl=e.uploadUrl+"?appkey="+e.appkey);var r=[window.screen.width,window.screen.height];window.devicePixelRatio&&r.push(window.devicePixelRatio),this.commonInfo={deviceId:this.storage.createDeviceId(),language:navigator&&navigator.language||"zh_CN",query:window.location.search,userAgent:navigator.userAgent,pixel:r.join("*"),channelID:e.channelID?String(e.channelID):"",openid:e.openid?String(e.openid):"",unid:e.unionid?String(e.unionid):"",sdkVersion:$},this.config.appVersion=e.versionCode?String(e.versionCode):"",this.config.strictMode=e.strictMode},r.prototype.cycleTask=function(e){var t=this;this.intervalID=window.setInterval((function(){t.store.getEvents().then((function(e){var n=[],r=JSON.parse(t.storage.getItem(u));r||(r=[]),e&&e.forEach((function(e){var t=m(e.mapValue);-1==r.indexOf(t)&&(n.push(e),r.push(t))})),0!=n.length&&(t.storage.setItem(u,JSON.stringify(r)),t._normalLogPipeline(t.assembleData(n)))})).catch((function(e){}))}),e)},r.prototype.onReport=function(e,t,n){var r=this;if(this.isUnderIE8)this.errorReport.reportError("601","UnderIE8");else{var o=this.generateData(e,t,n);if(n&&0==this.delayTime&&!this.underWeakNet)this._normalLogPipeline(this.assembleData(o));else{var i=o.shift();i&&this.store.insertEvent(i,(function(e){e&&r.errorReport.reportError("604","insertEvent fail!")})).catch((function(e){r._normalLogPipeline(r.assembleData(o))}))}}},r.prototype.onSendBeacon=function(e,t){if(this.isUnderIE)this.errorReport.reportError("605","UnderIE");else{var n=this.assembleData(this.generateData(e,t,!0));"function"==typeof navigator.sendBeacon&&navigator.sendBeacon(this.uploadUrl||this.strategy.getUploadUrl(),JSON.stringify(n))}},r.prototype.generateData=function(e,n,r){var o=[],i="4.5.6-web_"+(r?"direct_log_id":"normal_log_id"),a=Number(this.storage.getItem(i));return a=a||1,n=t(t({},n),{A99:r?"Y":"N",A100:a.toString(),A72:$,A88:this.logidStartTime}),a++,this.storage.setItem(i,a.toString()),o.push({eventCode:e,eventTime:Date.now().toString(),mapValue:f(n,this.config.strictMode)}),o},r.prototype.assembleData=function(e){var n=this.beaconSession.getSession();return{appVersion:this.config.appVersion?h(this.config.appVersion):"",sdkId:"js",sdkVersion:$,mainAppKey:this.config.appkey,platformId:3,common:f(t(t({},this.additionalParams),{A2:this.commonInfo.deviceId,A8:this.commonInfo.openid,A12:this.commonInfo.language,A17:this.commonInfo.pixel,A23:this.commonInfo.channelID,A50:this.commonInfo.unid,A76:n.sessionId,A101:this.commonInfo.userAgent,A102:window.location.href,A104:document.referrer,A119:this.commonInfo.query,A153:this.qimei36}),!1),events:e}},r.prototype.monitorUploadFailed=function(){this.uselessCycleTaskNum++,this.uselessCycleTaskNum>=5&&(window.clearInterval(this.intervalID),this.cycleTask(6e4),this.underWeakNet=!0)},r.prototype.doCustomCycleTask=function(){this.uselessCycleTaskNum>=5&&(window.clearInterval(this.intervalID),this.cycleTask(this.initDelayTime)),this.uselessCycleTaskNum=0,this.underWeakNet=!1},r}(y)},"object"==s(t)&&void 0!==e?e.exports=a():void 0===(i="function"==typeof(o=a)?o.call(t,n,t,e):o)||(e.exports=i)}).call(this,n(3))},function(e,t,n){var r=n(9),o=n(0),i={};e.exports.transferToTaskMethod=function(e,t){i[t]=e[t],e[t]=function(e,n){e.SkipTask?i[t].call(this,e,n):this._addTask(t,e,n)}},e.exports.init=function(e){var t,n,a=[],s={},c=0,u=0,l=function(e){var t={id:e.id,Bucket:e.Bucket,Region:e.Region,Key:e.Key,FilePath:e.FilePath,state:e.state,loaded:e.loaded,size:e.size,speed:e.speed,percent:e.percent,hashPercent:e.hashPercent,error:e.error};return e.FilePath&&(t.FilePath=e.FilePath),e._custom&&(t._custom=e._custom),t},d=(n=function(){t=0,e.emit("task-list-update",{list:o.map(a,l)}),e.emit("list-update",{list:o.map(a,l)})},function(){t||(t=setTimeout(n))}),p=function(){if(!(a.length<=e.options.UploadQueueSize)){for(var t=0;te.options.UploadQueueSize;){var n="waiting"===a[t].state||"checking"===a[t].state||"uploading"===a[t].state;a[t]&&n?t++:(s[a[t].id]&&delete s[a[t].id],a.splice(t,1),u--)}d()}},f=function t(){if(!(c>=e.options.FileParallelLimit)){for(;a[u]&&"waiting"!==a[u].state;)u++;if(!(u>=a.length)){var n=a[u];u++,c++,n.state="checking",n.params.onTaskStart&&n.params.onTaskStart(l(n)),!n.params.UploadData&&(n.params.UploadData={});var r=o.formatParams(n.api,n.params);i[n.api].call(e,r,(function(r,o){e._isRunningTask(n.id)&&("checking"!==n.state&&"uploading"!==n.state||(n.state=r?"error":"success",r&&(n.error=r),c--,d(),t(),n.callback&&n.callback(r,o),"success"===n.state&&(n.params&&(delete n.params.UploadData,delete n.params.Body,delete n.params),delete n.callback)),p())})),d(),setTimeout(t)}}},h=function(t,n){var o=s[t];if(o){var i=o&&"waiting"===o.state,a=o&&("checking"===o.state||"uploading"===o.state);if("canceled"===n&&"canceled"!==o.state||"paused"===n&&i||"paused"===n&&a){if("paused"===n&&o.params.Body&&"function"==typeof o.params.Body.pipe)return;o.state=n,e.emit("inner-kill-task",{TaskId:t,toState:n});try{var u=o&&o.params&&o.params.UploadData.UploadId}catch(e){}"canceled"===n&&u&&r.removeUsing(u),d(),a&&(c--,f()),"canceled"===n&&(o.params&&(delete o.params.UploadData,delete o.params.Body,delete o.params),delete o.callback)}p()}};e._addTasks=function(t){o.each(t,(function(t){e._addTask(t.api,t.params,t.callback,!0)})),d()};e._addTask=function(t,n,r,i){n=o.formatParams(t,n);var c=o.uuid();n.TaskId=c,n.onTaskReady&&n.onTaskReady(c),n.TaskReady&&(n.TaskReady(c),!1);var u={params:n,callback:r,api:t,index:a.length,id:c,Bucket:n.Bucket,Region:n.Region,Key:n.Key,FilePath:n.FilePath||"",state:"waiting",loaded:0,size:0,speed:0,percent:0,hashPercent:0,error:null,_custom:n._custom},l=n.onHashProgress;n.onHashProgress=function(t){e._isRunningTask(u.id)&&(u.hashPercent=t.percent,l&&l(t),d())};var h=n.onProgress;return n.onProgress=function(t){e._isRunningTask(u.id)&&("checking"===u.state&&(u.state="uploading"),u.loaded=t.loaded,u.speed=t.speed,u.percent=t.percent,h&&h(t),d())},o.getFileSize(t,n,(function(e,t){if(e)return r(o.error(e));s[c]=u,a.push(u),u.size=t,!i&&d(),f(),p()})),c},e._isRunningTask=function(e){var t=s[e];return!(!t||"checking"!==t.state&&"uploading"!==t.state)},e.getTaskList=function(){return o.map(a,l)},e.cancelTask=function(e){h(e,"canceled")},e.pauseTask=function(e){h(e,"paused")},e.restartTask=function(e){var t=s[e];!t||"paused"!==t.state&&"error"!==t.state||(t.state="waiting",d(),u=Math.min(u,t.index),f())},e.isUploadRunning=function(){return c||u-1?"{Region}.myqcloud.com":"cos.{Region}.myqcloud.com",e.ForcePathStyle||(a="{Bucket}."+a)),a=(a=a.replace(/\{\{AppId\}\}/gi,i).replace(/\{\{Bucket\}\}/gi,r).replace(/\{\{Region\}\}/gi,t).replace(/\{\{.*?\}\}/gi,"")).replace(/\{AppId\}/gi,i).replace(/\{BucketName\}/gi,r).replace(/\{Bucket\}/gi,n).replace(/\{Region\}/gi,t).replace(/\{.*?\}/gi,""),/^[a-zA-Z]+:\/\//.test(a)||(a=c+"//"+a),"/"===a.slice(-1)&&(a=a.slice(0,-1));var u=a;return e.ForcePathStyle&&(u+="/"+n),u+="/",s&&(u+=o.camSafeUrlEncode(s).replace(/%2F/g,"/")),e.isLocation&&(u=u.replace(/^https?:\/\//,"")),u}var c=function(e){if(!e.Bucket||!e.Region)return"";var t=void 0===e.UseAccelerate?this.options.UseAccelerate:e.UseAccelerate,n=(e.Url||s({ForcePathStyle:this.options.ForcePathStyle,protocol:this.options.Protocol,domain:this.options.Domain,bucket:e.Bucket,region:t?"accelerate":e.Region})).replace(/^https?:\/\/([^/]+)(\/.*)?$/,"$1");return new RegExp("^([a-z\\d-]+-\\d+\\.)?(cos|cosv6|ci|pic)\\.([a-z\\d-]+)\\.myqcloud\\.com$").test(n)?n:""};function u(e,t){var n=o.clone(e.Headers),r="";o.each(n,(function(e,t){(""===e||["content-type","cache-control","expires"].indexOf(t.toLowerCase())>-1)&&delete n[t],"host"===t.toLowerCase()&&(r=e)}));var i=!1!==e.ForceSignHost;!r&&e.SignHost&&i&&(n.Host=e.SignHost);var a=!1,s=function(e,n){a||(a=!0,n&&n.XCosSecurityToken&&!n.SecurityToken&&((n=o.clone(n)).SecurityToken=n.XCosSecurityToken,delete n.XCosSecurityToken),t&&t(e,n))},c=this,u=e.Bucket||"",l=e.Region||"",d=e.Key||"";c.options.ForcePathStyle&&u&&(d=u+"/"+d);var p="/"+d,f={},h=e.Scope;if(!h){var m=e.Action||"",g=e.ResourceKey||e.Key||"";h=e.Scope||[{action:m,bucket:u,region:l,prefix:g}]}var y=o.md5(JSON.stringify(h));c._StsCache=c._StsCache||[],function(){var e,t;for(e=c._StsCache.length-1;e>=0;e--){t=c._StsCache[e];var n=Math.round(o.getSkewTime(c.options.SystemClockOffset)/1e3)+30;if(t.StartTime&&n=t.ExpiredTime)c._StsCache.splice(e,1);else if(!t.ScopeLimit||t.ScopeLimit&&t.ScopeKey===y){f=t;break}}}();var v,C=function(){var t="";f.StartTime&&e.Expires?t=f.StartTime+";"+(f.StartTime+1*e.Expires):f.StartTime&&f.ExpiredTime&&(t=f.StartTime+";"+f.ExpiredTime);var r={Authorization:o.getAuth({SecretId:f.TmpSecretId,SecretKey:f.TmpSecretKey,Method:e.Method,Pathname:p,Query:e.Query,Headers:n,Expires:e.Expires,UseRawKey:c.options.UseRawKey,SystemClockOffset:c.options.SystemClockOffset,KeyTime:t,ForceSignHost:i}),SecurityToken:f.SecurityToken||f.XCosSecurityToken||"",Token:f.Token||"",ClientIP:f.ClientIP||"",ClientUA:f.ClientUA||""};s(null,r)},k=function(e){if(e.Authorization){var t=!1,n=e.Authorization;if(n)if(n.indexOf(" ")>-1)t=!1;else if(n.indexOf("q-sign-algorithm=")>-1&&n.indexOf("q-ak=")>-1&&n.indexOf("q-sign-time=")>-1&&n.indexOf("q-key-time=")>-1&&n.indexOf("q-url-param-list=")>-1)t=!0;else try{(n=atob(n)).indexOf("a=")>-1&&n.indexOf("k=")>-1&&n.indexOf("t=")>-1&&n.indexOf("r=")>-1&&n.indexOf("b=")>-1&&(t=!0)}catch(e){}if(!t)return o.error(new Error("getAuthorization callback params format error"))}else{if(!e.TmpSecretId)return o.error(new Error('getAuthorization callback params missing "TmpSecretId"'));if(!e.TmpSecretKey)return o.error(new Error('getAuthorization callback params missing "TmpSecretKey"'));if(!e.SecurityToken&&!e.XCosSecurityToken)return o.error(new Error('getAuthorization callback params missing "SecurityToken"'));if(!e.ExpiredTime)return o.error(new Error('getAuthorization callback params missing "ExpiredTime"'));if(e.ExpiredTime&&10!==e.ExpiredTime.toString().length)return o.error(new Error('getAuthorization callback params "ExpiredTime" should be 10 digits'));if(e.StartTime&&10!==e.StartTime.toString().length)return o.error(new Error('getAuthorization callback params "StartTime" should be 10 StartTime'))}return!1};if(f.ExpiredTime&&f.ExpiredTime-o.getSkewTime(c.options.SystemClockOffset)/1e3>60)C();else if(c.options.getAuthorization)c.options.getAuthorization.call(c,{Bucket:u,Region:l,Method:e.Method,Key:d,Pathname:p,Query:e.Query,Headers:n,Scope:h,SystemClockOffset:c.options.SystemClockOffset,ForceSignHost:i},(function(e){"string"==typeof e&&(e={Authorization:e});var t=k(e);if(t)return s(t);e.Authorization?s(null,e):((f=e||{}).Scope=h,f.ScopeKey=y,c._StsCache.push(f),C())}));else{if(!c.options.getSTS)return v={Authorization:o.getAuth({SecretId:e.SecretId||c.options.SecretId,SecretKey:e.SecretKey||c.options.SecretKey,Method:e.Method,Pathname:p,Query:e.Query,Headers:n,Expires:e.Expires,UseRawKey:c.options.UseRawKey,SystemClockOffset:c.options.SystemClockOffset,ForceSignHost:i}),SecurityToken:c.options.SecurityToken||c.options.XCosSecurityToken},s(null,v),v;c.options.getSTS.call(c,{Bucket:u,Region:l},(function(e){(f=e||{}).Scope=h,f.ScopeKey=y,f.TmpSecretId||(f.TmpSecretId=f.SecretId),f.TmpSecretKey||(f.TmpSecretKey=f.SecretKey);var t=k(f);if(t)return s(t);c._StsCache.push(f),C()}))}return""}function l(e){var t=!1,n=!1,r=e.headers&&(e.headers.date||e.headers.Date)||e.error&&e.error.ServerTime;try{var i=e.error.Code,a=e.error.Message;("RequestTimeTooSkewed"===i||"AccessDenied"===i&&"Request has expired"===a)&&(n=!0)}catch(e){}if(e)if(n&&r){var s=Date.parse(r);this.options.CorrectClockSkew&&Math.abs(o.getSkewTime(this.options.SystemClockOffset)-s)>=3e4&&(this.options.SystemClockOffset=s-Date.now(),t=!0)}else 5===Math.floor(e.statusCode/100)&&(t=!0);return t}function d(e,t){var n=this;!e.headers&&(e.headers={}),!e.qs&&(e.qs={}),e.VersionId&&(e.qs.versionId=e.VersionId),e.qs=o.clearKey(e.qs),e.headers&&(e.headers=o.clearKey(e.headers)),e.qs&&(e.qs=o.clearKey(e.qs));var r=o.clone(e.qs);e.action&&(r[e.action]="");var i=e.url||e.Url,a=e.SignHost||c.call(this,{Bucket:e.Bucket,Region:e.Region,Url:i}),s=e.tracker;!function o(i){var c=n.options.SystemClockOffset;s&&s.setParams({signStartTime:(new Date).getTime(),retryTimes:i-1}),u.call(n,{Bucket:e.Bucket||"",Region:e.Region||"",Method:e.method,Key:e.Key,Query:r,Headers:e.headers,SignHost:a,Action:e.Action,ResourceKey:e.ResourceKey,Scope:e.Scope,ForceSignHost:n.options.ForceSignHost},(function(r,a){r?t(r):(s&&s.setParams({signEndTime:(new Date).getTime(),httpStartTime:(new Date).getTime()}),e.AuthData=a,p.call(n,e,(function(r,a){s&&s.setParams({httpEndTime:(new Date).getTime()}),r&&i<2&&(c!==n.options.SystemClockOffset||l.call(n,r))?(e.headers&&(delete e.headers.Authorization,delete e.headers.token,delete e.headers.clientIP,delete e.headers.clientUA,e.headers["x-cos-security-token"]&&delete e.headers["x-cos-security-token"],e.headers["x-ci-security-token"]&&delete e.headers["x-ci-security-token"]),o(i+1)):t(r,a)})))}))}(1)}function p(e,t){var n=this,i=e.TaskId;if(!i||n._isRunningTask(i)){var a=e.Bucket,c=e.Region,u=e.Key,l=e.method||"GET",d=e.Url||e.url,p=e.body,f=e.rawBody;n.options.UseAccelerate&&(c="accelerate"),d=d||s({ForcePathStyle:n.options.ForcePathStyle,protocol:n.options.Protocol,domain:n.options.Domain,bucket:a,region:c,object:u}),e.action&&(d=d+"?"+e.action),e.qsStr&&(d=d.indexOf("?")>-1?d+"&"+e.qsStr:d+"?"+e.qsStr);var h={method:l,url:d,headers:e.headers,qs:e.qs,body:p},m="x-cos-security-token";if(o.isCIHost(d)&&(m="x-ci-security-token"),h.headers.Authorization=e.AuthData.Authorization,e.AuthData.Token&&(h.headers.token=e.AuthData.Token),e.AuthData.ClientIP&&(h.headers.clientIP=e.AuthData.ClientIP),e.AuthData.ClientUA&&(h.headers.clientUA=e.AuthData.ClientUA),e.AuthData.SecurityToken&&(h.headers[m]=e.AuthData.SecurityToken),h.headers&&(h.headers=o.clearKey(h.headers)),h=o.clearKey(h),e.onProgress&&"function"==typeof e.onProgress){var g=p&&(p.size||p.length)||0;h.onProgress=function(t){if(!i||n._isRunningTask(i)){var r=t?t.loaded:0;e.onProgress({loaded:r,total:g})}}}e.onDownloadProgress&&(h.onDownloadProgress=e.onDownloadProgress),e.DataType&&(h.dataType=e.DataType),this.options.Timeout&&(h.timeout=this.options.Timeout),n.options.ForcePathStyle&&(h.pathStyle=n.options.ForcePathStyle),n.emit("before-send",h);var y=h.url.includes("accelerate."),v=Object.keys(h.qs).map((function(e){return"".concat(e,"=").concat(h.qs[e])})).join("&"),C=v?h.url+"?"+v:h.url;e.tracker&&e.tracker.setParams({reqUrl:C,accelerate:y?"Y":"N"}),e.tracker&&e.tracker.parent&&e.tracker.parent.setParams({reqUrl:C,accelerate:y?"Y":"N"});var k=(n.options.Request||r)(h,(function(e){if("abort"!==e.error){var r={options:h,error:c,statusCode:s&&s.statusCode||0,headers:s&&s.headers||{},body:u};n.emit("after-receive",r),c=r.error,u=r.body,s={statusCode:r.statusCode,headers:r.headers},n.emit("after-receive",e);var a,s={statusCode:e.statusCode,statusMessage:e.statusMessage,headers:e.headers},c=e.error,u=e.body,l=function(e,r){if(i&&n.off("inner-kill-task",b),!a){a=!0;var c={};s&&s.statusCode&&(c.statusCode=s.statusCode),s&&s.headers&&(c.headers=s.headers),e?(e=o.extend(e||{},c),t(e,null)):(r=o.extend(r||{},c),t(null,r)),k=null}};if(c)return l(o.error(c));var d,p=s.statusCode,m=2===Math.floor(p/100);if(f&&m)return l(null,{body:u});try{d=u&&u.indexOf("<")>-1&&u.indexOf(">")>-1&&o.xml2json(u)||{}}catch(e){d={}}var g=d&&d.Error;m?l(null,d):g?l(o.error(new Error(g.Message),{code:g.Code,error:g})):p?l(o.error(new Error(s.statusMessage),{code:""+p})):p&&l(o.error(new Error("statusCode error")))}})),b=function e(t){t.TaskId===i&&(k&&k.abort&&k.abort(),n.off("inner-kill-task",e))};i&&n.on("inner-kill-task",b)}}var f={getService:function(e,t){"function"==typeof e&&(t=e,e={});var n=this.options.Protocol||(o.isBrowser&&"http:"===location.protocol?"http:":"https:"),r=this.options.ServiceDomain,i=e.AppId||this.options.appId,a=e.Region;r?(r=r.replace(/\{\{AppId\}\}/gi,i||"").replace(/\{\{Region\}\}/gi,a||"").replace(/\{\{.*?\}\}/gi,""),/^[a-zA-Z]+:\/\//.test(r)||(r=n+"//"+r),"/"===r.slice(-1)&&(r=r.slice(0,-1))):r=a?n+"//cos."+a+".myqcloud.com":n+"//service.cos.myqcloud.com";var s="",c=a?"cos."+a+".myqcloud.com":"service.cos.myqcloud.com";c===r.replace(/^https?:\/\/([^/]+)(\/.*)?$/,"$1")&&(s=c),d.call(this,{Action:"name/cos:GetService",url:r,method:"GET",headers:e.Headers,SignHost:s},(function(e,n){if(e)return t(e);var r=n&&n.ListAllMyBucketsResult&&n.ListAllMyBucketsResult.Buckets&&n.ListAllMyBucketsResult.Buckets.Bucket||[];r=o.isArray(r)?r:[r];var i=n&&n.ListAllMyBucketsResult&&n.ListAllMyBucketsResult.Owner||{};t(null,{Buckets:r,Owner:i,statusCode:n.statusCode,headers:n.headers})}))},putBucket:function(e,t){var n=this,r="";if(e.BucketAZConfig){var i={BucketAZConfig:e.BucketAZConfig};r=o.json2xml({CreateBucketConfiguration:i})}d.call(this,{Action:"name/cos:PutBucket",method:"PUT",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,body:r},(function(r,o){if(r)return t(r);var i=s({protocol:n.options.Protocol,domain:n.options.Domain,bucket:e.Bucket,region:e.Region,isLocation:!0});t(null,{Location:i,statusCode:o.statusCode,headers:o.headers})}))},headBucket:function(e,t){d.call(this,{Action:"name/cos:HeadBucket",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,method:"HEAD"},t)},getBucket:function(e,t){var n={};n.prefix=e.Prefix||"",n.delimiter=e.Delimiter,n.marker=e.Marker,n["max-keys"]=e.MaxKeys,n["encoding-type"]=e.EncodingType,d.call(this,{Action:"name/cos:GetBucket",ResourceKey:n.prefix,method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,qs:n},(function(e,n){if(e)return t(e);var r=n.ListBucketResult||{},i=r.Contents||[],a=r.CommonPrefixes||[];i=o.isArray(i)?i:[i],a=o.isArray(a)?a:[a];var s=o.clone(r);o.extend(s,{Contents:i,CommonPrefixes:a,statusCode:n.statusCode,headers:n.headers}),t(null,s)}))},deleteBucket:function(e,t){d.call(this,{Action:"name/cos:DeleteBucket",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,method:"DELETE"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketAcl:function(e,t){var n=e.Headers,r="";if(e.AccessControlPolicy){var i=o.clone(e.AccessControlPolicy||{}),s=i.Grants||i.Grant;s=o.isArray(s)?s:[s],delete i.Grant,delete i.Grants,i.AccessControlList={Grant:s},r=o.json2xml({AccessControlPolicy:i}),n["Content-Type"]="application/xml",n["Content-MD5"]=o.binaryBase64(o.md5(r))}o.each(n,(function(e,t){0===t.indexOf("x-cos-grant-")&&(n[t]=a(n[t]))})),d.call(this,{Action:"name/cos:PutBucketACL",method:"PUT",Bucket:e.Bucket,Region:e.Region,headers:n,action:"acl",body:r},(function(e,n){if(e)return t(e);t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketAcl:function(e,t){d.call(this,{Action:"name/cos:GetBucketACL",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"acl"},(function(e,n){if(e)return t(e);var r=n.AccessControlPolicy||{},a=r.Owner||{},s=r.AccessControlList.Grant||[];s=o.isArray(s)?s:[s];var c=i(r);n.headers&&n.headers["x-cos-acl"]&&(c.ACL=n.headers["x-cos-acl"]),c=o.extend(c,{Owner:a,Grants:s,statusCode:n.statusCode,headers:n.headers}),t(null,c)}))},putBucketCors:function(e,t){var n=(e.CORSConfiguration||{}).CORSRules||e.CORSRules||[];n=o.clone(o.isArray(n)?n:[n]),o.each(n,(function(e){o.each(["AllowedOrigin","AllowedHeader","AllowedMethod","ExposeHeader"],(function(t){var n=t+"s",r=e[n]||e[t]||[];delete e[n],e[t]=o.isArray(r)?r:[r]}))}));var r={CORSRule:n};e.ResponseVary&&(r.ResponseVary=e.ResponseVary);var i=o.json2xml({CORSConfiguration:r}),a=e.Headers;a["Content-Type"]="application/xml",a["Content-MD5"]=o.binaryBase64(o.md5(i)),d.call(this,{Action:"name/cos:PutBucketCORS",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:i,action:"cors",headers:a},(function(e,n){if(e)return t(e);t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketCors:function(e,t){d.call(this,{Action:"name/cos:GetBucketCORS",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"cors"},(function(e,n){if(e)if(404===e.statusCode&&e.error&&"NoSuchCORSConfiguration"===e.error.Code){var r={CORSRules:[],statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else t(e);else{var i=n.CORSConfiguration||{},a=i.CORSRules||i.CORSRule||[];a=o.clone(o.isArray(a)?a:[a]);var s=i.ResponseVary;o.each(a,(function(e){o.each(["AllowedOrigin","AllowedHeader","AllowedMethod","ExposeHeader"],(function(t){var n=t+"s",r=e[n]||e[t]||[];delete e[t],e[n]=o.isArray(r)?r:[r]}))})),t(null,{CORSRules:a,ResponseVary:s,statusCode:n.statusCode,headers:n.headers})}}))},deleteBucketCors:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketCORS",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"cors"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode||e.statusCode,headers:n.headers})}))},getBucketLocation:function(e,t){d.call(this,{Action:"name/cos:GetBucketLocation",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"location"},t)},getBucketPolicy:function(e,t){d.call(this,{Action:"name/cos:GetBucketPolicy",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"policy",rawBody:!0},(function(e,n){if(e)return e.statusCode&&403===e.statusCode?t(o.error(e,{ErrorStatus:"Access Denied"})):e.statusCode&&405===e.statusCode?t(o.error(e,{ErrorStatus:"Method Not Allowed"})):e.statusCode&&404===e.statusCode?t(o.error(e,{ErrorStatus:"Policy Not Found"})):t(e);var r={};try{r=JSON.parse(n.body)}catch(e){}t(null,{Policy:r,statusCode:n.statusCode,headers:n.headers})}))},putBucketPolicy:function(e,t){var n=e.Policy;try{"string"==typeof n&&(n=JSON.parse(n))}catch(e){}if(!n||"string"==typeof n)return t(o.error(new Error("Policy format error")));var r=JSON.stringify(n);n.version||(n.version="2.0");var i=e.Headers;i["Content-Type"]="application/json",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketPolicy",method:"PUT",Bucket:e.Bucket,Region:e.Region,action:"policy",body:r,headers:i},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},deleteBucketPolicy:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketPolicy",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"policy"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode||e.statusCode,headers:n.headers})}))},putBucketTagging:function(e,t){var n=e.Tagging||{},r=n.TagSet||n.Tags||e.Tags||[];r=o.clone(o.isArray(r)?r:[r]);var i=o.json2xml({Tagging:{TagSet:{Tag:r}}}),a=e.Headers;a["Content-Type"]="application/xml",a["Content-MD5"]=o.binaryBase64(o.md5(i)),d.call(this,{Action:"name/cos:PutBucketTagging",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:i,action:"tagging",headers:a},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketTagging:function(e,t){d.call(this,{Action:"name/cos:GetBucketTagging",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"tagging"},(function(e,n){if(e)if(404!==e.statusCode||!e.error||"Not Found"!==e.error&&"NoSuchTagSet"!==e.error.Code)t(e);else{var r={Tags:[],statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else{var i=[];try{i=n.Tagging.TagSet.Tag||[]}catch(e){}i=o.clone(o.isArray(i)?i:[i]),t(null,{Tags:i,statusCode:n.statusCode,headers:n.headers})}}))},deleteBucketTagging:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketTagging",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"tagging"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketLifecycle:function(e,t){var n=(e.LifecycleConfiguration||{}).Rules||e.Rules||[];n=o.clone(n);var r=o.json2xml({LifecycleConfiguration:{Rule:n}}),i=e.Headers;i["Content-Type"]="application/xml",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketLifecycle",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:r,action:"lifecycle",headers:i},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketLifecycle:function(e,t){d.call(this,{Action:"name/cos:GetBucketLifecycle",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"lifecycle"},(function(e,n){if(e)if(404===e.statusCode&&e.error&&"NoSuchLifecycleConfiguration"===e.error.Code){var r={Rules:[],statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else t(e);else{var i=[];try{i=n.LifecycleConfiguration.Rule||[]}catch(e){}i=o.clone(o.isArray(i)?i:[i]),t(null,{Rules:i,statusCode:n.statusCode,headers:n.headers})}}))},deleteBucketLifecycle:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketLifecycle",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"lifecycle"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketVersioning:function(e,t){if(e.VersioningConfiguration){var n=e.VersioningConfiguration||{},r=o.json2xml({VersioningConfiguration:n}),i=e.Headers;i["Content-Type"]="application/xml",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketVersioning",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:r,action:"versioning",headers:i},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))}else t(o.error(new Error("missing param VersioningConfiguration")))},getBucketVersioning:function(e,t){d.call(this,{Action:"name/cos:GetBucketVersioning",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"versioning"},(function(e,n){e||!n.VersioningConfiguration&&(n.VersioningConfiguration={}),t(e,n)}))},putBucketReplication:function(e,t){var n=o.clone(e.ReplicationConfiguration),r=o.json2xml({ReplicationConfiguration:n});r=(r=r.replace(/<(\/?)Rules>/gi,"<$1Rule>")).replace(/<(\/?)Tags>/gi,"<$1Tag>");var i=e.Headers;i["Content-Type"]="application/xml",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketReplication",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:r,action:"replication",headers:i},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketReplication:function(e,t){d.call(this,{Action:"name/cos:GetBucketReplication",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"replication"},(function(e,n){if(e)if(404!==e.statusCode||!e.error||"Not Found"!==e.error&&"ReplicationConfigurationnotFoundError"!==e.error.Code)t(e);else{var r={ReplicationConfiguration:{Rules:[]},statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else!n.ReplicationConfiguration&&(n.ReplicationConfiguration={}),n.ReplicationConfiguration.Rule&&(n.ReplicationConfiguration.Rules=o.makeArray(n.ReplicationConfiguration.Rule),delete n.ReplicationConfiguration.Rule),t(e,n)}))},deleteBucketReplication:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketReplication",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"replication"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketWebsite:function(e,t){if(e.WebsiteConfiguration){var n=o.clone(e.WebsiteConfiguration||{}),r=n.RoutingRules||n.RoutingRule||[];r=o.isArray(r)?r:[r],delete n.RoutingRule,delete n.RoutingRules,r.length&&(n.RoutingRules={RoutingRule:r});var i=o.json2xml({WebsiteConfiguration:n}),a=e.Headers;a["Content-Type"]="application/xml",a["Content-MD5"]=o.binaryBase64(o.md5(i)),d.call(this,{Action:"name/cos:PutBucketWebsite",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:i,action:"website",headers:a},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))}else t(o.error(new Error("missing param WebsiteConfiguration")))},getBucketWebsite:function(e,t){d.call(this,{Action:"name/cos:GetBucketWebsite",method:"GET",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,action:"website"},(function(e,n){if(e)if(404===e.statusCode&&"NoSuchWebsiteConfiguration"===e.error.Code){var r={WebsiteConfiguration:{},statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else t(e);else{var i=n.WebsiteConfiguration||{};if(i.RoutingRules){var a=o.clone(i.RoutingRules.RoutingRule||[]);a=o.makeArray(a),i.RoutingRules=a}t(null,{WebsiteConfiguration:i,statusCode:n.statusCode,headers:n.headers})}}))},deleteBucketWebsite:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketWebsite",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"website"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketReferer:function(e,t){if(e.RefererConfiguration){var n=o.clone(e.RefererConfiguration||{}),r=n.DomainList||{},i=r.Domains||r.Domain||[];(i=o.isArray(i)?i:[i]).length&&(n.DomainList={Domain:i});var a=o.json2xml({RefererConfiguration:n}),s=e.Headers;s["Content-Type"]="application/xml",s["Content-MD5"]=o.binaryBase64(o.md5(a)),d.call(this,{Action:"name/cos:PutBucketReferer",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:a,action:"referer",headers:s},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))}else t(o.error(new Error("missing param RefererConfiguration")))},getBucketReferer:function(e,t){d.call(this,{Action:"name/cos:GetBucketReferer",method:"GET",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,action:"referer"},(function(e,n){if(e)if(404===e.statusCode&&"NoSuchRefererConfiguration"===e.error.Code){var r={WebsiteConfiguration:{},statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else t(e);else{var i=n.RefererConfiguration||{};if(i.DomainList){var a=o.makeArray(i.DomainList.Domain||[]);i.DomainList={Domains:a}}t(null,{RefererConfiguration:i,statusCode:n.statusCode,headers:n.headers})}}))},putBucketDomain:function(e,t){var n=(e.DomainConfiguration||{}).DomainRule||e.DomainRule||[];n=o.clone(n);var r=o.json2xml({DomainConfiguration:{DomainRule:n}}),i=e.Headers;i["Content-Type"]="application/xml",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketDomain",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:r,action:"domain",headers:i},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketDomain:function(e,t){d.call(this,{Action:"name/cos:GetBucketDomain",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"domain"},(function(e,n){if(e)return t(e);var r=[];try{r=n.DomainConfiguration.DomainRule||[]}catch(e){}r=o.clone(o.isArray(r)?r:[r]),t(null,{DomainRule:r,statusCode:n.statusCode,headers:n.headers})}))},deleteBucketDomain:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketDomain",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"domain"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketOrigin:function(e,t){var n=(e.OriginConfiguration||{}).OriginRule||e.OriginRule||[];n=o.clone(n);var r=o.json2xml({OriginConfiguration:{OriginRule:n}}),i=e.Headers;i["Content-Type"]="application/xml",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketOrigin",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:r,action:"origin",headers:i},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketOrigin:function(e,t){d.call(this,{Action:"name/cos:GetBucketOrigin",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"origin"},(function(e,n){if(e)return t(e);var r=[];try{r=n.OriginConfiguration.OriginRule||[]}catch(e){}r=o.clone(o.isArray(r)?r:[r]),t(null,{OriginRule:r,statusCode:n.statusCode,headers:n.headers})}))},deleteBucketOrigin:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketOrigin",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"origin"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketLogging:function(e,t){var n=o.json2xml({BucketLoggingStatus:e.BucketLoggingStatus||""}),r=e.Headers;r["Content-Type"]="application/xml",r["Content-MD5"]=o.binaryBase64(o.md5(n)),d.call(this,{Action:"name/cos:PutBucketLogging",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:n,action:"logging",headers:r},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketLogging:function(e,t){d.call(this,{Action:"name/cos:GetBucketLogging",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"logging"},(function(e,n){if(e)return t(e);t(null,{BucketLoggingStatus:n.BucketLoggingStatus,statusCode:n.statusCode,headers:n.headers})}))},putBucketInventory:function(e,t){var n=o.clone(e.InventoryConfiguration);if(n.OptionalFields){var r=n.OptionalFields||[];n.OptionalFields={Field:r}}if(n.Destination&&n.Destination.COSBucketDestination&&n.Destination.COSBucketDestination.Encryption){var i=n.Destination.COSBucketDestination.Encryption;Object.keys(i).indexOf("SSECOS")>-1&&(i["SSE-COS"]=i.SSECOS,delete i.SSECOS)}var a=o.json2xml({InventoryConfiguration:n}),s=e.Headers;s["Content-Type"]="application/xml",s["Content-MD5"]=o.binaryBase64(o.md5(a)),d.call(this,{Action:"name/cos:PutBucketInventory",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:a,action:"inventory",qs:{id:e.Id},headers:s},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketInventory:function(e,t){d.call(this,{Action:"name/cos:GetBucketInventory",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"inventory",qs:{id:e.Id}},(function(e,n){if(e)return t(e);var r=n.InventoryConfiguration;if(r&&r.OptionalFields&&r.OptionalFields.Field){var i=r.OptionalFields.Field;o.isArray(i)||(i=[i]),r.OptionalFields=i}if(r.Destination&&r.Destination.COSBucketDestination&&r.Destination.COSBucketDestination.Encryption){var a=r.Destination.COSBucketDestination.Encryption;Object.keys(a).indexOf("SSE-COS")>-1&&(a.SSECOS=a["SSE-COS"],delete a["SSE-COS"])}t(null,{InventoryConfiguration:r,statusCode:n.statusCode,headers:n.headers})}))},listBucketInventory:function(e,t){d.call(this,{Action:"name/cos:ListBucketInventory",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"inventory",qs:{"continuation-token":e.ContinuationToken}},(function(e,n){if(e)return t(e);var r=n.ListInventoryConfigurationResult,i=r.InventoryConfiguration||[];i=o.isArray(i)?i:[i],delete r.InventoryConfiguration,o.each(i,(function(e){if(e&&e.OptionalFields&&e.OptionalFields.Field){var t=e.OptionalFields.Field;o.isArray(t)||(t=[t]),e.OptionalFields=t}if(e.Destination&&e.Destination.COSBucketDestination&&e.Destination.COSBucketDestination.Encryption){var n=e.Destination.COSBucketDestination.Encryption;Object.keys(n).indexOf("SSE-COS")>-1&&(n.SSECOS=n["SSE-COS"],delete n["SSE-COS"])}})),r.InventoryConfigurations=i,o.extend(r,{statusCode:n.statusCode,headers:n.headers}),t(null,r)}))},deleteBucketInventory:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketInventory",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"inventory",qs:{id:e.Id}},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketAccelerate:function(e,t){if(e.AccelerateConfiguration){var n={AccelerateConfiguration:e.AccelerateConfiguration||{}},r=o.json2xml(n),i={"Content-Type":"application/xml"};i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketAccelerate",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:r,action:"accelerate",headers:i},(function(e,n){if(e)return t(e);t(null,{statusCode:n.statusCode,headers:n.headers})}))}else t(o.error(new Error("missing param AccelerateConfiguration")))},getBucketAccelerate:function(e,t){d.call(this,{Action:"name/cos:GetBucketAccelerate",method:"GET",Bucket:e.Bucket,Region:e.Region,action:"accelerate"},(function(e,n){e||!n.AccelerateConfiguration&&(n.AccelerateConfiguration={}),t(e,n)}))},putBucketEncryption:function(e,t){var n=e.ServerSideEncryptionConfiguration||{},r=n.Rule||n.Rules||[],i=o.json2xml({ServerSideEncryptionConfiguration:{Rule:r}}),a=e.Headers;a["Content-Type"]="application/xml",a["Content-MD5"]=o.binaryBase64(o.md5(i)),d.call(this,{Action:"name/cos:PutBucketEncryption",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:i,action:"encryption",headers:a},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketEncryption:function(e,t){d.call(this,{Action:"name/cos:GetBucketEncryption",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"encryption"},(function(e,n){if(e)if(404===e.statusCode&&"NoSuchEncryptionConfiguration"===e.code){var r={EncryptionConfiguration:{Rules:[]},statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else t(e);else{var i=o.makeArray(n.EncryptionConfiguration&&n.EncryptionConfiguration.Rule||[]);n.EncryptionConfiguration={Rules:i},t(e,n)}}))},deleteBucketEncryption:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketReplication",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"encryption"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getObject:function(e,t){var n=e.Query||{},r=e.QueryString||"",i=o.throttleOnProgress.call(this,0,e.onProgress),a=e.tracker;a&&a.setParams({signStartTime:(new Date).getTime()}),n["response-content-type"]=e.ResponseContentType,n["response-content-language"]=e.ResponseContentLanguage,n["response-expires"]=e.ResponseExpires,n["response-cache-control"]=e.ResponseCacheControl,n["response-content-disposition"]=e.ResponseContentDisposition,n["response-content-encoding"]=e.ResponseContentEncoding,d.call(this,{Action:"name/cos:GetObject",method:"GET",Bucket:e.Bucket,Region:e.Region,Key:e.Key,VersionId:e.VersionId,DataType:e.DataType,headers:e.Headers,qs:n,qsStr:r,rawBody:!0,onDownloadProgress:i,tracker:a},(function(n,r){if(i(null,!0),n){var a=n.statusCode;return e.Headers["If-Modified-Since"]&&a&&304===a?t(null,{NotModified:!0}):t(n)}t(null,{Body:r.body,ETag:o.attr(r.headers,"etag",""),statusCode:r.statusCode,headers:r.headers})}))},headObject:function(e,t){d.call(this,{Action:"name/cos:HeadObject",method:"HEAD",Bucket:e.Bucket,Region:e.Region,Key:e.Key,VersionId:e.VersionId,headers:e.Headers},(function(n,r){if(n){var i=n.statusCode;return e.Headers["If-Modified-Since"]&&i&&304===i?t(null,{NotModified:!0,statusCode:i}):t(n)}r.ETag=o.attr(r.headers,"etag",""),t(null,r)}))},listObjectVersions:function(e,t){var n={};n.prefix=e.Prefix||"",n.delimiter=e.Delimiter,n["key-marker"]=e.KeyMarker,n["version-id-marker"]=e.VersionIdMarker,n["max-keys"]=e.MaxKeys,n["encoding-type"]=e.EncodingType,d.call(this,{Action:"name/cos:GetBucketObjectVersions",ResourceKey:n.prefix,method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,qs:n,action:"versions"},(function(e,n){if(e)return t(e);var r=n.ListVersionsResult||{},i=r.DeleteMarker||[];i=o.isArray(i)?i:[i];var a=r.Version||[];a=o.isArray(a)?a:[a];var s=o.clone(r);delete s.DeleteMarker,delete s.Version,o.extend(s,{DeleteMarkers:i,Versions:a,statusCode:n.statusCode,headers:n.headers}),t(null,s)}))},putObject:function(e,t){var n=this,r=e.ContentLength,i=o.throttleOnProgress.call(n,r,e.onProgress),a=e.Headers;a["Cache-Control"]||a["cache-control"]||(a["Cache-Control"]=""),a["Content-Type"]||a["content-type"]||(a["Content-Type"]=e.Body&&e.Body.type||"");var c=e.UploadAddMetaMd5||n.options.UploadAddMetaMd5||n.options.UploadCheckContentMd5,u=e.tracker;c&&u&&u.setParams({md5StartTime:(new Date).getTime()}),o.getBodyMd5(c,e.Body,(function(c){c&&(u&&u.setParams({md5EndTime:(new Date).getTime()}),n.options.UploadCheckContentMd5&&(a["Content-MD5"]=o.binaryBase64(c)),(e.UploadAddMetaMd5||n.options.UploadAddMetaMd5)&&(a["x-cos-meta-md5"]=c)),void 0!==e.ContentLength&&(a["Content-Length"]=e.ContentLength),i(null,!0),d.call(n,{Action:"name/cos:PutObject",TaskId:e.TaskId,method:"PUT",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,qs:e.Query,body:e.Body,onProgress:i,tracker:u},(function(a,c){if(a)return i(null,!0),t(a);i({loaded:r,total:r},!0);var u=s({ForcePathStyle:n.options.ForcePathStyle,protocol:n.options.Protocol,domain:n.options.Domain,bucket:e.Bucket,region:n.options.UseAccelerate?"accelerate":e.Region,object:e.Key});u=u.substr(u.indexOf("://")+3),c.Location=u,c.ETag=o.attr(c.headers,"etag",""),t(null,c)}))}),e.onHashProgress)},deleteObject:function(e,t){d.call(this,{Action:"name/cos:DeleteObject",method:"DELETE",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,VersionId:e.VersionId,action:e.Recursive?"recursive":""},(function(e,n){if(e){var r=e.statusCode;return r&&404===r?t(null,{BucketNotFound:!0,statusCode:r}):t(e)}t(null,{statusCode:n.statusCode,headers:n.headers})}))},getObjectAcl:function(e,t){d.call(this,{Action:"name/cos:GetObjectACL",method:"GET",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,action:"acl"},(function(e,n){if(e)return t(e);var r=n.AccessControlPolicy||{},a=r.Owner||{},s=r.AccessControlList&&r.AccessControlList.Grant||[];s=o.isArray(s)?s:[s];var c=i(r);delete c.GrantWrite,n.headers&&n.headers["x-cos-acl"]&&(c.ACL=n.headers["x-cos-acl"]),c=o.extend(c,{Owner:a,Grants:s,statusCode:n.statusCode,headers:n.headers}),t(null,c)}))},putObjectAcl:function(e,t){var n=e.Headers,r="";if(e.AccessControlPolicy){var i=o.clone(e.AccessControlPolicy||{}),s=i.Grants||i.Grant;s=o.isArray(s)?s:[s],delete i.Grant,delete i.Grants,i.AccessControlList={Grant:s},r=o.json2xml({AccessControlPolicy:i}),n["Content-Type"]="application/xml",n["Content-MD5"]=o.binaryBase64(o.md5(r))}o.each(n,(function(e,t){0===t.indexOf("x-cos-grant-")&&(n[t]=a(n[t]))})),d.call(this,{Action:"name/cos:PutObjectACL",method:"PUT",Bucket:e.Bucket,Region:e.Region,Key:e.Key,action:"acl",headers:n,body:r},(function(e,n){if(e)return t(e);t(null,{statusCode:n.statusCode,headers:n.headers})}))},optionsObject:function(e,t){var n=e.Headers;n.Origin=e.Origin,n["Access-Control-Request-Method"]=e.AccessControlRequestMethod,n["Access-Control-Request-Headers"]=e.AccessControlRequestHeaders,d.call(this,{Action:"name/cos:OptionsObject",method:"OPTIONS",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:n},(function(e,n){if(e)return e.statusCode&&403===e.statusCode?t(null,{OptionsForbidden:!0,statusCode:e.statusCode}):t(e);var r=n.headers||{};t(null,{AccessControlAllowOrigin:r["access-control-allow-origin"],AccessControlAllowMethods:r["access-control-allow-methods"],AccessControlAllowHeaders:r["access-control-allow-headers"],AccessControlExposeHeaders:r["access-control-expose-headers"],AccessControlMaxAge:r["access-control-max-age"],statusCode:n.statusCode,headers:n.headers})}))},putObjectCopy:function(e,t){var n=this,r=e.Headers;r["Cache-Control"]||r["cache-control"]||(r["Cache-Control"]="");var i=e.CopySource||"",a=o.getSourceParams.call(this,i);if(a){var c=a[1],u=a[3],l=decodeURIComponent(a[4]);d.call(this,{Scope:[{action:"name/cos:GetObject",bucket:c,region:u,prefix:l},{action:"name/cos:PutObject",bucket:e.Bucket,region:e.Region,prefix:e.Key}],method:"PUT",Bucket:e.Bucket,Region:e.Region,Key:e.Key,VersionId:e.VersionId,headers:e.Headers},(function(r,i){if(r)return t(r);var a=o.clone(i.CopyObjectResult||{}),c=s({ForcePathStyle:n.options.ForcePathStyle,protocol:n.options.Protocol,domain:n.options.Domain,bucket:e.Bucket,region:e.Region,object:e.Key,isLocation:!0});o.extend(a,{Location:c,statusCode:i.statusCode,headers:i.headers}),t(null,a)}))}else t(o.error(new Error("CopySource format error")))},deleteMultipleObject:function(e,t){var n=e.Objects||[],r=e.Quiet;n=o.isArray(n)?n:[n];var i=o.json2xml({Delete:{Object:n,Quiet:r||!1}}),a=e.Headers;a["Content-Type"]="application/xml",a["Content-MD5"]=o.binaryBase64(o.md5(i));var s=o.map(n,(function(t){return{action:"name/cos:DeleteObject",bucket:e.Bucket,region:e.Region,prefix:t.Key}}));d.call(this,{Scope:s,method:"POST",Bucket:e.Bucket,Region:e.Region,body:i,action:"delete",headers:a},(function(e,n){if(e)return t(e);var r=n.DeleteResult||{},i=r.Deleted||[],a=r.Error||[];i=o.isArray(i)?i:[i],a=o.isArray(a)?a:[a];var s=o.clone(r);o.extend(s,{Error:a,Deleted:i,statusCode:n.statusCode,headers:n.headers}),t(null,s)}))},restoreObject:function(e,t){var n=e.Headers;if(e.RestoreRequest){var r=e.RestoreRequest||{},i=o.json2xml({RestoreRequest:r});n["Content-Type"]="application/xml",n["Content-MD5"]=o.binaryBase64(o.md5(i)),d.call(this,{Action:"name/cos:RestoreObject",method:"POST",Bucket:e.Bucket,Region:e.Region,Key:e.Key,VersionId:e.VersionId,body:i,action:"restore",headers:n},t)}else t(o.error(new Error("missing param RestoreRequest")))},putObjectTagging:function(e,t){var n=e.Tagging||{},r=n.TagSet||n.Tags||e.Tags||[];r=o.clone(o.isArray(r)?r:[r]);var i=o.json2xml({Tagging:{TagSet:{Tag:r}}}),a=e.Headers;a["Content-Type"]="application/xml",a["Content-MD5"]=o.binaryBase64(o.md5(i)),d.call(this,{Action:"name/cos:PutObjectTagging",method:"PUT",Bucket:e.Bucket,Key:e.Key,Region:e.Region,body:i,action:"tagging",headers:a,VersionId:e.VersionId},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getObjectTagging:function(e,t){d.call(this,{Action:"name/cos:GetObjectTagging",method:"GET",Key:e.Key,Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"tagging",VersionId:e.VersionId},(function(e,n){if(e)if(404!==e.statusCode||!e.error||"Not Found"!==e.error&&"NoSuchTagSet"!==e.error.Code)t(e);else{var r={Tags:[],statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else{var i=[];try{i=n.Tagging.TagSet.Tag||[]}catch(e){}i=o.clone(o.isArray(i)?i:[i]),t(null,{Tags:i,statusCode:n.statusCode,headers:n.headers})}}))},deleteObjectTagging:function(e,t){d.call(this,{Action:"name/cos:DeleteObjectTagging",method:"DELETE",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,action:"tagging",VersionId:e.VersionId},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},selectObjectContent:function(e,t){if(!e.SelectType)return t(o.error(new Error("missing param SelectType")));var n=e.SelectRequest||{},r=o.json2xml({SelectRequest:n}),i=e.Headers;i["Content-Type"]="application/xml",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:GetObject",method:"POST",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,action:"select",qs:{"select-type":e.SelectType},VersionId:e.VersionId,body:r,DataType:"arraybuffer",rawBody:!0},(function(e,n){if(e&&204===e.statusCode)return t(null,{statusCode:e.statusCode});if(e)return t(e);var r=o.parseSelectPayload(n.body);t(null,{statusCode:n.statusCode,headers:n.headers,Body:r.body,Payload:r.payload})}))},appendObject:function(e,t){var n=e.Headers;n["Cache-Control"]||n["cache-control"]||(n["Cache-Control"]=""),n["Content-Type"]||n["content-type"]||(n["Content-Type"]=e.Body&&e.Body.type||""),d.call(this,{Action:"name/cos:AppendObject",method:"POST",Bucket:e.Bucket,Region:e.Region,action:"append",Key:e.Key,body:e.Body,qs:{position:e.Position},headers:e.Headers},(function(e,n){if(e)return t(e);t(null,n)}))},uploadPartCopy:function(e,t){var n=e.CopySource||"",r=o.getSourceParams.call(this,n);if(r){var i=r[1],a=r[3],s=decodeURIComponent(r[4]);d.call(this,{Scope:[{action:"name/cos:GetObject",bucket:i,region:a,prefix:s},{action:"name/cos:PutObject",bucket:e.Bucket,region:e.Region,prefix:e.Key}],method:"PUT",Bucket:e.Bucket,Region:e.Region,Key:e.Key,VersionId:e.VersionId,qs:{partNumber:e.PartNumber,uploadId:e.UploadId},headers:e.Headers},(function(e,n){if(e)return t(e);var r=o.clone(n.CopyPartResult||{});o.extend(r,{statusCode:n.statusCode,headers:n.headers}),t(null,r)}))}else t(o.error(new Error("CopySource format error")))},multipartInit:function(e,t){var n=this,r=e.Headers,i=e.tracker;r["Cache-Control"]||r["cache-control"]||(r["Cache-Control"]=""),r["Content-Type"]||r["content-type"]||(r["Content-Type"]=e.Body&&e.Body.type||"");var a=e.Body&&(e.UploadAddMetaMd5||n.options.UploadAddMetaMd5);a&&i&&i.setParams({md5StartTime:(new Date).getTime()}),o.getBodyMd5(a,e.Body,(function(r){r&&(e.Headers["x-cos-meta-md5"]=r),a&&i&&i.setParams({md5EndTime:(new Date).getTime()}),d.call(n,{Action:"name/cos:InitiateMultipartUpload",method:"POST",Bucket:e.Bucket,Region:e.Region,Key:e.Key,action:"uploads",headers:e.Headers,qs:e.Query,tracker:i},(function(e,n){return e?(i&&i.parent&&i.parent.setParams({errorNode:"multipartInit"}),t(e)):(n=o.clone(n||{}))&&n.InitiateMultipartUploadResult?t(null,o.extend(n.InitiateMultipartUploadResult,{statusCode:n.statusCode,headers:n.headers})):void t(null,n)}))}),e.onHashProgress)},multipartUpload:function(e,t){var n=this;o.getFileSize("multipartUpload",e,(function(){var r=e.tracker,i=n.options.UploadCheckContentMd5;i&&r&&r.setParams({md5StartTime:(new Date).getTime()}),o.getBodyMd5(i,e.Body,(function(a){a&&(e.Headers["Content-MD5"]=o.binaryBase64(a)),i&&r&&r.setParams({md5EndTime:(new Date).getTime()}),r&&r.setParams({partNumber:e.PartNumber}),d.call(n,{Action:"name/cos:UploadPart",TaskId:e.TaskId,method:"PUT",Bucket:e.Bucket,Region:e.Region,Key:e.Key,qs:{partNumber:e.PartNumber,uploadId:e.UploadId},headers:e.Headers,onProgress:e.onProgress,body:e.Body||null,tracker:r},(function(e,n){if(e)return r&&r.parent&&r.parent.setParams({errorNode:"multipartUpload"}),t(e);t(null,{ETag:o.attr(n.headers,"etag",""),statusCode:n.statusCode,headers:n.headers})}))}))}))},multipartComplete:function(e,t){for(var n=this,r=e.UploadId,i=e.Parts,a=e.tracker,c=0,u=i.length;c-1?function(e){var t=e.match(/q-url-param-list.*?(?=&)/g)[0],n="q-url-param-list="+encodeURIComponent(t.replace(/q-url-param-list=/,"")).toLowerCase(),r=new RegExp(t,"g");return e.replace(r,n)}(n.Authorization):"sign="+encodeURIComponent(n.Authorization)),n.SecurityToken&&(r+="&x-cos-security-token="+n.SecurityToken),n.ClientIP&&(r+="&clientIP="+n.ClientIP),n.ClientUA&&(r+="&clientUA="+n.ClientUA),n.Token&&(r+="&token="+n.Token),a&&(r+="&"+a),setTimeout((function(){t(null,{Url:r})}))}}));return p?(l+="?"+p.Authorization+(p.SecurityToken?"&x-cos-security-token="+p.SecurityToken:""),a&&(l+="&"+a)):a&&(l+="?"+a),l},getAuth:function(e){return o.getAuth({SecretId:e.SecretId||this.options.SecretId||"",SecretKey:e.SecretKey||this.options.SecretKey||"",Bucket:e.Bucket,Region:e.Region,Method:e.Method,Key:e.Key,Query:e.Query,Headers:e.Headers,Expires:e.Expires,UseRawKey:this.options.UseRawKey,SystemClockOffset:this.options.SystemClockOffset})}};e.exports.init=function(e,t){t.transferToTaskMethod(f,"putObject"),o.each(f,(function(t,n){e.prototype[n]=o.apiWrapper(n,t),function(e,t,n){o.each(["Cors","Acl"],(function(r){if(e.slice(-r.length)===r){var i=e.slice(0,-r.length)+r.toUpperCase(),a=o.apiWrapper(e,t);n[i]=function(){a.apply(this,arguments)}}}))}(n,t,e.prototype)}))}},function(e,t){function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}var r=function(e){switch(n(e)){case"string":return e;case"boolean":return e?"true":"false";case"number":return isFinite(e)?e:"";default:return""}},o=function(e,t,n){var r={};return t.getAllResponseHeaders().trim().split("\n").forEach((function(e){if(e){var t=e.indexOf(":"),n=e.substr(0,t).trim().toLowerCase(),o=e.substr(t+1).trim();r[n]=o}})),{error:e,statusCode:t.status,statusMessage:t.statusText,headers:r,body:n}},i=function(e,t){return t||"text"!==t?e.response:e.responseText};e.exports=function(e,t){var a,s,c,u,l=(e.method||"GET").toUpperCase(),d=e.url;if(e.qs){var p=(a=e.qs,s=s||"&",c=c||"=",null===a&&(a=void 0),"object"===n(a)?Object.keys(a).map((function(e){var t=encodeURIComponent(r(e))+c;return Array.isArray(a[e])?a[e].map((function(e){return t+encodeURIComponent(r(e))})).join(s):t+encodeURIComponent(r(a[e]))})).filter(Boolean).join(s):u?encodeURIComponent(r(u))+c+encodeURIComponent(r(a)):"");p&&(d+=(-1===d.indexOf("?")?"?":"&")+p)}var f=new XMLHttpRequest;if(f.open(l,d,!0),f.responseType=e.dataType||"text",e.xhrFields)for(var h in e.xhrFields)f[h]=e.xhrFields[h];var m=e.headers;if(m)for(var g in m)m.hasOwnProperty(g)&&"content-length"!==g.toLowerCase()&&"user-agent"!==g.toLowerCase()&&"origin"!==g.toLowerCase()&&"host"!==g.toLowerCase()&&f.setRequestHeader(g,m[g]);return e.onProgress&&f.upload&&(f.upload.onprogress=e.onProgress),e.onDownloadProgress&&(f.onprogress=e.onDownloadProgress),e.timeout&&(f.timeout=e.timeout),f.ontimeout=function(e){var n=new Error("timeout");t(o(n,f))},f.onload=function(){t(o(null,f,i(f,e.dataType)))},f.onerror=function(n){var r=i(f,e.dataType);if(r)t(o(null,f,r));else{var a=f.statusText;a||0!==f.status||(a=new Error("CORS blocked or network error")),t(o(a,f,r))}},f.send(e.body||""),f}},function(e,t,n){function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}var o=n(9),i=n(26),a=n(8).EventProxy,s=n(0),c=n(6);function u(e,t){var n=e.TaskId,r=e.Bucket,c=e.Region,u=e.Key,p=e.StorageClass,f=this,h={},m=e.FileSize,g=e.SliceSize,y=Math.ceil(m/g),v=0,C=s.throttleOnProgress.call(f,m,e.onHashProgress),k=function(t,n){var r=t.length;if(0===r)return n(null,!0);if(r>y)return n(null,!1);if(r>1&&Math.max(t[0].Size,t[1].Size)!==g)return n(null,!1);!function o(i){if(i=a.length)b.emit("has_and_check_upload_id",t);else{var p=a[l];if(!s.isInArray(t,p))return o.removeUploadId.call(f,p),void i(l+1);o.using[p]?i(l+1):d.call(f,{Bucket:r,Region:c,Key:u,UploadId:p,tracker:e.tracker},(function(e,t){f._isRunningTask(n)&&(e?(o.removeUploadId.call(f,p),i(l+1)):b.emit("upload_id_available",{UploadId:p,PartList:t.PartList}))}))}}(0)}else b.emit("has_and_check_upload_id",t)})),b.on("get_remote_upload_id_list",(function(){l.call(f,{Bucket:r,Region:c,Key:u,tracker:e.tracker},(function(t,i){if(f._isRunningTask(n)){if(t)return b.emit("error",t);var a=s.filter(i.UploadList,(function(e){return e.Key===u&&(!p||e.StorageClass.toUpperCase()===p.toUpperCase())})).reverse().map((function(e){return e.UploadId||e.UploadID}));if(a.length)b.emit("seek_local_avail_upload_id",a);else{var c,l=o.getFileId(e.Body,e.ChunkSize,r,u);l&&(c=o.getUploadIdList.call(f,l))&&s.each(c,(function(e){o.removeUploadId.call(f,e)})),b.emit("no_available_upload_id")}}}))})),b.emit("get_remote_upload_id_list")}function l(e,t){var n=this,r=[],o={Bucket:e.Bucket,Region:e.Region,Prefix:e.Key,calledBySdk:e.calledBySdk||"sliceUploadFile",tracker:e.tracker};!function e(){n.multipartList(o,(function(n,i){if(n)return t(n);r.push.apply(r,i.Upload||[]),"true"===i.IsTruncated?(o.KeyMarker=i.NextKeyMarker,o.UploadIdMarker=i.NextUploadIdMarker,e()):t(null,{UploadList:r})}))}()}function d(e,t){var n=this,r=[],o={Bucket:e.Bucket,Region:e.Region,Key:e.Key,UploadId:e.UploadId,calledBySdk:"sliceUploadFile",tracker:e.tracker};!function e(){n.multipartListPart(o,(function(n,i){if(n)return t(n);r.push.apply(r,i.Part||[]),"true"===i.IsTruncated?(o.PartNumberMarker=i.NextPartNumberMarker,e()):t(null,{PartList:r})}))}()}function p(e,t){var n=this,r=e.TaskId,o=e.Bucket,a=e.Region,c=e.Key,u=e.UploadData,l=e.FileSize,d=e.SliceSize,p=Math.min(e.AsyncLimit||n.options.ChunkParallelLimit||1,256),h=e.Body,m=Math.ceil(l/d),g=0,y=e.ServerSideEncryption,v=e.Headers,C=s.filter(u.PartList,(function(e){return e.Uploaded&&(g+=e.PartNumber>=m&&l%d||d),!e.Uploaded})),k=e.onProgress;i.eachLimit(C,p,(function(t,i){if(n._isRunningTask(r)){var s=t.PartNumber,p=Math.min(l,t.PartNumber*d)-(t.PartNumber-1)*d,m=0;f.call(n,{TaskId:r,Bucket:o,Region:a,Key:c,SliceSize:d,FileSize:l,PartNumber:s,ServerSideEncryption:y,Body:h,UploadData:u,Headers:v,onProgress:function(e){g+=e.loaded-m,m=e.loaded,k({loaded:g,total:l})},tracker:e.tracker},(function(e,o){n._isRunningTask(r)&&(e||o.ETag||(e='get ETag error, please add "ETag" to CORS ExposeHeader setting.( 获取ETag失败,请在CORS ExposeHeader设置中添加ETag,请参考文档:https://cloud.tencent.com/document/product/436/13318 )'),e?g-=m:(g+=p-m,t.ETag=o.ETag),k({loaded:g,total:l}),i(e||null,o))}))}}),(function(e){if(n._isRunningTask(r))return e?t(e):void t(null,{UploadId:u.UploadId,SliceList:u.PartList})}))}function f(e,t){var n=this,r=e.TaskId,o=e.Bucket,a=e.Region,c=e.Key,u=e.FileSize,l=e.Body,d=1*e.PartNumber,p=e.SliceSize,f=e.ServerSideEncryption,h=e.UploadData,m=e.Headers||{},g=n.options.ChunkRetryTimes+1,y=p*(d-1),v=p,C=y+p;C>u&&(v=(C=u)-y);var k=["x-cos-traffic-limit","x-cos-mime-limit"],b={};s.each(m,(function(e,t){k.indexOf(t)>-1&&(b[t]=e)}));var S=h.PartList[d-1];i.retry(g,(function(t){n._isRunningTask(r)&&s.fileSlice(l,y,C,!0,(function(i){n.multipartUpload({TaskId:r,Bucket:o,Region:a,Key:c,ContentLength:v,PartNumber:d,UploadId:h.UploadId,ServerSideEncryption:f,Body:i,Headers:b,onProgress:e.onProgress,calledBySdk:"sliceUploadFile",tracker:e.tracker},(function(e,o){if(n._isRunningTask(r))return e?t(e):(S.Uploaded=!0,t(null,o))}))}))}),(function(e,o){if(n._isRunningTask(r))return t(e,o)}))}function h(e,t){var n=e.Bucket,r=e.Region,o=e.Key,a=e.UploadId,s=e.SliceList,c=this,u=this.options.ChunkRetryTimes+1,l=e.Headers,d=s.map((function(e){return{PartNumber:e.PartNumber,ETag:e.ETag}}));i.retry(u,(function(t){c.multipartComplete({Bucket:n,Region:r,Key:o,UploadId:a,Parts:d,Headers:l,calledBySdk:"sliceUploadFile",tracker:e.tracker},t)}),(function(e,n){t(e,n)}))}function m(e,t){var n=e.Bucket,r=e.Region,o=e.Key,a=e.AbortArray,s=e.AsyncLimit||1,c=this,u=0,l=new Array(a.length);i.eachLimit(a,s,(function(t,i){var a=u;if(o&&o!==t.Key)return l[a]={error:{KeyNotMatch:!0}},void i(null);var s=t.UploadId||t.UploadID;c.multipartAbort({Bucket:n,Region:r,Key:t.Key,Headers:e.Headers,UploadId:s},(function(e){var o={Bucket:n,Region:r,Key:t.Key,UploadId:s};l[a]={error:e,task:o},i(null)})),u++}),(function(e){if(e)return t(e);for(var n=[],r=[],o=0,i=l.length;oo?"sliceUploadFile":"putObject",h=e.onFileFinish;i.push({api:f,params:e,callback:function(n,r){e.tracker&&e.tracker.formatResult(n,r),h&&h(n,r,l),t&&t(n,r)}}),n._addTasks(i)},uploadFiles:function(e,t){var n=this,o=void 0===e.SliceSize?n.options.SliceSize:e.SliceSize,i=0,a=0,u=s.throttleOnProgress.call(n,a,e.onProgress),l=e.files.length,d=e.onFileFinish,p=Array(l),f=function(e,n,r){u(null,!0),d&&d(e,n,r),p[r.Index]={options:r,error:e,data:n},--l<=0&&t&&t(null,{files:p})},h=[];s.each(e.files,(function(e,t){!function(){var l=e.Body,d=l.size||l.length||0,p={Index:t,TaskId:""};if(i+=d,n.options.EnableTracker){var m=n.options.UseAccelerate||n.options.Domain.includes("accelerate.");e.tracker=new c({bucket:e.Bucket,region:e.Region,apiName:"uploadFiles",fileKey:e.Key,fileSize:d,accelerate:m,deepTracker:n.options.DeepTracker,customId:n.options.CustomId,delay:n.options.TrackerDelay})}s.each(e,(function(e,t){"object"!==r(e)&&"function"!=typeof e&&(p[t]=e)}));var g=e.onTaskReady;e.onTaskReady=function(e){p.TaskId=e,g&&g(e)};var y=0,v=e.onProgress;e.onProgress=function(e){a=a-y+e.loaded,y=e.loaded,v&&v(e),u({loaded:a,total:i})};var C=d>o?"sliceUploadFile":"putObject",k=e.onFileFinish;h.push({api:C,params:e,callback:function(t,n){e.tracker&&e.tracker.formatResult(t,n),k&&k(t,n),f&&f(t,n,p)}})}()})),n._addTasks(h)},sliceCopyFile:function(e,t){var n=new a,r=this,o=e.Bucket,c=e.Region,u=e.Key,l=e.CopySource,d=s.getSourceParams.call(this,l);if(d){var p=d.Bucket,f=d.Region,h=decodeURIComponent(d.Key),m=void 0===e.CopySliceSize?r.options.CopySliceSize:e.CopySliceSize;m=Math.max(0,m);var y,v,C=e.CopyChunkSize||this.options.CopyChunkSize,k=this.options.CopyChunkParallelLimit,b=0;n.on("copy_slice_complete",(function(n){var i={};s.each(e.Headers,(function(e,t){0===t.toLowerCase().indexOf("x-cos-meta-")&&(i[t]=e)}));var a=s.map(n.PartList,(function(e){return{PartNumber:e.PartNumber,ETag:e.ETag}}));r.multipartComplete({Bucket:o,Region:c,Key:u,UploadId:n.UploadId,Parts:a,calledBySdk:"sliceCopyFile"},(function(e,n){if(e)return v(null,!0),t(e);v({loaded:y,total:y},!0),t(null,n)}))})),n.on("get_copy_data_finish",(function(e){i.eachLimit(e.PartList,k,(function(t,n){var i=t.PartNumber,a=t.CopySourceRange,s=t.end-t.start;g.call(r,{Bucket:o,Region:c,Key:u,CopySource:l,UploadId:e.UploadId,PartNumber:i,CopySourceRange:a},(function(e,r){if(e)return n(e);v({loaded:b+=s,total:y}),t.ETag=r.ETag,n(e||null,r)}))}),(function(r){if(r)return v(null,!0),t(r);n.emit("copy_slice_complete",e)}))})),n.on("get_file_size_finish",(function(i){var a;if(function(){for(var t=[1,2,4,8,16,32,64,128,256,512,1024,2048,4096,5120],n=1048576,o=0;on.length&&(c[t]=e)})),n.emit("get_file_size_finish",c)}else t(s.error(new Error('get Content-Length error, please add "Content-Length" to CORS ExposeHeader setting.( 获取Content-Length失败,请在CORS ExposeHeader设置中添加Content-Length,请参考文档:https://cloud.tencent.com/document/product/436/13318 )')))}))}else t(s.error(new Error("CopySource format error")))}};e.exports.init=function(e,t){t.transferToTaskMethod(y,"sliceUploadFile"),s.each(y,(function(t,n){e.prototype[n]=s.apiWrapper(n,t)}))}},function(e,t){var n={eachLimit:function(e,t,n,r){if(r=r||function(){},!e.length||t<=0)return r();var o=0,i=0,a=0;!function s(){if(o>=e.length)return r();for(;a=e.length?r():s())}))}()},retry:function(e,t,n){e<1?n():function r(o){t((function(t,i){t&&ot?1:-1}))}var d,p=["content-disposition","content-encoding","content-length","content-md5","expect","host","if-match","if-modified-since","if-none-match","if-unmodified-since","origin","range","response-cache-control","response-content-disposition","response-content-encoding","response-content-language","response-content-type","response-expires","transfer-encoding","versionid"],f=function(e,t,n){var r=t/8,o=e.slice(n,n+r);return new Uint8Array(o).reverse(),new{8:Uint8Array,16:Uint16Array,32:Uint32Array}[t](o)[0]},h=function(e,t,n,r){var o=e.slice(t,n),i="";return new Uint8Array(o).forEach((function(e){i+=String.fromCharCode(e)})),r&&(i=decodeURIComponent(escape(i))),i},m=function(){},g=function(e){var t={};for(var n in e)e.hasOwnProperty(n)&&void 0!==e[n]&&null!==e[n]&&(t[n]=e[n]);return t},y=(d=function(e,t){e=e.split("."),t=t.split(".");for(var n=0;nparseInt(t[n])?1:-1;return 0},function(e){if(!e)return!1;var t=(e.match(/Chrome\/([.\d]+)/)||[])[1],n=(e.match(/QBCore\/([.\d]+)/)||[])[1],r=(e.match(/QQBrowser\/([.\d]+)/)||[])[1];return t&&d(t,"53.0.2785.116")<0&&n&&d(n,"3.53.991.400")<0&&r&&d(r,"9.0.2524.400")<=0||!1}("undefined"!=typeof navigator&&navigator.userAgent)),v=1048576;function C(e){return w(e,(function(e){return"object"===r(e)&&null!==e?C(e):e}))}function k(e,t){return b(t,(function(n,r){e[r]=t[r]})),e}function S(e){return e instanceof Array}function b(e,t){for(var n in e)e.hasOwnProperty(n)&&t(e[n],n)}function w(e,t){var n=S(e)?[]:{};for(var r in e)e.hasOwnProperty(r)&&(n[r]=t(e[r],r));return n}var T=function(e,t){var n=t.Bucket,r=t.Region,o=t.Key,i=this.options.Domain,a=!i||"string"==typeof i&&i.indexOf("{Bucket}")>-1,s=!i||"string"==typeof i&&i.indexOf("{Region}")>-1;if(e.indexOf("Bucket")>-1||"deleteMultipleObject"===e||"multipartList"===e||"listObjectVersions"===e){if(a&&!n)return"Bucket";if(s&&!r)return"Region"}else if(e.indexOf("Object")>-1||e.indexOf("multipart")>-1||"sliceUploadFile"===e||"abortUploadTask"===e){if(a&&!n)return"Bucket";if(s&&!r)return"Region";if(!o)return"Key"}return!1},R=function(e,t){if(t=k({},t),"getAuth"!==e&&"getV4Auth"!==e&&"getObjectUrl"!==e){var n=t.Headers||{};if(t&&"object"===r(t)){!function(){for(var e in t)t.hasOwnProperty(e)&&e.indexOf("x-cos-")>-1&&(n[e]=t[e])}();x.each({"x-cos-mfa":"MFA","Content-MD5":"ContentMD5","Content-Length":"ContentLength","Content-Type":"ContentType",Expect:"Expect",Expires:"Expires","Cache-Control":"CacheControl","Content-Disposition":"ContentDisposition","Content-Encoding":"ContentEncoding",Range:"Range","If-Modified-Since":"IfModifiedSince","If-Unmodified-Since":"IfUnmodifiedSince","If-Match":"IfMatch","If-None-Match":"IfNoneMatch","x-cos-copy-source":"CopySource","x-cos-copy-source-Range":"CopySourceRange","x-cos-metadata-directive":"MetadataDirective","x-cos-copy-source-If-Modified-Since":"CopySourceIfModifiedSince","x-cos-copy-source-If-Unmodified-Since":"CopySourceIfUnmodifiedSince","x-cos-copy-source-If-Match":"CopySourceIfMatch","x-cos-copy-source-If-None-Match":"CopySourceIfNoneMatch","x-cos-acl":"ACL","x-cos-grant-read":"GrantRead","x-cos-grant-write":"GrantWrite","x-cos-grant-full-control":"GrantFullControl","x-cos-grant-read-acp":"GrantReadAcp","x-cos-grant-write-acp":"GrantWriteAcp","x-cos-storage-class":"StorageClass","x-cos-traffic-limit":"TrafficLimit","x-cos-mime-limit":"MimeLimit","x-cos-server-side-encryption-customer-algorithm":"SSECustomerAlgorithm","x-cos-server-side-encryption-customer-key":"SSECustomerKey","x-cos-server-side-encryption-customer-key-MD5":"SSECustomerKeyMD5","x-cos-server-side-encryption":"ServerSideEncryption","x-cos-server-side-encryption-cos-kms-key-id":"SSEKMSKeyId","x-cos-server-side-encryption-context":"SSEContext"},(function(e,r){void 0!==t[e]&&(n[r]=t[e])})),t.Headers=g(n)}}return t},E=function(e){return Date.now()+(e||0)},x={noop:m,formatParams:R,apiWrapper:function(e,t){return function(n,r){var o,i=this;if("function"==typeof n&&(r=n,n={}),n=R(e,n),i.options.EnableTracker)if("sliceUploadFile"===n.calledBySdk)o=n.tracker&&n.tracker.generateSubTracker({apiName:e});else if(["uploadFile","uploadFiles"].includes(e))o=null;else{var a=-1;n.Body&&(a="string"==typeof n.Body?n.Body.length:n.Body.size||n.Body.byteLength||-1),o=new c({bucket:n.Bucket,region:n.Region,apiName:e,fileKey:n.Key,fileSize:a,deepTracker:i.options.DeepTracker,customId:i.options.CustomId,delay:i.options.TrackerDelay})}n.tracker=o;var s=function(e){return e&&e.headers&&(e.headers["x-cos-request-id"]&&(e.RequestId=e.headers["x-cos-request-id"]),e.headers["x-ci-request-id"]&&(e.RequestId=e.headers["x-ci-request-id"]),e.headers["x-cos-version-id"]&&(e.VersionId=e.headers["x-cos-version-id"]),e.headers["x-cos-delete-marker"]&&(e.DeleteMarker=e.headers["x-cos-delete-marker"])),e},u=function(e,t){o&&o.formatResult(e,t),r&&r(s(e),s(t))},l=function(){if("getService"!==e&&"abortUploadTask"!==e){var t=T.call(i,e,n);if(t)return"missing param "+t;if(n.Region){if(i.options.CompatibilityMode){if(!/^([a-z\d-.]+)$/.test(n.Region))return"Region format error."}else{if(n.Region.indexOf("cos.")>-1)return'param Region should not be start with "cos."';if(!/^([a-z\d-]+)$/.test(n.Region))return"Region format error."}!i.options.CompatibilityMode&&-1===n.Region.indexOf("-")&&"yfb"!==n.Region&&"default"!==n.Region&&n.Region}if(n.Bucket){if(!/^([a-z\d-]+)-(\d+)$/.test(n.Bucket))if(n.AppId)n.Bucket=n.Bucket+"-"+n.AppId;else{if(!i.options.AppId)return'Bucket should format as "test-1250000000".';n.Bucket=n.Bucket+"-"+i.options.AppId}n.AppId&&delete n.AppId}!i.options.UseRawKey&&n.Key&&"/"===n.Key.substr(0,1)&&(n.Key=n.Key.substr(1))}}(),d="getAuth"===e||"getObjectUrl"===e;if("function"==typeof Promise&&!d&&!r)return new Promise((function(e,o){if(r=function(t,n){t?o(t):e(n)},l)return u(x.error(new Error(l)));t.call(i,n,u)}));if(l)return u(x.error(new Error(l)));var p=t.call(i,n,u);return d?p:void 0}},xml2json:a,json2xml:s,md5:o,clearKey:g,fileSlice:function(e,t,n,r,o){var i;if(e.slice?i=e.slice(t,n):e.mozSlice?i=e.mozSlice(t,n):e.webkitSlice&&(i=e.webkitSlice(t,n)),r&&y){var a=new FileReader;a.onload=function(e){i=null,o(new Blob([a.result]))},a.readAsArrayBuffer(i)}else o(i)},getBodyMd5:function(e,t,n,r){n=n||m,e?"string"==typeof t?n(x.md5(t,!0)):Blob&&t instanceof Blob?x.getFileMd5(t,(function(e,t){n(t)}),r):n():n()},getFileMd5:function(e,t,n){var r=e.size,i=0,a=o.getCtx();!function o(s){if(s>=r){var c=a.digest("hex");t(null,c)}else{var u=Math.min(r,s+v);x.fileSlice(e,s,u,!1,(function(e){!function(e,t){var n,r=new FileReader;FileReader.prototype.readAsBinaryString?(n=FileReader.prototype.readAsBinaryString,r.onload=function(){t(this.result)}):FileReader.prototype.readAsArrayBuffer&&(n=function(e){var n="",r=new FileReader;r.onload=function(e){for(var o=new Uint8Array(r.result),i=o.byteLength,a=0;a-1||p.indexOf(r)>-1)&&(t[n]=e[n])}return t}(C(e.Headers||e.headers||{})),u=e.Key||"";e.UseRawKey?t=e.Pathname||e.pathname||"/"+u:0!==(t=e.Pathname||e.pathname||u).indexOf("/")&&(t="/"+t);var d=!1!==e.ForceSignHost;if(!c.Host&&!c.host&&e.Bucket&&e.Region&&d&&(c.Host=e.Bucket+".cos."+e.Region+".myqcloud.com"),!n)throw new Error("missing param SecretId");if(!r)throw new Error("missing param SecretKey");var f=Math.round(E(e.SystemClockOffset)/1e3)-1,h=f,m=e.Expires||e.expires;h+=void 0===m?900:1*m||0;var g=n,y=o||f+";"+h,v=o||f+";"+h,k=l(c,!0).join(";").toLowerCase(),S=l(s,!0).join(";").toLowerCase(),b=i.HmacSHA1(v,r).toString(),w=[a,t,x.obj2str(s,!0),x.obj2str(c,!0),""].join("\n"),T=["sha1",y,i.SHA1(w).toString(),""].join("\n");return["q-sign-algorithm=sha1","q-ak="+g,"q-sign-time="+y,"q-key-time="+v,"q-header-list="+k,"q-url-param-list="+S,"q-signature="+i.HmacSHA1(T,b).toString()].join("&")},parseSelectPayload:function(e){for(var t={},n=h(e),r={records:[]};e.byteLength;){var o,i=f(e,32,0),a=f(e,32,4),s=i-a-16,c=0;for(e=e.slice(12);c1)for(var n=1;n=0))throw x(R,new Error(e.tagName+"@"+n));for(var o=t.length-1;r"==e&&">")||"&"==e&&"&"||'"'==e&&"""||"&#"+e.charCodeAt()+";"}function L(e,t){if(t(e))return!0;if(e=e.firstChild)do{if(L(e,t))return!0}while(e=e.nextSibling)}function H(){}function j(e,t,n,o){e&&e._inc++,n.namespaceURI===r.XMLNS&&delete t._nsMap[n.prefix?n.localName:""]}function F(e,t,n){if(e&&e._inc){e._inc++;var r=t.childNodes;if(n)r[r.length++]=n;else{for(var o=t.firstChild,i=0;o;)r[i++]=o,o=o.nextSibling;r.length=i,delete r[r.length]}}}function K(e,t){var n=t.previousSibling,r=t.nextSibling;return n?n.nextSibling=r:e.firstChild=r,r?r.previousSibling=n:e.lastChild=n,t.parentNode=null,t.previousSibling=null,t.nextSibling=null,F(e.ownerDocument,e),t}function q(e,t,n){var r=t.parentNode;if(r&&r.removeChild(t),t.nodeType===k){var o=t.firstChild;if(null==o)return t;var i=t.lastChild}else o=i=t;var a=n?n.previousSibling:e.lastChild;o.previousSibling=a,i.nextSibling=n,a?a.nextSibling=o:e.firstChild=o,null==n?e.lastChild=i:n.previousSibling=i;do{o.parentNode=e}while(o!==i&&(o=o.nextSibling));return F(e.ownerDocument||e,e),t.nodeType==k&&(t.firstChild=t.lastChild=null),t}function z(){this._nsMap={}}function G(){}function V(){}function X(){}function W(){}function J(){}function Q(){}function $(){}function Y(){}function Z(){}function ee(){}function te(){}function ne(){}function re(e,t){var n=[],r=9==this.nodeType&&this.documentElement||this,o=r.prefix,i=r.namespaceURI;if(i&&null==o&&null==(o=r.lookupPrefix(i)))var a=[{namespace:i,prefix:null}];return ae(this,n,e,t,a),n.join("")}function oe(e,t,n){var o=e.prefix||"",i=e.namespaceURI;if(!i)return!1;if("xml"===o&&i===r.XML||i===r.XMLNS)return!1;for(var a=n.length;a--;){var s=n[a];if(s.prefix===o)return s.namespace!==i}return!0}function ie(e,t,n){e.push(" ",t,'="',n.replace(/[<>&"\t\n\r]/g,M),'"')}function ae(e,t,n,o,i){if(i||(i=[]),o){if(!(e=o(e)))return;if("string"==typeof e)return void t.push(e)}switch(e.nodeType){case l:var a=e.attributes,s=a.length,c=e.firstChild,u=e.tagName,m=u;if(!(n=r.isHTML(e.namespaceURI)||n)&&!e.prefix&&e.namespaceURI){for(var S,b=0;b=0;w--){if(""===(T=i[w]).prefix&&T.namespace===e.namespaceURI){S=T.namespace;break}}if(S!==e.namespaceURI)for(w=i.length-1;w>=0;w--){var T;if((T=i[w]).namespace===e.namespaceURI){T.prefix&&(m=T.prefix+":"+u);break}}}t.push("<",m);for(var R=0;R"),n&&/^script$/i.test(u))for(;c;)c.data?t.push(c.data):ae(c,t,n,o,i.slice()),c=c.nextSibling;else for(;c;)ae(c,t,n,o,i.slice()),c=c.nextSibling;t.push("")}else t.push("/>");return;case v:case k:for(c=e.firstChild;c;)ae(c,t,n,o,i.slice()),c=c.nextSibling;return;case d:return ie(t,e.name,e.value);case p:return t.push(e.data.replace(/[<&>]/g,M));case f:return t.push("");case y:return t.push("\x3c!--",e.data,"--\x3e");case C:var B=e.publicId,I=e.systemId;if(t.push("");else if(I&&"."!=I)t.push(" SYSTEM ",I,">");else{var _=e.internalSubset;_&&t.push(" [",_,"]"),t.push(">")}return;case g:return t.push("");case h:return t.push("&",e.nodeName,";");default:t.push("??",e.nodeName)}}function se(e,t,n){var r;switch(t.nodeType){case l:(r=t.cloneNode(!1)).ownerDocument=e;case k:break;case d:n=!0}if(r||(r=t.cloneNode(!1)),r.ownerDocument=e,r.parentNode=null,n)for(var o=t.firstChild;o;)r.appendChild(se(e,o,n)),o=o.nextSibling;return r}function ce(e,t,n){var r=new t.constructor;for(var o in t){var i=t[o];"object"!=typeof i&&i!=r[o]&&(r[o]=i)}switch(t.childNodes&&(r.childNodes=new A),r.ownerDocument=e,r.nodeType){case l:var a=t.attributes,s=r.attributes=new _,c=a.length;s._ownerElement=r;for(var u=0;u0},lookupPrefix:function(e){for(var t=this;t;){var n=t._nsMap;if(n)for(var r in n)if(n[r]==e)return r;t=t.nodeType==d?t.ownerDocument:t.parentNode}return null},lookupNamespaceURI:function(e){for(var t=this;t;){var n=t._nsMap;if(n&&e in n)return n[e];t=t.nodeType==d?t.ownerDocument:t.parentNode}return null},isDefaultNamespace:function(e){return null==this.lookupPrefix(e)}},s(u,U),s(u,U.prototype),H.prototype={nodeName:"#document",nodeType:v,doctype:null,documentElement:null,_inc:1,insertBefore:function(e,t){if(e.nodeType==k){for(var n=e.firstChild;n;){var r=n.nextSibling;this.insertBefore(n,t),n=r}return e}return null==this.documentElement&&e.nodeType==l&&(this.documentElement=e),q(this,e,t),e.ownerDocument=this,e},removeChild:function(e){return this.documentElement==e&&(this.documentElement=null),K(this,e)},importNode:function(e,t){return se(this,e,t)},getElementById:function(e){var t=null;return L(this.documentElement,(function(n){if(n.nodeType==l&&n.getAttribute("id")==e)return t=n,!0})),t},getElementsByClassName:function(e){var t=a(e);return new B(this,(function(n){var r=[];return t.length>0&&L(n.documentElement,(function(o){if(o!==n&&o.nodeType===l){var i=o.getAttribute("class");if(i){var s=e===i;if(!s){var c=a(i);s=t.every((u=c,function(e){return u&&-1!==u.indexOf(e)}))}s&&r.push(o)}}var u})),r}))},createElement:function(e){var t=new z;return t.ownerDocument=this,t.nodeName=e,t.tagName=e,t.localName=e,t.childNodes=new A,(t.attributes=new _)._ownerElement=t,t},createDocumentFragment:function(){var e=new ee;return e.ownerDocument=this,e.childNodes=new A,e},createTextNode:function(e){var t=new X;return t.ownerDocument=this,t.appendData(e),t},createComment:function(e){var t=new W;return t.ownerDocument=this,t.appendData(e),t},createCDATASection:function(e){var t=new J;return t.ownerDocument=this,t.appendData(e),t},createProcessingInstruction:function(e,t){var n=new te;return n.ownerDocument=this,n.tagName=n.target=e,n.nodeValue=n.data=t,n},createAttribute:function(e){var t=new G;return t.ownerDocument=this,t.name=e,t.nodeName=e,t.localName=e,t.specified=!0,t},createEntityReference:function(e){var t=new Z;return t.ownerDocument=this,t.nodeName=e,t},createElementNS:function(e,t){var n=new z,r=t.split(":"),o=n.attributes=new _;return n.childNodes=new A,n.ownerDocument=this,n.nodeName=t,n.tagName=t,n.namespaceURI=e,2==r.length?(n.prefix=r[0],n.localName=r[1]):n.localName=t,o._ownerElement=n,n},createAttributeNS:function(e,t){var n=new G,r=t.split(":");return n.ownerDocument=this,n.nodeName=t,n.name=t,n.namespaceURI=e,n.specified=!0,2==r.length?(n.prefix=r[0],n.localName=r[1]):n.localName=t,n}},c(H,U),z.prototype={nodeType:l,hasAttribute:function(e){return null!=this.getAttributeNode(e)},getAttribute:function(e){var t=this.getAttributeNode(e);return t&&t.value||""},getAttributeNode:function(e){return this.attributes.getNamedItem(e)},setAttribute:function(e,t){var n=this.ownerDocument.createAttribute(e);n.value=n.nodeValue=""+t,this.setAttributeNode(n)},removeAttribute:function(e){var t=this.getAttributeNode(e);t&&this.removeAttributeNode(t)},appendChild:function(e){return e.nodeType===k?this.insertBefore(e,null):function(e,t){return t.parentNode&&t.parentNode.removeChild(t),t.parentNode=e,t.previousSibling=e.lastChild,t.nextSibling=null,t.previousSibling?t.previousSibling.nextSibling=t:e.firstChild=t,e.lastChild=t,F(e.ownerDocument,e,t),t}(this,e)},setAttributeNode:function(e){return this.attributes.setNamedItem(e)},setAttributeNodeNS:function(e){return this.attributes.setNamedItemNS(e)},removeAttributeNode:function(e){return this.attributes.removeNamedItem(e.nodeName)},removeAttributeNS:function(e,t){var n=this.getAttributeNodeNS(e,t);n&&this.removeAttributeNode(n)},hasAttributeNS:function(e,t){return null!=this.getAttributeNodeNS(e,t)},getAttributeNS:function(e,t){var n=this.getAttributeNodeNS(e,t);return n&&n.value||""},setAttributeNS:function(e,t,n){var r=this.ownerDocument.createAttributeNS(e,t);r.value=r.nodeValue=""+n,this.setAttributeNode(r)},getAttributeNodeNS:function(e,t){return this.attributes.getNamedItemNS(e,t)},getElementsByTagName:function(e){return new B(this,(function(t){var n=[];return L(t,(function(r){r===t||r.nodeType!=l||"*"!==e&&r.tagName!=e||n.push(r)})),n}))},getElementsByTagNameNS:function(e,t){return new B(this,(function(n){var r=[];return L(n,(function(o){o===n||o.nodeType!==l||"*"!==e&&o.namespaceURI!==e||"*"!==t&&o.localName!=t||r.push(o)})),r}))}},H.prototype.getElementsByTagName=z.prototype.getElementsByTagName,H.prototype.getElementsByTagNameNS=z.prototype.getElementsByTagNameNS,c(z,U),G.prototype.nodeType=d,c(G,U),V.prototype={data:"",substringData:function(e,t){return this.data.substring(e,e+t)},appendData:function(e){e=this.data+e,this.nodeValue=this.data=e,this.length=e.length},insertData:function(e,t){this.replaceData(e,0,t)},appendChild:function(e){throw new Error(w[T])},deleteData:function(e,t){this.replaceData(e,t,"")},replaceData:function(e,t,n){n=this.data.substring(0,e)+n+this.data.substring(e+t),this.nodeValue=this.data=n,this.length=n.length}},c(V,U),X.prototype={nodeName:"#text",nodeType:p,splitText:function(e){var t=this.data,n=t.substring(e);t=t.substring(0,e),this.data=this.nodeValue=t,this.length=t.length;var r=this.ownerDocument.createTextNode(n);return this.parentNode&&this.parentNode.insertBefore(r,this.nextSibling),r}},c(X,V),W.prototype={nodeName:"#comment",nodeType:y},c(W,V),J.prototype={nodeName:"#cdata-section",nodeType:f},c(J,V),Q.prototype.nodeType=C,c(Q,U),$.prototype.nodeType=S,c($,U),Y.prototype.nodeType=m,c(Y,U),Z.prototype.nodeType=h,c(Z,U),ee.prototype.nodeName="#document-fragment",ee.prototype.nodeType=k,c(ee,U),te.prototype.nodeType=g,c(te,U),ne.prototype.serializeToString=function(e,t,n){return re.call(e,t,n)},U.prototype.toString=re;try{if(Object.defineProperty){function le(e){switch(e.nodeType){case l:case k:var t=[];for(e=e.firstChild;e;)7!==e.nodeType&&8!==e.nodeType&&t.push(le(e)),e=e.nextSibling;return t.join("");default:return e.nodeValue}}Object.defineProperty(B.prototype,"length",{get:function(){return I(this),this.$$length}}),Object.defineProperty(U.prototype,"textContent",{get:function(){return le(this)},set:function(e){switch(this.nodeType){case l:case k:for(;this.firstChild;)this.removeChild(this.firstChild);(e||String(e))&&this.appendChild(this.ownerDocument.createTextNode(e));break;default:this.data=e,this.value=e,this.nodeValue=e}}}),ue=function(e,t,n){e["$$"+t]=n}}}catch(de){}t.DocumentType=Q,t.DOMException=x,t.DOMImplementation=N,t.Element=z,t.Node=U,t.NodeList=A,t.XMLSerializer=ne},function(e,t,n){var r=n(22),o=n(23),i=n(0),a=n(8),s=n(24),c=null,u=function(){var e=function(){return(65536*(1+Math.random())|0).toString(16).substring(1)};return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()},l=function(){if("object"===("undefined"==typeof navigator?"undefined":i(navigator))){var e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return(null==e?void 0:e.type)||(null==e?void 0:e.effectiveType)||"unknown"}return"unknown"},d=function(){if("object"!==("undefined"==typeof navigator?"undefined":i(navigator)))return"unknown os";var e=navigator.userAgent.toLowerCase(),t=/macintosh|mac os x/i.test(navigator.userAgent);return e.indexOf("win32")>=0||e.indexOf("wow32")>=0?"win32":e.indexOf("win64")>=0||e.indexOf("wow64")>=0?"win64":t?"mac":"unknown os"},p=function(){return!("object"!==("undefined"==typeof navigator?"undefined":i(navigator))||!navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))},f=function(){return!("object"!==("undefined"==typeof navigator?"undefined":i(navigator))||!navigator.userAgent.match(/(Android|Adr|Linux)/i))},h=function(){return!("object"!==("undefined"==typeof navigator?"undefined":i(navigator))||!navigator.userAgent.match(/(iPhone|iPod|iPad|iOS)/i))},m=function(){if("object"!==("undefined"==typeof navigator?"undefined":i(navigator)))return"unknown device";var e=navigator.userAgent.toLowerCase();if(e.includes("app/tencent_wemeet"))return"tencent_wemeet";if(e.indexOf("maxthon")>=0){var t=e.match(/maxthon\/([\d.]+)/),n=t&&t[1]||"";return"傲游浏览器 ".concat(n).trim()}if(e.indexOf("qqbrowser")>=0){var r=e.match(/qqbrowser\/([\d.]+)/),o=r&&r[1]||"";return"QQ浏览器 ".concat(o).trim()}if(e.indexOf("se 2.x")>=0)return"搜狗浏览器";if(e.indexOf("wxwork")>=0)return"微信内置浏览器";if(e.indexOf("msie")>=0){var a=e.match(/msie ([\d.]+)/),s=a&&a[1]||"";return"IE ".concat(s).trim()}if(e.indexOf("firefox")>=0){var c=e.match(/firefox\/([\d.]+)/),u=c&&c[1]||"";return"Firefox ".concat(u).trim()}if(e.indexOf("chrome")>=0){var l=e.match(/chrome\/([\d.]+)/),d=l&&l[1]||"";return"Chrome ".concat(d).trim()}if(e.indexOf("opera")>=0){var p=e.match(/opera.([\d.]+)/),f=p&&p[1]||"";return"Opera ".concat(f).trim()}if(e.indexOf("safari")>=0){var h=e.match(/version\/([\d.]+)/),m=h&&h[1]||"";return"Safari ".concat(m).trim()}if(e.indexOf("edge")>=0){var g=e.match(/edge\/([\d.]+)/),y=g&&g[1]||"";return"edge ".concat(y).trim()}return e.substr(0,200)},g={isMobile:p(),isBrowser:!p(),mobileOsType:f()?"android":h?"ios":"other_mobile",pcOsType:d()},y={deviceType:g.isMobile?"mobile":g.isBrowser?"browser":"unknown",devicePlatform:g.isMobile?g.mobileOsType:g.pcOsType,deviceName:m()},v=["multipartInit","multipartUpload","multipartComplete","multipartList","multipartListPart","multipartAbort"],C=["putObject","postObject","appendObject","sliceUploadFile","uploadFile","uploadFiles"].concat(v),k=["getObject"];function S(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase()}var b=function(){"use strict";function e(t){r(this,e);var n=t.parent,o=t.traceId,i=t.bucket,l=t.region,d=t.apiName,p=t.fileKey,f=t.fileSize,h=t.accelerate,m=t.customId,g=t.delay,v=t.deepTracker,C=i&&i.substr(i.lastIndexOf("-")+1)||"";this.parent=n,this.deepTracker=v,this.params={cossdkVersion:a.version,region:l,networkType:"",host:"",accelerate:h?"Y":"N",requestPath:p||"",size:f||-1,httpMd5:0,httpSign:0,httpFull:0,name:d||"",result:"",tookTime:0,errorNode:"",errorCode:"",errorMessage:"",errorRequestId:"",errorStatusCode:0,errorServiceName:"",tracePlatform:"cos-js-sdk-v5",traceId:o||u(),bucket:i,appid:C,partNumber:0,retryTimes:0,reqUrl:"",customId:m||"",deviceType:y.deviceType,devicePlatform:y.devicePlatform,deviceName:y.deviceName,md5StartTime:0,md5EndTime:0,signStartTime:0,signEndTime:0,httpStartTime:0,httpEndTime:0,startTime:(new Date).getTime(),endTime:0},this.beacon=function(e){return c||(c=new s({appkey:"0AND0VEVB24UBGDU",versionCode:a.version,channelID:"js_sdk",openid:"openid",unionid:"unid",strictMode:!1,delay:e,sessionDuration:6e4})),c}(g)}return o(e,[{key:"formatResult",value:function(e,t){var n,r,o,i,a,s,c=(new Date).getTime()-this.params.startTime,u=l(),d=e?(null==e?void 0:e.code)||(null==e||null===(n=e.error)||void 0===n?void 0:n.code)||(null==e||null===(r=e.error)||void 0===r?void 0:r.Code):"",p=e?(null==e?void 0:e.message)||(null==e||null===(o=e.error)||void 0===o?void 0:o.message)||(null==e||null===(i=e.error)||void 0===i?void 0:i.Message):"",f=e?(null==e?void 0:e.resource)||(null==e||null===(a=e.error)||void 0===a?void 0:a.resource)||(null==e||null===(s=e.error)||void 0===s?void 0:s.Resource):"",h=e?null==e?void 0:e.statusCode:t.statusCode,m=e?(null==e?void 0:e.headers)&&(null==e?void 0:e.headers["x-cos-request-id"]):(null==t?void 0:t.headers)&&(null==t?void 0:t.headers["x-cos-request-id"]),g=e?m?"Server":"Client":"";if(Object.assign(this.params,{tookTime:c,networkType:u,httpMd5:this.params.md5EndTime-this.params.md5StartTime,httpSign:this.params.signEndTime-this.params.signStartTime,httpFull:this.params.httpEndTime-this.params.httpStartTime,result:e?"Fail":"Success",errorType:g,errorCode:d,errorStatusCode:h,errorMessage:p,errorServiceName:f,errorRequestId:m}),!e||d&&p||(this.params.fullError=e?JSON.stringify(e):""),"getObject"===this.params.name&&(this.params.size=t?t.headers&&t.headers["content-length"]:-1),this.params.reqUrl)try{var y=/^http(s)?:\/\/(.*?)\//.exec(this.params.reqUrl);this.params.host=y[2]}catch(e){this.params.host=this.params.reqUrl}this.sendEvents()}},{key:"setParams",value:function(e){Object.assign(this.params,e)}},{key:"sendEvents",value:function(){if(!v.includes(this.params.name)||this.deepTracker){var e,t=(e=this.params.name,C.includes(e)?"cos_upload":k.includes(e)?"cos_download":"base_service"),n=function(e){var t={},n="Success"===e.result?["tracePlatform","cossdkVersion","region","bucket","appid","networkType","host","accelerate","requestPath","partNumber","size","name","result","tookTime","errorRequestId","retryTimes","reqUrl","customId","deviceType","devicePlatform","deviceName"]:["tracePlatform","cossdkVersion","region","networkType","host","accelerate","requestPath","size","httpMd5","httpSign","httpFull","name","result","tookTime","errorNode","errorCode","errorMessage","errorRequestId","errorStatusCode","errorServiceName","errorType","traceId","bucket","appid","partNumber","retryTimes","reqUrl","customId","fullError","deviceType","devicePlatform","deviceName"];for(var r in e)n.includes(r)&&(t[S(r)]=e[r]);return t}(this.params);0===this.params.delay?this.beacon.onDirectUserAction(t,n):this.beacon.onUserAction(t,n),this.destroy()}}},{key:"generateSubTracker",value:function(t){return Object.assign(t,{parent:this,deepTracker:this.deepTracker,traceId:this.params.traceId,bucket:this.params.bucket,region:this.params.region,fileKey:this.params.requestPath,customId:this.params.customId,delay:this.params.delay}),new e(t)}},{key:"destroy",value:function(){this.beacon=null,this.params={}}}]),e}();e.exports=b},function(e){e.exports=JSON.parse('{"name":"cos-js-sdk-v5","version":"1.4.1","description":"JavaScript SDK for [腾讯云对象存储](https://cloud.tencent.com/product/cos)","main":"dist/cos-js-sdk-v5.js","types":"index.d.ts","scripts":{"server":"node server/sts.js","dev":"cross-env NODE_ENV=development webpack -w --mode=development","build":"cross-env NODE_ENV=production webpack --mode=production","cos-auth.min.js":"uglifyjs ./demo/common/cos-auth.js -o ./demo/common/cos-auth.min.js -c -m","nyc":"node test/watcher.js && nyc report --reporter=clover --reporter=cobertura"},"repository":{"type":"git","url":"git+https://github.com/tencentyun/cos-js-sdk-v5.git"},"keywords":[],"author":"carsonxu","license":"ISC","bugs":{"url":"https://github.com/tencentyun/cos-js-sdk-v5/issues"},"homepage":"https://github.com/tencentyun/cos-js-sdk-v5#readme","dependencies":{"@xmldom/xmldom":"^0.8.2"},"devDependencies":{"@babel/core":"7.17.9","@babel/plugin-transform-runtime":"7.18.10","@babel/preset-env":"7.16.11","babel-loader":"8.2.5","body-parser":"^1.18.3","cross-env":"^5.2.0","express":"^4.16.4","nyc":"^15.1.0","puppeteer":"^5.3.1","puppeteer-to-istanbul":"^1.4.0","qcloud-cos-sts":"^3.0.2","request":"^2.87.0","terser-webpack-plugin":"4.2.3","webpack":"4.46.0","webpack-cli":"4.10.0"}}')},function(e,t){var n=function(e){var t={},n=function(e){return!t[e]&&(t[e]=[]),t[e]};e.on=function(e,t){n(e).push(t)},e.off=function(e,t){for(var r=n(e),o=r.length-1;o>=0;o--)t===r[o]&&r.splice(o,1)},e.emit=function(e,t){for(var r=n(e).map((function(e){return e})),o=0;o=0;n--){var o=r[n][2];(!o||o+2592e3=0;o--){var i=r[o];i[0]===e&&i[1]===t&&r.splice(o,1)}r.unshift([e,t,Math.round(Date.now()/1e3)]),r.length>n&&r.splice(n),l()}},removeUploadId:function(e){u.call(this),delete d.using[e];for(var t=r.length-1;t>=0;t--)r[t][1]===e&&r.splice(t,1);l()}};e.exports=d},function(e,t,n){var r=n(12);e.exports=r},function(e,t,n){"use strict";var r=n(1),o=n(9),i=n(25),a=n(26),s=n(28),c=n(8),u={AppId:"",SecretId:"",SecretKey:"",SecurityToken:"",ChunkRetryTimes:2,FileParallelLimit:3,ChunkParallelLimit:3,ChunkSize:1048576,SliceSize:1048576,CopyChunkParallelLimit:20,CopyChunkSize:10485760,CopySliceSize:10485760,MaxPartNumber:1e4,ProgressInterval:1e3,Domain:"",ServiceDomain:"",Protocol:"",CompatibilityMode:!1,ForcePathStyle:!1,UseRawKey:!1,Timeout:0,CorrectClockSkew:!0,SystemClockOffset:0,UploadCheckContentMd5:!1,UploadQueueSize:1e4,UploadAddMetaMd5:!1,UploadIdCacheLimit:50,UseAccelerate:!1,ForceSignHost:!0,EnableTracker:!1,DeepTracker:!1,TrackerDelay:5e3,CustomId:""},l=function(e){this.options=r.extend(r.clone(u),e||{}),this.options.FileParallelLimit=Math.max(1,this.options.FileParallelLimit),this.options.ChunkParallelLimit=Math.max(1,this.options.ChunkParallelLimit),this.options.ChunkRetryTimes=Math.max(0,this.options.ChunkRetryTimes),this.options.ChunkSize=Math.max(1048576,this.options.ChunkSize),this.options.CopyChunkParallelLimit=Math.max(1,this.options.CopyChunkParallelLimit),this.options.CopyChunkSize=Math.max(1048576,this.options.CopyChunkSize),this.options.CopySliceSize=Math.max(0,this.options.CopySliceSize),this.options.MaxPartNumber=Math.max(1024,Math.min(1e4,this.options.MaxPartNumber)),this.options.Timeout=Math.max(0,this.options.Timeout),this.options.AppId,this.options.SecretId&&this.options.SecretId.indexOf(" "),this.options.SecretKey&&this.options.SecretKey.indexOf(" "),r.isNode(),o.init(this),i.init(this)};a.init(l,i),s.init(l,i),l.util={md5:r.md5,xml2json:r.xml2json,json2xml:r.json2xml},l.getAuthorization=r.getAuth,l.version=c.version,e.exports=l},function(module,exports,__webpack_require__){(function(process,global,module){var __WEBPACK_AMD_DEFINE_RESULT__,_typeof=__webpack_require__(0);(function(){"use strict";var ERROR="input is invalid type",WINDOW="object"===("undefined"==typeof window?"undefined":_typeof(window)),root=WINDOW?window:{};root.JS_MD5_NO_WINDOW&&(WINDOW=!1);var WEB_WORKER=!WINDOW&&"object"===("undefined"==typeof self?"undefined":_typeof(self)),NODE_JS=!root.JS_MD5_NO_NODE_JS&&"object"===(void 0===process?"undefined":_typeof(process))&&process.versions&&process.versions.node;NODE_JS?root=global:WEB_WORKER&&(root=self);var COMMON_JS=!root.JS_MD5_NO_COMMON_JS&&"object"===_typeof(module)&&module.exports,AMD=__webpack_require__(14),ARRAY_BUFFER=!root.JS_MD5_NO_ARRAY_BUFFER&&"undefined"!=typeof ArrayBuffer,HEX_CHARS="0123456789abcdef".split(""),EXTRA=[128,32768,8388608,-2147483648],SHIFT=[0,8,16,24],OUTPUT_TYPES=["hex","array","digest","buffer","arrayBuffer","base64"],BASE64_ENCODE_CHAR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),blocks=[],buffer8;if(ARRAY_BUFFER){var buffer=new ArrayBuffer(68);buffer8=new Uint8Array(buffer),blocks=new Uint32Array(buffer)}!root.JS_MD5_NO_NODE_JS&&Array.isArray||(Array.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)}),!ARRAY_BUFFER||!root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW&&ArrayBuffer.isView||(ArrayBuffer.isView=function(e){return"object"===_typeof(e)&&e.buffer&&e.buffer.constructor===ArrayBuffer});var createOutputMethod=function(e){return function(t,n){return new Md5(!0).update(t,n)[e]()}},createMethod=function(){var e=createOutputMethod("hex");NODE_JS&&(e=nodeWrap(e)),e.getCtx=e.create=function(){return new Md5},e.update=function(t){return e.create().update(t)};for(var t=0;t>6,s[r++]=128|63&n):n<55296||n>=57344?(s[r++]=224|n>>12,s[r++]=128|n>>6&63,s[r++]=128|63&n):(n=65536+((1023&n)<<10|1023&e.charCodeAt(++o)),s[r++]=240|n>>18,s[r++]=128|n>>12&63,s[r++]=128|n>>6&63,s[r++]=128|63&n);else for(r=this.start;o>2]|=n<>2]|=(192|n>>6)<>2]|=(128|63&n)<=57344?(a[r>>2]|=(224|n>>12)<>2]|=(128|n>>6&63)<>2]|=(128|63&n)<>2]|=(240|n>>18)<>2]|=(128|n>>12&63)<>2]|=(128|n>>6&63)<>2]|=(128|63&n)<=64?(this.start=r-64,this.hash(),this.hashed=!0):this.start=r}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296<<0,this.bytes=this.bytes%4294967296),this}},Md5.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var e=this.blocks,t=this.lastByteIndex;e[t>>2]|=EXTRA[3&t],t>=56&&(this.hashed||this.hash(),e[0]=e[16],e[16]=e[1]=e[2]=e[3]=e[4]=e[5]=e[6]=e[7]=e[8]=e[9]=e[10]=e[11]=e[12]=e[13]=e[14]=e[15]=0),e[14]=this.bytes<<3,e[15]=this.hBytes<<3|this.bytes>>>29,this.hash()}},Md5.prototype.hash=function(){var e,t,n,r,o,i,a=this.blocks;this.first?t=((t=((e=((e=a[0]-680876937)<<7|e>>>25)-271733879<<0)^(n=((n=(-271733879^(r=((r=(-1732584194^2004318071&e)+a[1]-117830708)<<12|r>>>20)+e<<0)&(-271733879^e))+a[2]-1126478375)<<17|n>>>15)+r<<0)&(r^e))+a[3]-1316259209)<<22|t>>>10)+n<<0:(e=this.h0,t=this.h1,n=this.h2,t=((t+=((e=((e+=((r=this.h3)^t&(n^r))+a[0]-680876936)<<7|e>>>25)+t<<0)^(n=((n+=(t^(r=((r+=(n^e&(t^n))+a[1]-389564586)<<12|r>>>20)+e<<0)&(e^t))+a[2]+606105819)<<17|n>>>15)+r<<0)&(r^e))+a[3]-1044525330)<<22|t>>>10)+n<<0),t=((t+=((e=((e+=(r^t&(n^r))+a[4]-176418897)<<7|e>>>25)+t<<0)^(n=((n+=(t^(r=((r+=(n^e&(t^n))+a[5]+1200080426)<<12|r>>>20)+e<<0)&(e^t))+a[6]-1473231341)<<17|n>>>15)+r<<0)&(r^e))+a[7]-45705983)<<22|t>>>10)+n<<0,t=((t+=((e=((e+=(r^t&(n^r))+a[8]+1770035416)<<7|e>>>25)+t<<0)^(n=((n+=(t^(r=((r+=(n^e&(t^n))+a[9]-1958414417)<<12|r>>>20)+e<<0)&(e^t))+a[10]-42063)<<17|n>>>15)+r<<0)&(r^e))+a[11]-1990404162)<<22|t>>>10)+n<<0,t=((t+=((e=((e+=(r^t&(n^r))+a[12]+1804603682)<<7|e>>>25)+t<<0)^(n=((n+=(t^(r=((r+=(n^e&(t^n))+a[13]-40341101)<<12|r>>>20)+e<<0)&(e^t))+a[14]-1502002290)<<17|n>>>15)+r<<0)&(r^e))+a[15]+1236535329)<<22|t>>>10)+n<<0,t=((t+=((r=((r+=(t^n&((e=((e+=(n^r&(t^n))+a[1]-165796510)<<5|e>>>27)+t<<0)^t))+a[6]-1069501632)<<9|r>>>23)+e<<0)^e&((n=((n+=(e^t&(r^e))+a[11]+643717713)<<14|n>>>18)+r<<0)^r))+a[0]-373897302)<<20|t>>>12)+n<<0,t=((t+=((r=((r+=(t^n&((e=((e+=(n^r&(t^n))+a[5]-701558691)<<5|e>>>27)+t<<0)^t))+a[10]+38016083)<<9|r>>>23)+e<<0)^e&((n=((n+=(e^t&(r^e))+a[15]-660478335)<<14|n>>>18)+r<<0)^r))+a[4]-405537848)<<20|t>>>12)+n<<0,t=((t+=((r=((r+=(t^n&((e=((e+=(n^r&(t^n))+a[9]+568446438)<<5|e>>>27)+t<<0)^t))+a[14]-1019803690)<<9|r>>>23)+e<<0)^e&((n=((n+=(e^t&(r^e))+a[3]-187363961)<<14|n>>>18)+r<<0)^r))+a[8]+1163531501)<<20|t>>>12)+n<<0,t=((t+=((r=((r+=(t^n&((e=((e+=(n^r&(t^n))+a[13]-1444681467)<<5|e>>>27)+t<<0)^t))+a[2]-51403784)<<9|r>>>23)+e<<0)^e&((n=((n+=(e^t&(r^e))+a[7]+1735328473)<<14|n>>>18)+r<<0)^r))+a[12]-1926607734)<<20|t>>>12)+n<<0,t=((t+=((i=(r=((r+=((o=t^n)^(e=((e+=(o^r)+a[5]-378558)<<4|e>>>28)+t<<0))+a[8]-2022574463)<<11|r>>>21)+e<<0)^e)^(n=((n+=(i^t)+a[11]+1839030562)<<16|n>>>16)+r<<0))+a[14]-35309556)<<23|t>>>9)+n<<0,t=((t+=((i=(r=((r+=((o=t^n)^(e=((e+=(o^r)+a[1]-1530992060)<<4|e>>>28)+t<<0))+a[4]+1272893353)<<11|r>>>21)+e<<0)^e)^(n=((n+=(i^t)+a[7]-155497632)<<16|n>>>16)+r<<0))+a[10]-1094730640)<<23|t>>>9)+n<<0,t=((t+=((i=(r=((r+=((o=t^n)^(e=((e+=(o^r)+a[13]+681279174)<<4|e>>>28)+t<<0))+a[0]-358537222)<<11|r>>>21)+e<<0)^e)^(n=((n+=(i^t)+a[3]-722521979)<<16|n>>>16)+r<<0))+a[6]+76029189)<<23|t>>>9)+n<<0,t=((t+=((i=(r=((r+=((o=t^n)^(e=((e+=(o^r)+a[9]-640364487)<<4|e>>>28)+t<<0))+a[12]-421815835)<<11|r>>>21)+e<<0)^e)^(n=((n+=(i^t)+a[15]+530742520)<<16|n>>>16)+r<<0))+a[2]-995338651)<<23|t>>>9)+n<<0,t=((t+=((r=((r+=(t^((e=((e+=(n^(t|~r))+a[0]-198630844)<<6|e>>>26)+t<<0)|~n))+a[7]+1126891415)<<10|r>>>22)+e<<0)^((n=((n+=(e^(r|~t))+a[14]-1416354905)<<15|n>>>17)+r<<0)|~e))+a[5]-57434055)<<21|t>>>11)+n<<0,t=((t+=((r=((r+=(t^((e=((e+=(n^(t|~r))+a[12]+1700485571)<<6|e>>>26)+t<<0)|~n))+a[3]-1894986606)<<10|r>>>22)+e<<0)^((n=((n+=(e^(r|~t))+a[10]-1051523)<<15|n>>>17)+r<<0)|~e))+a[1]-2054922799)<<21|t>>>11)+n<<0,t=((t+=((r=((r+=(t^((e=((e+=(n^(t|~r))+a[8]+1873313359)<<6|e>>>26)+t<<0)|~n))+a[15]-30611744)<<10|r>>>22)+e<<0)^((n=((n+=(e^(r|~t))+a[6]-1560198380)<<15|n>>>17)+r<<0)|~e))+a[13]+1309151649)<<21|t>>>11)+n<<0,t=((t+=((r=((r+=(t^((e=((e+=(n^(t|~r))+a[4]-145523070)<<6|e>>>26)+t<<0)|~n))+a[11]-1120210379)<<10|r>>>22)+e<<0)^((n=((n+=(e^(r|~t))+a[2]+718787259)<<15|n>>>17)+r<<0)|~e))+a[9]-343485551)<<21|t>>>11)+n<<0,this.first?(this.h0=e+1732584193<<0,this.h1=t-271733879<<0,this.h2=n-1732584194<<0,this.h3=r+271733878<<0,this.first=!1):(this.h0=this.h0+e<<0,this.h1=this.h1+t<<0,this.h2=this.h2+n<<0,this.h3=this.h3+r<<0)},Md5.prototype.hex=function(){this.finalize();var e=this.h0,t=this.h1,n=this.h2,r=this.h3;return HEX_CHARS[e>>4&15]+HEX_CHARS[15&e]+HEX_CHARS[e>>12&15]+HEX_CHARS[e>>8&15]+HEX_CHARS[e>>20&15]+HEX_CHARS[e>>16&15]+HEX_CHARS[e>>28&15]+HEX_CHARS[e>>24&15]+HEX_CHARS[t>>4&15]+HEX_CHARS[15&t]+HEX_CHARS[t>>12&15]+HEX_CHARS[t>>8&15]+HEX_CHARS[t>>20&15]+HEX_CHARS[t>>16&15]+HEX_CHARS[t>>28&15]+HEX_CHARS[t>>24&15]+HEX_CHARS[n>>4&15]+HEX_CHARS[15&n]+HEX_CHARS[n>>12&15]+HEX_CHARS[n>>8&15]+HEX_CHARS[n>>20&15]+HEX_CHARS[n>>16&15]+HEX_CHARS[n>>28&15]+HEX_CHARS[n>>24&15]+HEX_CHARS[r>>4&15]+HEX_CHARS[15&r]+HEX_CHARS[r>>12&15]+HEX_CHARS[r>>8&15]+HEX_CHARS[r>>20&15]+HEX_CHARS[r>>16&15]+HEX_CHARS[r>>28&15]+HEX_CHARS[r>>24&15]},Md5.prototype.toString=Md5.prototype.hex,Md5.prototype.digest=function(e){if("hex"===e)return this.hex();this.finalize();var t=this.h0,n=this.h1,r=this.h2,o=this.h3;return[255&t,t>>8&255,t>>16&255,t>>24&255,255&n,n>>8&255,n>>16&255,n>>24&255,255&r,r>>8&255,r>>16&255,r>>24&255,255&o,o>>8&255,o>>16&255,o>>24&255]},Md5.prototype.array=Md5.prototype.digest,Md5.prototype.arrayBuffer=function(){this.finalize();var e=new ArrayBuffer(16),t=new Uint32Array(e);return t[0]=this.h0,t[1]=this.h1,t[2]=this.h2,t[3]=this.h3,e},Md5.prototype.buffer=Md5.prototype.arrayBuffer,Md5.prototype.base64=function(){for(var e,t,n,r="",o=this.array(),i=0;i<15;)e=o[i++],t=o[i++],n=o[i++],r+=BASE64_ENCODE_CHAR[e>>>2]+BASE64_ENCODE_CHAR[63&(e<<4|t>>>4)]+BASE64_ENCODE_CHAR[63&(t<<2|n>>>6)]+BASE64_ENCODE_CHAR[63&n];return e=o[i],r+=BASE64_ENCODE_CHAR[e>>>2]+BASE64_ENCODE_CHAR[e<<4&63]+"=="};var exports=createMethod();COMMON_JS?module.exports=exports:(root.md5=exports,AMD&&(__WEBPACK_AMD_DEFINE_RESULT__=function(){return exports}.call(exports,__webpack_require__,exports,module),void 0===__WEBPACK_AMD_DEFINE_RESULT__||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)))})()}).call(this,__webpack_require__(3),__webpack_require__(4),__webpack_require__(5)(module))},function(e,t){(function(t){e.exports=t}).call(this,{})},function(e,t,n){(function(e){var t,r,o,i,a,s,c,u=n(0),l=l||function(e,t){var n={},r=n.lib={},o=function(){},i=r.Base={extend:function(e){o.prototype=this;var t=new o;return e&&t.mixIn(e),t.hasOwnProperty("init")||(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}},a=r.WordArray=i.extend({init:function(e,t){e=this.words=e||[],this.sigBytes=null!=t?t:4*e.length},toString:function(e){return(e||c).stringify(this)},concat:function(e){var t=this.words,n=e.words,r=this.sigBytes;if(e=e.sigBytes,this.clamp(),r%4)for(var o=0;o>>2]|=(n[o>>>2]>>>24-o%4*8&255)<<24-(r+o)%4*8;else if(65535>>2]=n[o>>>2];else t.push.apply(t,n);return this.sigBytes+=e,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-n%4*8,t.length=e.ceil(n/4)},clone:function(){var e=i.clone.call(this);return e.words=this.words.slice(0),e},random:function(t){for(var n=[],r=0;r>>2]>>>24-r%4*8&255;n.push((o>>>4).toString(16)),n.push((15&o).toString(16))}return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r>>3]|=parseInt(e.substr(r,2),16)<<24-r%8*4;return new a.init(n,t/2)}},u=s.Latin1={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;r>>2]>>>24-r%4*8&255));return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r>>2]|=(255&e.charCodeAt(r))<<24-r%4*8;return new a.init(n,t)}},l=s.Utf8={stringify:function(e){try{return decodeURIComponent(escape(u.stringify(e)))}catch(e){throw Error("Malformed UTF-8 data")}},parse:function(e){return u.parse(unescape(encodeURIComponent(e)))}},d=r.BufferedBlockAlgorithm=i.extend({reset:function(){this._data=new a.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=l.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var n=this._data,r=n.words,o=n.sigBytes,i=this.blockSize,s=o/(4*i);if(t=(s=t?e.ceil(s):e.max((0|s)-this._minBufferSize,0))*i,o=e.min(4*t,o),t){for(var c=0;cu;u++){if(16>u)i[u]=0|e[t+u];else{var l=i[u-3]^i[u-8]^i[u-14]^i[u-16];i[u]=l<<1|l>>>31}l=(r<<5|r>>>27)+c+i[u],l=20>u?l+(1518500249+(o&a|~o&s)):40>u?l+(1859775393+(o^a^s)):60>u?l+((o&a|o&s|a&s)-1894007588):l+((o^a^s)-899497514),c=s,s=a,a=o<<30|o>>>2,o=r,r=l}n[0]=n[0]+r|0,n[1]=n[1]+o|0,n[2]=n[2]+a|0,n[3]=n[3]+s|0,n[4]=n[4]+c|0},_doFinalize:function(){var e=this._data,t=e.words,n=8*this._nDataBytes,r=8*e.sigBytes;return t[r>>>5]|=128<<24-r%32,t[14+(r+64>>>9<<4)]=Math.floor(n/4294967296),t[15+(r+64>>>9<<4)]=n,e.sigBytes=4*t.length,this._process(),this._hash},clone:function(){var e=o.clone.call(this);return e._hash=this._hash.clone(),e}}),t.SHA1=o._createHelper(a),t.HmacSHA1=o._createHmacHelper(a),function(){var e=l,t=e.enc.Utf8;e.algo.HMAC=e.lib.Base.extend({init:function(e,n){e=this._hasher=new e.init,"string"==typeof n&&(n=t.parse(n));var r=e.blockSize,o=4*r;n.sigBytes>o&&(n=e.finalize(n)),n.clamp();for(var i=this._oKey=n.clone(),a=this._iKey=n.clone(),s=i.words,c=a.words,u=0;u>>2]>>>24-i%4*8&255)<<16|(t[i+1>>>2]>>>24-(i+1)%4*8&255)<<8|t[i+2>>>2]>>>24-(i+2)%4*8&255,s=0;s<4&&i+.75*s>>6*(3-s)&63));var c=r.charAt(64);if(c)for(;o.length%4;)o.push(c);return o.join("")},parse:function(e){var t=e.length,n=this._map,r=n.charAt(64);if(r){var o=e.indexOf(r);-1!=o&&(t=o)}for(var i=[],a=0,s=0;s>>6-s%4*2;i[a>>>2]|=(u|l)<<24-a%4*8,a++}return c.create(i,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},"object"===u(e)?e.exports=l:window.CryptoJS=l}).call(this,n(5)(e))},function(e,t,n){var r=n(17).DOMParser,o=function(){this.version="1.3.5";var e={mergeCDATA:!0,normalize:!0,stripElemPrefix:!0},t=new RegExp(/(?!xmlns)^.*:/);new RegExp(/^\s+|\s+$/g);return this.grokType=function(e){return/^\s*$/.test(e)?null:/^(?:true|false)$/i.test(e)?"true"===e.toLowerCase():isFinite(e)?parseFloat(e):e},this.parseString=function(e,t){if(e){var n=this.stringToXML(e);return n.getElementsByTagName("parsererror").length?null:this.parseXML(n,t)}return null},this.parseXML=function(n,r){for(var i in r)e[i]=r[i];var a={},s=0,c="";if(n.childNodes.length)for(var u,l,d,p=0;p=t+n||t?new java.lang.String(e,t,n)+"":e}function g(e,t){e.currentElement?e.currentElement.appendChild(t):e.doc.appendChild(t)}p.prototype.parseFromString=function(e,t){var n=this.options,r=new l,o=n.domBuilder||new f,a=n.errorHandler,s=n.locator,u=n.xmlns||{},p=/\/x?html?$/.test(t),h=p?i.HTML_ENTITIES:i.XML_ENTITIES;s&&o.setDocumentLocator(s),r.errorHandler=function(e,t,n){if(!e){if(t instanceof f)return t;e=t}var r={},o=e instanceof Function;function i(t){var i=e[t];!i&&o&&(i=2==e.length?function(n){e(t,n)}:e),r[t]=i&&function(e){i("[xmldom "+t+"]\t"+e+function(e){if(e)return"\n@"+(e.systemId||"")+"#[line:"+e.lineNumber+",col:"+e.columnNumber+"]"}(n))}||function(){}}return n=n||{},i("warning"),i("error"),i("fatalError"),r}(a,o,s),r.domBuilder=n.domBuilder||o,p&&(u[""]=c.HTML),u.xml=u.xml||c.XML;var m=n.normalizeLineEndings||d;return e&&"string"==typeof e?r.parse(m(e),u,h):r.errorHandler.error("invalid doc source"),o.doc},f.prototype={startDocument:function(){this.doc=(new s).createDocument(null,null,null),this.locator&&(this.doc.documentURI=this.locator.systemId)},startElement:function(e,t,n,r){var o=this.doc,i=o.createElementNS(e,n||t),a=r.length;g(this,i),this.currentElement=i,this.locator&&h(this.locator,i);for(var s=0;s",lt:"<",quot:'"'}),t.HTML_ENTITIES=r({lt:"<",gt:">",amp:"&",quot:'"',apos:"'",Agrave:"À",Aacute:"Á",Acirc:"Â",Atilde:"Ã",Auml:"Ä",Aring:"Å",AElig:"Æ",Ccedil:"Ç",Egrave:"È",Eacute:"É",Ecirc:"Ê",Euml:"Ë",Igrave:"Ì",Iacute:"Í",Icirc:"Î",Iuml:"Ï",ETH:"Ð",Ntilde:"Ñ",Ograve:"Ò",Oacute:"Ó",Ocirc:"Ô",Otilde:"Õ",Ouml:"Ö",Oslash:"Ø",Ugrave:"Ù",Uacute:"Ú",Ucirc:"Û",Uuml:"Ü",Yacute:"Ý",THORN:"Þ",szlig:"ß",agrave:"à",aacute:"á",acirc:"â",atilde:"ã",auml:"ä",aring:"å",aelig:"æ",ccedil:"ç",egrave:"è",eacute:"é",ecirc:"ê",euml:"ë",igrave:"ì",iacute:"í",icirc:"î",iuml:"ï",eth:"ð",ntilde:"ñ",ograve:"ò",oacute:"ó",ocirc:"ô",otilde:"õ",ouml:"ö",oslash:"ø",ugrave:"ù",uacute:"ú",ucirc:"û",uuml:"ü",yacute:"ý",thorn:"þ",yuml:"ÿ",nbsp:" ",iexcl:"¡",cent:"¢",pound:"£",curren:"¤",yen:"¥",brvbar:"¦",sect:"§",uml:"¨",copy:"©",ordf:"ª",laquo:"«",not:"¬",shy:"­­",reg:"®",macr:"¯",deg:"°",plusmn:"±",sup2:"²",sup3:"³",acute:"´",micro:"µ",para:"¶",middot:"·",cedil:"¸",sup1:"¹",ordm:"º",raquo:"»",frac14:"¼",frac12:"½",frac34:"¾",iquest:"¿",times:"×",divide:"÷",forall:"∀",part:"∂",exist:"∃",empty:"∅",nabla:"∇",isin:"∈",notin:"∉",ni:"∋",prod:"∏",sum:"∑",minus:"−",lowast:"∗",radic:"√",prop:"∝",infin:"∞",ang:"∠",and:"∧",or:"∨",cap:"∩",cup:"∪",int:"∫",there4:"∴",sim:"∼",cong:"≅",asymp:"≈",ne:"≠",equiv:"≡",le:"≤",ge:"≥",sub:"⊂",sup:"⊃",nsub:"⊄",sube:"⊆",supe:"⊇",oplus:"⊕",otimes:"⊗",perp:"⊥",sdot:"⋅",Alpha:"Α",Beta:"Β",Gamma:"Γ",Delta:"Δ",Epsilon:"Ε",Zeta:"Ζ",Eta:"Η",Theta:"Θ",Iota:"Ι",Kappa:"Κ",Lambda:"Λ",Mu:"Μ",Nu:"Ν",Xi:"Ξ",Omicron:"Ο",Pi:"Π",Rho:"Ρ",Sigma:"Σ",Tau:"Τ",Upsilon:"Υ",Phi:"Φ",Chi:"Χ",Psi:"Ψ",Omega:"Ω",alpha:"α",beta:"β",gamma:"γ",delta:"δ",epsilon:"ε",zeta:"ζ",eta:"η",theta:"θ",iota:"ι",kappa:"κ",lambda:"λ",mu:"μ",nu:"ν",xi:"ξ",omicron:"ο",pi:"π",rho:"ρ",sigmaf:"ς",sigma:"σ",tau:"τ",upsilon:"υ",phi:"φ",chi:"χ",psi:"ψ",omega:"ω",thetasym:"ϑ",upsih:"ϒ",piv:"ϖ",OElig:"Œ",oelig:"œ",Scaron:"Š",scaron:"š",Yuml:"Ÿ",fnof:"ƒ",circ:"ˆ",tilde:"˜",ensp:" ",emsp:" ",thinsp:" ",zwnj:"‌",zwj:"‍",lrm:"‎",rlm:"‏",ndash:"–",mdash:"—",lsquo:"‘",rsquo:"’",sbquo:"‚",ldquo:"“",rdquo:"”",bdquo:"„",dagger:"†",Dagger:"‡",bull:"•",hellip:"…",permil:"‰",prime:"′",Prime:"″",lsaquo:"‹",rsaquo:"›",oline:"‾",euro:"€",trade:"™",larr:"←",uarr:"↑",rarr:"→",darr:"↓",harr:"↔",crarr:"↵",lceil:"⌈",rceil:"⌉",lfloor:"⌊",rfloor:"⌋",loz:"◊",spades:"♠",clubs:"♣",hearts:"♥",diams:"♦"}),t.entityMap=t.HTML_ENTITIES},function(e,t,n){var r=n(2).NAMESPACE,o=/[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,i=new RegExp("[\\-\\.0-9"+o.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]"),a=new RegExp("^"+o.source+i.source+"*(?::"+o.source+i.source+"*)?$");function s(e,t){this.message=e,this.locator=t,Error.captureStackTrace&&Error.captureStackTrace(this,s)}function c(){}function u(e,t){return t.lineNumber=e.lineNumber,t.columnNumber=e.columnNumber,t}function l(e,t,n,o,i,a){function s(e,t,r){n.attributeNames.hasOwnProperty(e)&&a.fatalError("Attribute "+e+" redefined"),n.addValue(e,t.replace(/[\t\n\r]/g," ").replace(/&#?\w+;/g,i),r)}for(var c,u=++t,l=0;;){var d=e.charAt(u);switch(d){case"=":if(1===l)c=e.slice(t,u),l=3;else{if(2!==l)throw new Error("attribute equal must after attrName");l=3}break;case"'":case'"':if(3===l||1===l){if(1===l&&(a.warning('attribute value must after "="'),c=e.slice(t,u)),t=u+1,!((u=e.indexOf(d,t))>0))throw new Error("attribute value no end '"+d+"' match");s(c,p=e.slice(t,u),t-1),l=5}else{if(4!=l)throw new Error('attribute value must after "="');s(c,p=e.slice(t,u),t),a.warning('attribute "'+c+'" missed start quot('+d+")!!"),t=u+1,l=5}break;case"/":switch(l){case 0:n.setTagName(e.slice(t,u));case 5:case 6:case 7:l=7,n.closed=!0;case 4:case 1:case 2:break;default:throw new Error("attribute invalid close char('/')")}break;case"":return a.error("unexpected end of input"),0==l&&n.setTagName(e.slice(t,u)),u;case">":switch(l){case 0:n.setTagName(e.slice(t,u));case 5:case 6:case 7:break;case 4:case 1:"/"===(p=e.slice(t,u)).slice(-1)&&(n.closed=!0,p=p.slice(0,-1));case 2:2===l&&(p=c),4==l?(a.warning('attribute "'+p+'" missed quot(")!'),s(c,p,t)):(r.isHTML(o[""])&&p.match(/^(?:disabled|checked|selected)$/i)||a.warning('attribute "'+p+'" missed value!! "'+p+'" instead!!'),s(p,p,t));break;case 3:throw new Error("attribute value missed!!")}return u;case"€":d=" ";default:if(d<=" ")switch(l){case 0:n.setTagName(e.slice(t,u)),l=6;break;case 1:c=e.slice(t,u),l=2;break;case 4:var p=e.slice(t,u);a.warning('attribute "'+p+'" missed quot(")!!'),s(c,p,t);case 5:l=6}else switch(l){case 2:n.tagName;r.isHTML(o[""])&&c.match(/^(?:disabled|checked|selected)$/i)||a.warning('attribute "'+c+'" missed value!! "'+c+'" instead2!!'),s(c,c,t),t=u,l=1;break;case 5:a.warning('attribute space is required"'+c+'"!!');case 6:l=1,t=u;break;case 3:l=4,t=u;break;case 7:throw new Error("elements closed character '/' and '>' must be connected to")}}u++}}function d(e,t,n){for(var o=e.tagName,i=null,a=e.length;a--;){var s=e[a],c=s.qName,u=s.value;if((f=c.indexOf(":"))>0)var l=s.prefix=c.slice(0,f),d=c.slice(f+1),p="xmlns"===l&&d;else d=c,l=null,p="xmlns"===c&&"";s.localName=d,!1!==p&&(null==i&&(i={},h(n,n={})),n[p]=i[p]=u,s.uri=r.XMLNS,t.startPrefixMapping(p,u))}for(a=e.length;a--;){(l=(s=e[a]).prefix)&&("xml"===l&&(s.uri=r.XML),"xmlns"!==l&&(s.uri=n[l||""]))}var f;(f=o.indexOf(":"))>0?(l=e.prefix=o.slice(0,f),d=e.localName=o.slice(f+1)):(l=null,d=e.localName=o);var m=e.uri=n[l||""];if(t.startElement(m,d,o,e),!e.closed)return e.currentNSMap=n,e.localNSMap=i,!0;if(t.endElement(m,d,o),i)for(l in i)t.endPrefixMapping(l)}function p(e,t,n,r,o){if(/^(?:script|textarea)$/i.test(n)){var i=e.indexOf("",t),a=e.substring(t+1,i);if(/[&<]/.test(a))return/^script$/i.test(n)?(o.characters(a,0,a.length),i):(a=a.replace(/&#?\w+;/g,r),o.characters(a,0,a.length),i)}return t+1}function f(e,t,n,r){var o=r[n];return null==o&&((o=e.lastIndexOf(""))t?(n.comment(e,t+4,o-t-4),o+3):(r.error("Unclosed comment"),-1):-1;if("CDATA["==e.substr(t+3,6)){var o=e.indexOf("]]>",t+9);return n.startCDATA(),n.characters(e,t+9,o-t-9),n.endCDATA(),o+3}var i=function(e,t){var n,r=[],o=/'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;o.lastIndex=t,o.exec(e);for(;n=o.exec(e);)if(r.push(n),n[1])return r}(e,t),a=i.length;if(a>1&&/!doctype/i.test(i[0][0])){var s=i[1][0],c=!1,u=!1;a>3&&(/^public$/i.test(i[2][0])?(c=i[3][0],u=a>4&&i[4][0]):/^system$/i.test(i[2][0])&&(u=i[3][0]));var l=i[a-1];return n.startDTD(s,c,u),n.endDTD(),l.index+l[0].length}return-1}function g(e,t,n){var r=e.indexOf("?>",t);if(r){var o=e.substring(t,r).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);if(o){o[0].length;return n.processingInstruction(o[1],o[2]),r+2}return-1}return-1}function y(){this.attributeNames={}}s.prototype=new Error,s.prototype.name=s.name,c.prototype={parse:function(e,t,n){var o=this.domBuilder;o.startDocument(),h(t,t={}),function(e,t,n,o,i){function a(e){if(e>65535){var t=55296+((e-=65536)>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}function c(e){var t=e.slice(1,-1);return Object.hasOwnProperty.call(n,t)?n[t]:"#"===t.charAt(0)?a(parseInt(t.substr(1).replace("x","0x"))):(i.error("entity not found:"+e),e)}function h(t){if(t>R){var n=e.substring(R,t).replace(/&#?\w+;/g,c);b&&v(R),o.characters(n,0,t-R),R=t}}function v(t,n){for(;t>=k&&(n=S.exec(e));)C=n.index,k=C+n[0].length,b.lineNumber++;b.columnNumber=t-C+1}var C=0,k=0,S=/.*(?:\r\n?|\n)|.*$/g,b=o.locator,w=[{currentNSMap:t}],T={},R=0;for(;;){try{var E=e.indexOf("<",R);if(E<0){if(!e.substr(R).match(/^\s*$/)){var x=o.doc,A=x.createTextNode(e.substr(R));x.appendChild(A),o.currentElement=A}return}switch(E>R&&h(E),e.charAt(E+1)){case"/":var B=e.indexOf(">",E+3),I=e.substring(E+2,B).replace(/[ \t\n\r]+$/g,""),_=w.pop();B<0?(I=e.substring(E+2).replace(/[\s<].*/,""),i.error("end tag name: "+I+" is not complete:"+_.tagName),B=E+1+I.length):I.match(/\sR?R=B:h(Math.max(E,R)+1)}}(e,t,n,o,this.errorHandler),o.endDocument()}},y.prototype={setTagName:function(e){if(!a.test(e))throw new Error("invalid tagName:"+e);this.tagName=e},addValue:function(e,t,n){if(!a.test(e))throw new Error("invalid attribute:"+e);this.attributeNames[e]=this.length,this[this.length++]={qName:e,value:t,offset:n}},length:0,getLocalName:function(e){return this[e].localName},getLocator:function(e){return this[e].locator},getQName:function(e){return this[e].qName},getURI:function(e){return this[e].uri},getValue:function(e){return this[e].value}},t.XMLReader=c,t.ParseError=s},function(e,t,n){var r=n(0),o="a-zA-Z_À-ÖØ-öø-ÿͰ-ͽͿ-῿‌-‍⁰-↏Ⰰ-⿿、-퟿豈-﷏ﷰ-�",i=new RegExp("^([^"+o+"])|^((x|X)(m|M)(l|L))|([^"+o+"-.0-9·̀-ͯ‿⁀])","g"),a=/[^\x09\x0A\x0D\x20-\xFF\x85\xA0-\uD7FF\uE000-\uFDCF\uFDE0-\uFFFD]/gm,s=function(e){var t=[];if(e instanceof Object)for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t},c=function(e,t){var n=function(e,n,r,o,a){var s=void 0!==t.indent?t.indent:"\t",c=t.prettyPrint?"\n"+new Array(o).join(s):"";t.removeIllegalNameCharacters&&(e=e.replace(i,"_"));var u=[c,"<",e,r||""];return n&&n.length>0?(u.push(">"),u.push(n),a&&u.push(c),u.push("")):u.push("/>"),u.join("")};return function e(o,i,c){var u=r(o);switch((Array.isArray?Array.isArray(o):o instanceof Array)?u="array":o instanceof Date&&(u="date"),u){case"array":var l=[];return o.map((function(t){l.push(e(t,1,c+1))})),t.prettyPrint&&l.push("\n"),l.join("");case"date":return o.toJSON?o.toJSON():o+"";case"object":var d=[];for(var p in o)if(o.hasOwnProperty(p))if(o[p]instanceof Array)for(var f=0;f0&&d.push("\n"),d.join("");case"function":return o();default:return t.escape?(""+o).replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(a,""):""+o}}(e,0,0)},u=function(e){var t=['"),t.join("")};e.exports=function(e,t){if(t||(t={xmlHeader:{standalone:!0},prettyPrint:!0,indent:" ",escape:!0}),"string"==typeof e)try{e=JSON.parse(e.toString())}catch(e){return!1}var n="",o="";return t&&("object"==r(t)?(t.xmlHeader&&(n=u(!!t.xmlHeader.standalone)),void 0!==t.docType&&(o="")):n=u()),[n,(t=t||{}).prettyPrint&&o?"\n":"",o,c(e,t)].join("").replace(/\n{2,}/g,"\n").replace(/\s+$/g,"")}},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t){function n(e,t){for(var n=0;n0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]60*this.strategy.requestInterval*1e3},e.prototype.getUploadUrl=function(){return this.strategy.httpsUploadUrl+"?appkey="+this.appkey},e.prototype.isBlackEvent=function(e){return-1!=this.strategy.blacklist.indexOf(e)},e.prototype.isEventUpOnOff=function(){return this.strategy.isEventUpOnOff},e.prototype.isSampleEvent=function(e){return!!Object.prototype.hasOwnProperty.call(this.realSample,e)&&this.realSample[e]this.duration)return this.createSession();t=r.sessionId,n=r.sessionStart}catch(e){}return{sessionId:t,sessionStart:n}},e.prototype.createSession=function(){var e=Date.now(),t={sessionId:this.appkey+"_"+e.toString(),sessionStart:e};this.storage.setItem(k,JSON.stringify(t)),this.storage.setItem(c,e.toString());var n="is_new_user",r=this.storage.getItem(n);return this.beacon.onDirectUserAction("rqd_applaunched",{A21:r?"N":"Y"}),this.storage.setItem(n,JSON.stringify(!1)),t},e}();function b(){var e=navigator.userAgent,t=e.indexOf("compatible")>-1&&e.indexOf("MSIE")>-1,n=e.indexOf("Edge")>-1&&!t,r=e.indexOf("Trident")>-1&&e.indexOf("rv:11.0")>-1;if(t){new RegExp("MSIE (\\d+\\.\\d+);").test(e);var o=parseFloat(RegExp.$1);return 7==o?7:8==o?8:9==o?9:10==o?10:6}return n?-2:r?11:-1}var w,T,R=function(){return(R=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0||!window.indexedDB||/X5Lite/.test(navigator.userAgent)?(this.store=new I(t),this.dbEventCount=this.store.getCount()):(this.store=new B(e),this.getCount().then((function(e){n.dbEventCount=e})))}return e.prototype.getCount=function(){return n(this,void 0,void 0,(function(){return o(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,this.store.getCount()];case 1:return[2,e.sent()];case 2:return e.sent(),[2,Promise.reject()];case 3:return[2]}}))}))},e.prototype.insertEvent=function(e,t){return n(this,void 0,void 0,(function(){var n,r;return o(this,(function(o){switch(o.label){case 0:if(this.dbEventCount>=1e4)return[2,Promise.reject()];n=m(e.mapValue),o.label=1;case 1:return o.trys.push([1,3,,4]),this.dbEventCount++,[4,this.store.setItem(n,e)];case 2:return[2,o.sent()];case 3:return r=o.sent(),t&&t(r,e),this.dbEventCount--,[2,Promise.reject()];case 4:return[2]}}))}))},e.prototype.getEvents=function(){return n(this,void 0,void 0,(function(){var e;return o(this,(function(t){switch(t.label){case 0:e=[],t.label=1;case 1:return t.trys.push([1,3,,4]),[4,this.store.iterate((function(t){e.push(t)}))];case 2:case 3:return t.sent(),[2,Promise.all(e)];case 4:return[2]}}))}))},e.prototype.removeEvent=function(e){return n(this,void 0,void 0,(function(){var t;return o(this,(function(n){switch(n.label){case 0:t=m(e.mapValue),n.label=1;case 1:return n.trys.push([1,3,,4]),this.dbEventCount--,[4,this.store.removeItem(t)];case 2:return[2,n.sent()];case 3:return n.sent(),this.dbEventCount++,[2,Promise.reject()];case 4:return[2]}}))}))},e}(),O=function(){return(O=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]+t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]+t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]+t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]+t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]},r=function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]*t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]*t[3],n[1]+=n[2]>>>16,n[2]&=65535,n[2]+=e[3]*t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]*t[3],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[2]*t[2],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[3]*t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]},o=function(e,t){return 32==(t%=64)?[e[1],e[0]]:t<32?[e[0]<>>32-t,e[1]<>>32-t]:[e[1]<<(t-=32)|e[0]>>>32-t,e[0]<>>32-t]},i=function(e,t){return 0==(t%=64)?e:t<32?[e[0]<>>32-t,e[1]<>>1]),e=r(e,[4283543511,3981806797]),e=a(e,[0,e[0]>>>1]),e=r(e,[3301882366,444984403]),a(e,[0,e[0]>>>1])},c=(e=e||"").length%16,u=e.length-c,l=[0,t=t||0],d=[0,t],p=[0,0],f=[0,0],h=[2277735313,289559509],m=[1291169091,658871167],g=0;g>>0).toString(16)).slice(-8)+("00000000"+(l[1]>>>0).toString(16)).slice(-8)+("00000000"+(d[0]>>>0).toString(16)).slice(-8)+("00000000"+(d[1]>>>0).toString(16)).slice(-8)}}])&&t(o.prototype,i),n}()}()}(W={exports:{}}),W.exports),Q="logid_start",$="4.5.6-web";return function(n){function r(e){var t=n.call(this,e)||this;t.qimei36="",t.uselessCycleTaskNum=0,t.underWeakNet=!1,t.send=function(e,n,r){t.storage.setItem(c,Date.now().toString()),t.network.post(t.uploadUrl||t.strategy.getUploadUrl(),e.data).then((function(r){var o;100==(null===(o=null==r?void 0:r.data)||void 0===o?void 0:o.result)?t.delayTime=1e3*r.data.delayTime:t.delayTime=0,n&&n(e.data),e.data.events.forEach((function(e){t.store.removeEvent(e).then((function(){t.removeSendingId(m(e.mapValue))}))})),t.doCustomCycleTask()})).catch((function(n){var o=e.data.events;t.errorReport.reportError(n.code?n.code.toString():"600",n.message),r&&r(e.data);var i=JSON.parse(t.storage.getItem(u));o.forEach((function(e){i&&-1!=i.indexOf(m(e))&&t.store.insertEvent(e,(function(e,n){e&&t.errorReport.reportError("604","insertEvent fail!")})),t.removeSendingId(m(e))})),t.monitorUploadFailed()}))};var r,o,i=b();return t.isUnderIE8=i>0&&i<8,t.isUnderIE8||(t.isUnderIE=i>0,e.needInitQimei&&t.initQimei(e.appkey),t.network=new V(e),t.storage=new X(e.appkey),t.initCommonInfo(e),t.store=new _(e.appkey,t.storage),t.errorReport=new v(t.config,t.commonInfo,"web",t.network),t.strategy=new C(t.config,t.commonInfo,t.storage,t.network),t.logidStartTime=t.storage.getItem(Q),t.logidStartTime||(t.logidStartTime=Date.now().toString(),t.storage.setItem(Q,t.logidStartTime)),r=t.logidStartTime,o=Date.now()-Number.parseFloat(r),Math.floor(o/864e5)>=365&&t.storage.clear(),t.initSession(e),t.onDirectUserAction("rqd_js_init",{}),setTimeout((function(){return t.lifeCycle.emit("init")}),0),t.initDelayTime=e.delay?e.delay:1e3,t.cycleTask(t.initDelayTime)),t}return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}(r,n),r.prototype.initQimei=function(e){var t=this;(new J).getQimei36(e,(function(e){t.qimei36=e.q36}))},r.prototype.initSession=function(e){var t=18e5;e.sessionDuration&&e.sessionDuration>3e4&&(t=e.sessionDuration),this.beaconSession=new S(this.storage,t,this)},r.prototype.initCommonInfo=function(e){var t=Number(this.storage.getItem(c));try{var n=JSON.parse(this.storage.getItem(u));(Date.now()-t>3e4||!n)&&this.storage.setItem(u,JSON.stringify([]))}catch(e){}e.uploadUrl&&(this.uploadUrl=e.uploadUrl+"?appkey="+e.appkey);var r=[window.screen.width,window.screen.height];window.devicePixelRatio&&r.push(window.devicePixelRatio),this.commonInfo={deviceId:this.storage.createDeviceId(),language:navigator&&navigator.language||"zh_CN",query:window.location.search,userAgent:navigator.userAgent,pixel:r.join("*"),channelID:e.channelID?String(e.channelID):"",openid:e.openid?String(e.openid):"",unid:e.unionid?String(e.unionid):"",sdkVersion:$},this.config.appVersion=e.versionCode?String(e.versionCode):"",this.config.strictMode=e.strictMode},r.prototype.cycleTask=function(e){var t=this;this.intervalID=window.setInterval((function(){t.store.getEvents().then((function(e){var n=[],r=JSON.parse(t.storage.getItem(u));r||(r=[]),e&&e.forEach((function(e){var t=m(e.mapValue);-1==r.indexOf(t)&&(n.push(e),r.push(t))})),0!=n.length&&(t.storage.setItem(u,JSON.stringify(r)),t._normalLogPipeline(t.assembleData(n)))})).catch((function(e){}))}),e)},r.prototype.onReport=function(e,t,n){var r=this;if(this.isUnderIE8)this.errorReport.reportError("601","UnderIE8");else{var o=this.generateData(e,t,n);if(n&&0==this.delayTime&&!this.underWeakNet)this._normalLogPipeline(this.assembleData(o));else{var i=o.shift();i&&this.store.insertEvent(i,(function(e){e&&r.errorReport.reportError("604","insertEvent fail!")})).catch((function(e){r._normalLogPipeline(r.assembleData(o))}))}}},r.prototype.onSendBeacon=function(e,t){if(this.isUnderIE)this.errorReport.reportError("605","UnderIE");else{var n=this.assembleData(this.generateData(e,t,!0));"function"==typeof navigator.sendBeacon&&navigator.sendBeacon(this.uploadUrl||this.strategy.getUploadUrl(),JSON.stringify(n))}},r.prototype.generateData=function(e,n,r){var o=[],i="4.5.6-web_"+(r?"direct_log_id":"normal_log_id"),a=Number(this.storage.getItem(i));return a=a||1,n=t(t({},n),{A99:r?"Y":"N",A100:a.toString(),A72:$,A88:this.logidStartTime}),a++,this.storage.setItem(i,a.toString()),o.push({eventCode:e,eventTime:Date.now().toString(),mapValue:f(n,this.config.strictMode)}),o},r.prototype.assembleData=function(e){var n=this.beaconSession.getSession();return{appVersion:this.config.appVersion?h(this.config.appVersion):"",sdkId:"js",sdkVersion:$,mainAppKey:this.config.appkey,platformId:3,common:f(t(t({},this.additionalParams),{A2:this.commonInfo.deviceId,A8:this.commonInfo.openid,A12:this.commonInfo.language,A17:this.commonInfo.pixel,A23:this.commonInfo.channelID,A50:this.commonInfo.unid,A76:n.sessionId,A101:this.commonInfo.userAgent,A102:window.location.href,A104:document.referrer,A119:this.commonInfo.query,A153:this.qimei36}),!1),events:e}},r.prototype.monitorUploadFailed=function(){this.uselessCycleTaskNum++,this.uselessCycleTaskNum>=5&&(window.clearInterval(this.intervalID),this.cycleTask(6e4),this.underWeakNet=!0)},r.prototype.doCustomCycleTask=function(){this.uselessCycleTaskNum>=5&&(window.clearInterval(this.intervalID),this.cycleTask(this.initDelayTime)),this.uselessCycleTaskNum=0,this.underWeakNet=!1},r}(y)},"object"==s(t)&&void 0!==e?e.exports=a():void 0===(i="function"==typeof(o=a)?o.call(t,n,t,e):o)||(e.exports=i)}).call(this,n(4))},function(e,t,n){var r=n(10),o=n(1),i={};e.exports.transferToTaskMethod=function(e,t){i[t]=e[t],e[t]=function(e,n){e.SkipTask?i[t].call(this,e,n):this._addTask(t,e,n)}},e.exports.init=function(e){var t,n,a=[],s={},c=0,u=0,l=function(e){var t={id:e.id,Bucket:e.Bucket,Region:e.Region,Key:e.Key,FilePath:e.FilePath,state:e.state,loaded:e.loaded,size:e.size,speed:e.speed,percent:e.percent,hashPercent:e.hashPercent,error:e.error};return e.FilePath&&(t.FilePath=e.FilePath),e._custom&&(t._custom=e._custom),t},d=(n=function(){t=0,e.emit("task-list-update",{list:o.map(a,l)}),e.emit("list-update",{list:o.map(a,l)})},function(){t||(t=setTimeout(n))}),p=function(){if(!(a.length<=e.options.UploadQueueSize)){for(var t=0;te.options.UploadQueueSize;){var n="waiting"===a[t].state||"checking"===a[t].state||"uploading"===a[t].state;a[t]&&n?t++:(s[a[t].id]&&delete s[a[t].id],a.splice(t,1),u--)}d()}},f=function t(){if(!(c>=e.options.FileParallelLimit)){for(;a[u]&&"waiting"!==a[u].state;)u++;if(!(u>=a.length)){var n=a[u];u++,c++,n.state="checking",n.params.onTaskStart&&n.params.onTaskStart(l(n)),!n.params.UploadData&&(n.params.UploadData={});var r=o.formatParams(n.api,n.params);i[n.api].call(e,r,(function(r,o){e._isRunningTask(n.id)&&("checking"!==n.state&&"uploading"!==n.state||(n.state=r?"error":"success",r&&(n.error=r),c--,d(),t(),n.callback&&n.callback(r,o),"success"===n.state&&(n.params&&(delete n.params.UploadData,delete n.params.Body,delete n.params),delete n.callback)),p())})),d(),setTimeout(t)}}},h=function(t,n){var o=s[t];if(o){var i=o&&"waiting"===o.state,a=o&&("checking"===o.state||"uploading"===o.state);if("canceled"===n&&"canceled"!==o.state||"paused"===n&&i||"paused"===n&&a){if("paused"===n&&o.params.Body&&"function"==typeof o.params.Body.pipe)return;o.state=n,e.emit("inner-kill-task",{TaskId:t,toState:n});try{var u=o&&o.params&&o.params.UploadData.UploadId}catch(e){}"canceled"===n&&u&&r.removeUsing(u),d(),a&&(c--,f()),"canceled"===n&&(o.params&&(delete o.params.UploadData,delete o.params.Body,delete o.params),delete o.callback)}p()}};e._addTasks=function(t){o.each(t,(function(t){e._addTask(t.api,t.params,t.callback,!0)})),d()};e._addTask=function(t,n,r,i){n=o.formatParams(t,n);var c=o.uuid();n.TaskId=c,n.onTaskReady&&n.onTaskReady(c),n.TaskReady&&(n.TaskReady(c),!1);var u={params:n,callback:r,api:t,index:a.length,id:c,Bucket:n.Bucket,Region:n.Region,Key:n.Key,FilePath:n.FilePath||"",state:"waiting",loaded:0,size:0,speed:0,percent:0,hashPercent:0,error:null,_custom:n._custom},l=n.onHashProgress;n.onHashProgress=function(t){e._isRunningTask(u.id)&&(u.hashPercent=t.percent,l&&l(t),d())};var h=n.onProgress;return n.onProgress=function(t){e._isRunningTask(u.id)&&("checking"===u.state&&(u.state="uploading"),u.loaded=t.loaded,u.speed=t.speed,u.percent=t.percent,h&&h(t),d())},o.getFileSize(t,n,(function(e,t){if(e)return r(o.error(e));s[c]=u,a.push(u),u.size=t,!i&&d(),f(),p()})),c},e._isRunningTask=function(e){var t=s[e];return!(!t||"checking"!==t.state&&"uploading"!==t.state)},e.getTaskList=function(){return o.map(a,l)},e.cancelTask=function(e){h(e,"canceled")},e.pauseTask=function(e){h(e,"paused")},e.restartTask=function(e){var t=s[e];!t||"paused"!==t.state&&"error"!==t.state||(t.state="waiting",d(),u=Math.min(u,t.index),f())},e.isUploadRunning=function(){return c||u-1?"{Region}.myqcloud.com":"cos.{Region}.myqcloud.com",e.ForcePathStyle||(a="{Bucket}."+a)),a=(a=a.replace(/\{\{AppId\}\}/gi,i).replace(/\{\{Bucket\}\}/gi,r).replace(/\{\{Region\}\}/gi,t).replace(/\{\{.*?\}\}/gi,"")).replace(/\{AppId\}/gi,i).replace(/\{BucketName\}/gi,r).replace(/\{Bucket\}/gi,n).replace(/\{Region\}/gi,t).replace(/\{.*?\}/gi,""),/^[a-zA-Z]+:\/\//.test(a)||(a=c+"//"+a),"/"===a.slice(-1)&&(a=a.slice(0,-1));var u=a;return e.ForcePathStyle&&(u+="/"+n),u+="/",s&&(u+=o.camSafeUrlEncode(s).replace(/%2F/g,"/")),e.isLocation&&(u=u.replace(/^https?:\/\//,"")),u}var c=function(e){if(!e.Bucket||!e.Region)return"";var t=void 0===e.UseAccelerate?this.options.UseAccelerate:e.UseAccelerate,n=(e.Url||s({ForcePathStyle:this.options.ForcePathStyle,protocol:this.options.Protocol,domain:this.options.Domain,bucket:e.Bucket,region:t?"accelerate":e.Region})).replace(/^https?:\/\/([^/]+)(\/.*)?$/,"$1");return new RegExp("^([a-z\\d-]+-\\d+\\.)?(cos|cosv6|ci|pic)\\.([a-z\\d-]+)\\.myqcloud\\.com$").test(n)?n:""};function u(e,t){var n=o.clone(e.Headers),r="";o.each(n,(function(e,t){(""===e||["content-type","cache-control","expires"].indexOf(t.toLowerCase())>-1)&&delete n[t],"host"===t.toLowerCase()&&(r=e)}));var i=!1!==e.ForceSignHost;!r&&e.SignHost&&i&&(n.Host=e.SignHost);var a=!1,s=function(e,n){a||(a=!0,n&&n.XCosSecurityToken&&!n.SecurityToken&&((n=o.clone(n)).SecurityToken=n.XCosSecurityToken,delete n.XCosSecurityToken),t&&t(e,n))},c=this,u=e.Bucket||"",l=e.Region||"",d=e.Key||"";c.options.ForcePathStyle&&u&&(d=u+"/"+d);var p="/"+d,f={},h=e.Scope;if(!h){var m=e.Action||"",g=e.ResourceKey||e.Key||"";h=e.Scope||[{action:m,bucket:u,region:l,prefix:g}]}var y=o.md5(JSON.stringify(h));c._StsCache=c._StsCache||[],function(){var e,t;for(e=c._StsCache.length-1;e>=0;e--){t=c._StsCache[e];var n=Math.round(o.getSkewTime(c.options.SystemClockOffset)/1e3)+30;if(t.StartTime&&n=t.ExpiredTime)c._StsCache.splice(e,1);else if(!t.ScopeLimit||t.ScopeLimit&&t.ScopeKey===y){f=t;break}}}();var v,C=function(){var t="";f.StartTime&&e.Expires?t=f.StartTime+";"+(f.StartTime+1*e.Expires):f.StartTime&&f.ExpiredTime&&(t=f.StartTime+";"+f.ExpiredTime);var r={Authorization:o.getAuth({SecretId:f.TmpSecretId,SecretKey:f.TmpSecretKey,Method:e.Method,Pathname:p,Query:e.Query,Headers:n,Expires:e.Expires,UseRawKey:c.options.UseRawKey,SystemClockOffset:c.options.SystemClockOffset,KeyTime:t,ForceSignHost:i}),SecurityToken:f.SecurityToken||f.XCosSecurityToken||"",Token:f.Token||"",ClientIP:f.ClientIP||"",ClientUA:f.ClientUA||""};s(null,r)},k=function(e){if(e.Authorization){var t=!1,n=e.Authorization;if(n)if(n.indexOf(" ")>-1)t=!1;else if(n.indexOf("q-sign-algorithm=")>-1&&n.indexOf("q-ak=")>-1&&n.indexOf("q-sign-time=")>-1&&n.indexOf("q-key-time=")>-1&&n.indexOf("q-url-param-list=")>-1)t=!0;else try{(n=atob(n)).indexOf("a=")>-1&&n.indexOf("k=")>-1&&n.indexOf("t=")>-1&&n.indexOf("r=")>-1&&n.indexOf("b=")>-1&&(t=!0)}catch(e){}if(!t)return o.error(new Error("getAuthorization callback params format error"))}else{if(!e.TmpSecretId)return o.error(new Error('getAuthorization callback params missing "TmpSecretId"'));if(!e.TmpSecretKey)return o.error(new Error('getAuthorization callback params missing "TmpSecretKey"'));if(!e.SecurityToken&&!e.XCosSecurityToken)return o.error(new Error('getAuthorization callback params missing "SecurityToken"'));if(!e.ExpiredTime)return o.error(new Error('getAuthorization callback params missing "ExpiredTime"'));if(e.ExpiredTime&&10!==e.ExpiredTime.toString().length)return o.error(new Error('getAuthorization callback params "ExpiredTime" should be 10 digits'));if(e.StartTime&&10!==e.StartTime.toString().length)return o.error(new Error('getAuthorization callback params "StartTime" should be 10 StartTime'))}return!1};if(f.ExpiredTime&&f.ExpiredTime-o.getSkewTime(c.options.SystemClockOffset)/1e3>60)C();else if(c.options.getAuthorization)c.options.getAuthorization.call(c,{Bucket:u,Region:l,Method:e.Method,Key:d,Pathname:p,Query:e.Query,Headers:n,Scope:h,SystemClockOffset:c.options.SystemClockOffset,ForceSignHost:i},(function(e){"string"==typeof e&&(e={Authorization:e});var t=k(e);if(t)return s(t);e.Authorization?s(null,e):((f=e||{}).Scope=h,f.ScopeKey=y,c._StsCache.push(f),C())}));else{if(!c.options.getSTS)return v={Authorization:o.getAuth({SecretId:e.SecretId||c.options.SecretId,SecretKey:e.SecretKey||c.options.SecretKey,Method:e.Method,Pathname:p,Query:e.Query,Headers:n,Expires:e.Expires,UseRawKey:c.options.UseRawKey,SystemClockOffset:c.options.SystemClockOffset,ForceSignHost:i}),SecurityToken:c.options.SecurityToken||c.options.XCosSecurityToken},s(null,v),v;c.options.getSTS.call(c,{Bucket:u,Region:l},(function(e){(f=e||{}).Scope=h,f.ScopeKey=y,f.TmpSecretId||(f.TmpSecretId=f.SecretId),f.TmpSecretKey||(f.TmpSecretKey=f.SecretKey);var t=k(f);if(t)return s(t);c._StsCache.push(f),C()}))}return""}function l(e){var t=!1,n=!1,r=e.headers&&(e.headers.date||e.headers.Date)||e.error&&e.error.ServerTime;try{var i=e.error.Code,a=e.error.Message;("RequestTimeTooSkewed"===i||"AccessDenied"===i&&"Request has expired"===a)&&(n=!0)}catch(e){}if(e)if(n&&r){var s=Date.parse(r);this.options.CorrectClockSkew&&Math.abs(o.getSkewTime(this.options.SystemClockOffset)-s)>=3e4&&(this.options.SystemClockOffset=s-Date.now(),t=!0)}else 5===Math.floor(e.statusCode/100)&&(t=!0);return t}function d(e,t){var n=this;!e.headers&&(e.headers={}),!e.qs&&(e.qs={}),e.VersionId&&(e.qs.versionId=e.VersionId),e.qs=o.clearKey(e.qs),e.headers&&(e.headers=o.clearKey(e.headers)),e.qs&&(e.qs=o.clearKey(e.qs));var r=o.clone(e.qs);e.action&&(r[e.action]="");var i=e.url||e.Url,a=e.SignHost||c.call(this,{Bucket:e.Bucket,Region:e.Region,Url:i}),s=e.tracker;!function o(i){var c=n.options.SystemClockOffset;s&&s.setParams({signStartTime:(new Date).getTime(),retryTimes:i-1}),u.call(n,{Bucket:e.Bucket||"",Region:e.Region||"",Method:e.method,Key:e.Key,Query:r,Headers:e.headers,SignHost:a,Action:e.Action,ResourceKey:e.ResourceKey,Scope:e.Scope,ForceSignHost:n.options.ForceSignHost},(function(r,a){r?t(r):(s&&s.setParams({signEndTime:(new Date).getTime(),httpStartTime:(new Date).getTime()}),e.AuthData=a,p.call(n,e,(function(r,a){s&&s.setParams({httpEndTime:(new Date).getTime()}),r&&i<2&&(c!==n.options.SystemClockOffset||l.call(n,r))?(e.headers&&(delete e.headers.Authorization,delete e.headers.token,delete e.headers.clientIP,delete e.headers.clientUA,e.headers["x-cos-security-token"]&&delete e.headers["x-cos-security-token"],e.headers["x-ci-security-token"]&&delete e.headers["x-ci-security-token"]),o(i+1)):t(r,a)})))}))}(1)}function p(e,t){var n=this,i=e.TaskId;if(!i||n._isRunningTask(i)){var a=e.Bucket,c=e.Region,u=e.Key,l=e.method||"GET",d=e.Url||e.url,p=e.body,f=e.rawBody;n.options.UseAccelerate&&(c="accelerate"),d=d||s({ForcePathStyle:n.options.ForcePathStyle,protocol:n.options.Protocol,domain:n.options.Domain,bucket:a,region:c,object:u}),e.action&&(d=d+"?"+e.action),e.qsStr&&(d=d.indexOf("?")>-1?d+"&"+e.qsStr:d+"?"+e.qsStr);var h={method:l,url:d,headers:e.headers,qs:e.qs,body:p},m="x-cos-security-token";if(o.isCIHost(d)&&(m="x-ci-security-token"),h.headers.Authorization=e.AuthData.Authorization,e.AuthData.Token&&(h.headers.token=e.AuthData.Token),e.AuthData.ClientIP&&(h.headers.clientIP=e.AuthData.ClientIP),e.AuthData.ClientUA&&(h.headers.clientUA=e.AuthData.ClientUA),e.AuthData.SecurityToken&&(h.headers[m]=e.AuthData.SecurityToken),h.headers&&(h.headers=o.clearKey(h.headers)),h=o.clearKey(h),e.onProgress&&"function"==typeof e.onProgress){var g=p&&(p.size||p.length)||0;h.onProgress=function(t){if(!i||n._isRunningTask(i)){var r=t?t.loaded:0;e.onProgress({loaded:r,total:g})}}}e.onDownloadProgress&&(h.onDownloadProgress=e.onDownloadProgress),e.DataType&&(h.dataType=e.DataType),this.options.Timeout&&(h.timeout=this.options.Timeout),n.options.ForcePathStyle&&(h.pathStyle=n.options.ForcePathStyle),n.emit("before-send",h);var y=h.url.includes("accelerate."),v=Object.keys(h.qs).map((function(e){return"".concat(e,"=").concat(h.qs[e])})).join("&"),C=v?h.url+"?"+v:h.url;e.tracker&&e.tracker.setParams({reqUrl:C,accelerate:y?"Y":"N"}),e.tracker&&e.tracker.parent&&e.tracker.parent.setParams({reqUrl:C,accelerate:y?"Y":"N"});var k=(n.options.Request||r)(h,(function(e){if("abort"!==e.error){var r={options:h,error:c,statusCode:s&&s.statusCode||0,headers:s&&s.headers||{},body:u};n.emit("after-receive",r),c=r.error,u=r.body,s={statusCode:r.statusCode,headers:r.headers},n.emit("after-receive",e);var a,s={statusCode:e.statusCode,statusMessage:e.statusMessage,headers:e.headers},c=e.error,u=e.body,l=function(e,r){if(i&&n.off("inner-kill-task",S),!a){a=!0;var c={};s&&s.statusCode&&(c.statusCode=s.statusCode),s&&s.headers&&(c.headers=s.headers),e?(e=o.extend(e||{},c),t(e,null)):(r=o.extend(r||{},c),t(null,r)),k=null}};if(c)return l(o.error(c));var d,p=s.statusCode,m=2===Math.floor(p/100);if(f&&m)return l(null,{body:u});try{d=u&&u.indexOf("<")>-1&&u.indexOf(">")>-1&&o.xml2json(u)||{}}catch(e){d={}}var g=d&&d.Error;m?l(null,d):g?l(o.error(new Error(g.Message),{code:g.Code,error:g})):p?l(o.error(new Error(s.statusMessage),{code:""+p})):p&&l(o.error(new Error("statusCode error")))}})),S=function e(t){t.TaskId===i&&(k&&k.abort&&k.abort(),n.off("inner-kill-task",e))};i&&n.on("inner-kill-task",S)}}var f={getService:function(e,t){"function"==typeof e&&(t=e,e={});var n=this.options.Protocol||(o.isBrowser&&"http:"===location.protocol?"http:":"https:"),r=this.options.ServiceDomain,i=e.AppId||this.options.appId,a=e.Region;r?(r=r.replace(/\{\{AppId\}\}/gi,i||"").replace(/\{\{Region\}\}/gi,a||"").replace(/\{\{.*?\}\}/gi,""),/^[a-zA-Z]+:\/\//.test(r)||(r=n+"//"+r),"/"===r.slice(-1)&&(r=r.slice(0,-1))):r=a?n+"//cos."+a+".myqcloud.com":n+"//service.cos.myqcloud.com";var s="",c=a?"cos."+a+".myqcloud.com":"service.cos.myqcloud.com";c===r.replace(/^https?:\/\/([^/]+)(\/.*)?$/,"$1")&&(s=c),d.call(this,{Action:"name/cos:GetService",url:r,method:"GET",headers:e.Headers,SignHost:s},(function(e,n){if(e)return t(e);var r=n&&n.ListAllMyBucketsResult&&n.ListAllMyBucketsResult.Buckets&&n.ListAllMyBucketsResult.Buckets.Bucket||[];r=o.isArray(r)?r:[r];var i=n&&n.ListAllMyBucketsResult&&n.ListAllMyBucketsResult.Owner||{};t(null,{Buckets:r,Owner:i,statusCode:n.statusCode,headers:n.headers})}))},putBucket:function(e,t){var n=this,r="";if(e.BucketAZConfig){var i={BucketAZConfig:e.BucketAZConfig};r=o.json2xml({CreateBucketConfiguration:i})}d.call(this,{Action:"name/cos:PutBucket",method:"PUT",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,body:r},(function(r,o){if(r)return t(r);var i=s({protocol:n.options.Protocol,domain:n.options.Domain,bucket:e.Bucket,region:e.Region,isLocation:!0});t(null,{Location:i,statusCode:o.statusCode,headers:o.headers})}))},headBucket:function(e,t){d.call(this,{Action:"name/cos:HeadBucket",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,method:"HEAD"},t)},getBucket:function(e,t){var n={};n.prefix=e.Prefix||"",n.delimiter=e.Delimiter,n.marker=e.Marker,n["max-keys"]=e.MaxKeys,n["encoding-type"]=e.EncodingType,d.call(this,{Action:"name/cos:GetBucket",ResourceKey:n.prefix,method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,qs:n},(function(e,n){if(e)return t(e);var r=n.ListBucketResult||{},i=r.Contents||[],a=r.CommonPrefixes||[];i=o.isArray(i)?i:[i],a=o.isArray(a)?a:[a];var s=o.clone(r);o.extend(s,{Contents:i,CommonPrefixes:a,statusCode:n.statusCode,headers:n.headers}),t(null,s)}))},deleteBucket:function(e,t){d.call(this,{Action:"name/cos:DeleteBucket",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,method:"DELETE"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketAcl:function(e,t){var n=e.Headers,r="";if(e.AccessControlPolicy){var i=o.clone(e.AccessControlPolicy||{}),s=i.Grants||i.Grant;s=o.isArray(s)?s:[s],delete i.Grant,delete i.Grants,i.AccessControlList={Grant:s},r=o.json2xml({AccessControlPolicy:i}),n["Content-Type"]="application/xml",n["Content-MD5"]=o.binaryBase64(o.md5(r))}o.each(n,(function(e,t){0===t.indexOf("x-cos-grant-")&&(n[t]=a(n[t]))})),d.call(this,{Action:"name/cos:PutBucketACL",method:"PUT",Bucket:e.Bucket,Region:e.Region,headers:n,action:"acl",body:r},(function(e,n){if(e)return t(e);t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketAcl:function(e,t){d.call(this,{Action:"name/cos:GetBucketACL",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"acl"},(function(e,n){if(e)return t(e);var r=n.AccessControlPolicy||{},a=r.Owner||{},s=r.AccessControlList.Grant||[];s=o.isArray(s)?s:[s];var c=i(r);n.headers&&n.headers["x-cos-acl"]&&(c.ACL=n.headers["x-cos-acl"]),c=o.extend(c,{Owner:a,Grants:s,statusCode:n.statusCode,headers:n.headers}),t(null,c)}))},putBucketCors:function(e,t){var n=(e.CORSConfiguration||{}).CORSRules||e.CORSRules||[];n=o.clone(o.isArray(n)?n:[n]),o.each(n,(function(e){o.each(["AllowedOrigin","AllowedHeader","AllowedMethod","ExposeHeader"],(function(t){var n=t+"s",r=e[n]||e[t]||[];delete e[n],e[t]=o.isArray(r)?r:[r]}))}));var r={CORSRule:n};e.ResponseVary&&(r.ResponseVary=e.ResponseVary);var i=o.json2xml({CORSConfiguration:r}),a=e.Headers;a["Content-Type"]="application/xml",a["Content-MD5"]=o.binaryBase64(o.md5(i)),d.call(this,{Action:"name/cos:PutBucketCORS",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:i,action:"cors",headers:a},(function(e,n){if(e)return t(e);t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketCors:function(e,t){d.call(this,{Action:"name/cos:GetBucketCORS",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"cors"},(function(e,n){if(e)if(404===e.statusCode&&e.error&&"NoSuchCORSConfiguration"===e.error.Code){var r={CORSRules:[],statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else t(e);else{var i=n.CORSConfiguration||{},a=i.CORSRules||i.CORSRule||[];a=o.clone(o.isArray(a)?a:[a]);var s=i.ResponseVary;o.each(a,(function(e){o.each(["AllowedOrigin","AllowedHeader","AllowedMethod","ExposeHeader"],(function(t){var n=t+"s",r=e[n]||e[t]||[];delete e[t],e[n]=o.isArray(r)?r:[r]}))})),t(null,{CORSRules:a,ResponseVary:s,statusCode:n.statusCode,headers:n.headers})}}))},deleteBucketCors:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketCORS",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"cors"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode||e.statusCode,headers:n.headers})}))},getBucketLocation:function(e,t){d.call(this,{Action:"name/cos:GetBucketLocation",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"location"},t)},getBucketPolicy:function(e,t){d.call(this,{Action:"name/cos:GetBucketPolicy",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"policy",rawBody:!0},(function(e,n){if(e)return e.statusCode&&403===e.statusCode?t(o.error(e,{ErrorStatus:"Access Denied"})):e.statusCode&&405===e.statusCode?t(o.error(e,{ErrorStatus:"Method Not Allowed"})):e.statusCode&&404===e.statusCode?t(o.error(e,{ErrorStatus:"Policy Not Found"})):t(e);var r={};try{r=JSON.parse(n.body)}catch(e){}t(null,{Policy:r,statusCode:n.statusCode,headers:n.headers})}))},putBucketPolicy:function(e,t){var n=e.Policy;try{"string"==typeof n&&(n=JSON.parse(n))}catch(e){}if(!n||"string"==typeof n)return t(o.error(new Error("Policy format error")));var r=JSON.stringify(n);n.version||(n.version="2.0");var i=e.Headers;i["Content-Type"]="application/json",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketPolicy",method:"PUT",Bucket:e.Bucket,Region:e.Region,action:"policy",body:r,headers:i},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},deleteBucketPolicy:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketPolicy",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"policy"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode||e.statusCode,headers:n.headers})}))},putBucketTagging:function(e,t){var n=e.Tagging||{},r=n.TagSet||n.Tags||e.Tags||[];r=o.clone(o.isArray(r)?r:[r]);var i=o.json2xml({Tagging:{TagSet:{Tag:r}}}),a=e.Headers;a["Content-Type"]="application/xml",a["Content-MD5"]=o.binaryBase64(o.md5(i)),d.call(this,{Action:"name/cos:PutBucketTagging",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:i,action:"tagging",headers:a},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketTagging:function(e,t){d.call(this,{Action:"name/cos:GetBucketTagging",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"tagging"},(function(e,n){if(e)if(404!==e.statusCode||!e.error||"Not Found"!==e.error&&"NoSuchTagSet"!==e.error.Code)t(e);else{var r={Tags:[],statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else{var i=[];try{i=n.Tagging.TagSet.Tag||[]}catch(e){}i=o.clone(o.isArray(i)?i:[i]),t(null,{Tags:i,statusCode:n.statusCode,headers:n.headers})}}))},deleteBucketTagging:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketTagging",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"tagging"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketLifecycle:function(e,t){var n=(e.LifecycleConfiguration||{}).Rules||e.Rules||[];n=o.clone(n);var r=o.json2xml({LifecycleConfiguration:{Rule:n}}),i=e.Headers;i["Content-Type"]="application/xml",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketLifecycle",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:r,action:"lifecycle",headers:i},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketLifecycle:function(e,t){d.call(this,{Action:"name/cos:GetBucketLifecycle",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"lifecycle"},(function(e,n){if(e)if(404===e.statusCode&&e.error&&"NoSuchLifecycleConfiguration"===e.error.Code){var r={Rules:[],statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else t(e);else{var i=[];try{i=n.LifecycleConfiguration.Rule||[]}catch(e){}i=o.clone(o.isArray(i)?i:[i]),t(null,{Rules:i,statusCode:n.statusCode,headers:n.headers})}}))},deleteBucketLifecycle:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketLifecycle",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"lifecycle"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketVersioning:function(e,t){if(e.VersioningConfiguration){var n=e.VersioningConfiguration||{},r=o.json2xml({VersioningConfiguration:n}),i=e.Headers;i["Content-Type"]="application/xml",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketVersioning",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:r,action:"versioning",headers:i},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))}else t(o.error(new Error("missing param VersioningConfiguration")))},getBucketVersioning:function(e,t){d.call(this,{Action:"name/cos:GetBucketVersioning",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"versioning"},(function(e,n){e||!n.VersioningConfiguration&&(n.VersioningConfiguration={}),t(e,n)}))},putBucketReplication:function(e,t){var n=o.clone(e.ReplicationConfiguration),r=o.json2xml({ReplicationConfiguration:n});r=(r=r.replace(/<(\/?)Rules>/gi,"<$1Rule>")).replace(/<(\/?)Tags>/gi,"<$1Tag>");var i=e.Headers;i["Content-Type"]="application/xml",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketReplication",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:r,action:"replication",headers:i},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketReplication:function(e,t){d.call(this,{Action:"name/cos:GetBucketReplication",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"replication"},(function(e,n){if(e)if(404!==e.statusCode||!e.error||"Not Found"!==e.error&&"ReplicationConfigurationnotFoundError"!==e.error.Code)t(e);else{var r={ReplicationConfiguration:{Rules:[]},statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else!n.ReplicationConfiguration&&(n.ReplicationConfiguration={}),n.ReplicationConfiguration.Rule&&(n.ReplicationConfiguration.Rules=o.makeArray(n.ReplicationConfiguration.Rule),delete n.ReplicationConfiguration.Rule),t(e,n)}))},deleteBucketReplication:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketReplication",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"replication"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketWebsite:function(e,t){if(e.WebsiteConfiguration){var n=o.clone(e.WebsiteConfiguration||{}),r=n.RoutingRules||n.RoutingRule||[];r=o.isArray(r)?r:[r],delete n.RoutingRule,delete n.RoutingRules,r.length&&(n.RoutingRules={RoutingRule:r});var i=o.json2xml({WebsiteConfiguration:n}),a=e.Headers;a["Content-Type"]="application/xml",a["Content-MD5"]=o.binaryBase64(o.md5(i)),d.call(this,{Action:"name/cos:PutBucketWebsite",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:i,action:"website",headers:a},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))}else t(o.error(new Error("missing param WebsiteConfiguration")))},getBucketWebsite:function(e,t){d.call(this,{Action:"name/cos:GetBucketWebsite",method:"GET",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,action:"website"},(function(e,n){if(e)if(404===e.statusCode&&"NoSuchWebsiteConfiguration"===e.error.Code){var r={WebsiteConfiguration:{},statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else t(e);else{var i=n.WebsiteConfiguration||{};if(i.RoutingRules){var a=o.clone(i.RoutingRules.RoutingRule||[]);a=o.makeArray(a),i.RoutingRules=a}t(null,{WebsiteConfiguration:i,statusCode:n.statusCode,headers:n.headers})}}))},deleteBucketWebsite:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketWebsite",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"website"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketReferer:function(e,t){if(e.RefererConfiguration){var n=o.clone(e.RefererConfiguration||{}),r=n.DomainList||{},i=r.Domains||r.Domain||[];(i=o.isArray(i)?i:[i]).length&&(n.DomainList={Domain:i});var a=o.json2xml({RefererConfiguration:n}),s=e.Headers;s["Content-Type"]="application/xml",s["Content-MD5"]=o.binaryBase64(o.md5(a)),d.call(this,{Action:"name/cos:PutBucketReferer",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:a,action:"referer",headers:s},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))}else t(o.error(new Error("missing param RefererConfiguration")))},getBucketReferer:function(e,t){d.call(this,{Action:"name/cos:GetBucketReferer",method:"GET",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,action:"referer"},(function(e,n){if(e)if(404===e.statusCode&&"NoSuchRefererConfiguration"===e.error.Code){var r={WebsiteConfiguration:{},statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else t(e);else{var i=n.RefererConfiguration||{};if(i.DomainList){var a=o.makeArray(i.DomainList.Domain||[]);i.DomainList={Domains:a}}t(null,{RefererConfiguration:i,statusCode:n.statusCode,headers:n.headers})}}))},putBucketDomain:function(e,t){var n=(e.DomainConfiguration||{}).DomainRule||e.DomainRule||[];n=o.clone(n);var r=o.json2xml({DomainConfiguration:{DomainRule:n}}),i=e.Headers;i["Content-Type"]="application/xml",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketDomain",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:r,action:"domain",headers:i},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketDomain:function(e,t){d.call(this,{Action:"name/cos:GetBucketDomain",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"domain"},(function(e,n){if(e)return t(e);var r=[];try{r=n.DomainConfiguration.DomainRule||[]}catch(e){}r=o.clone(o.isArray(r)?r:[r]),t(null,{DomainRule:r,statusCode:n.statusCode,headers:n.headers})}))},deleteBucketDomain:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketDomain",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"domain"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketOrigin:function(e,t){var n=(e.OriginConfiguration||{}).OriginRule||e.OriginRule||[];n=o.clone(n);var r=o.json2xml({OriginConfiguration:{OriginRule:n}}),i=e.Headers;i["Content-Type"]="application/xml",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketOrigin",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:r,action:"origin",headers:i},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketOrigin:function(e,t){d.call(this,{Action:"name/cos:GetBucketOrigin",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"origin"},(function(e,n){if(e)return t(e);var r=[];try{r=n.OriginConfiguration.OriginRule||[]}catch(e){}r=o.clone(o.isArray(r)?r:[r]),t(null,{OriginRule:r,statusCode:n.statusCode,headers:n.headers})}))},deleteBucketOrigin:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketOrigin",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"origin"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketLogging:function(e,t){var n=o.json2xml({BucketLoggingStatus:e.BucketLoggingStatus||""}),r=e.Headers;r["Content-Type"]="application/xml",r["Content-MD5"]=o.binaryBase64(o.md5(n)),d.call(this,{Action:"name/cos:PutBucketLogging",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:n,action:"logging",headers:r},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketLogging:function(e,t){d.call(this,{Action:"name/cos:GetBucketLogging",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"logging"},(function(e,n){if(e)return t(e);t(null,{BucketLoggingStatus:n.BucketLoggingStatus,statusCode:n.statusCode,headers:n.headers})}))},putBucketInventory:function(e,t){var n=o.clone(e.InventoryConfiguration);if(n.OptionalFields){var r=n.OptionalFields||[];n.OptionalFields={Field:r}}if(n.Destination&&n.Destination.COSBucketDestination&&n.Destination.COSBucketDestination.Encryption){var i=n.Destination.COSBucketDestination.Encryption;Object.keys(i).indexOf("SSECOS")>-1&&(i["SSE-COS"]=i.SSECOS,delete i.SSECOS)}var a=o.json2xml({InventoryConfiguration:n}),s=e.Headers;s["Content-Type"]="application/xml",s["Content-MD5"]=o.binaryBase64(o.md5(a)),d.call(this,{Action:"name/cos:PutBucketInventory",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:a,action:"inventory",qs:{id:e.Id},headers:s},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketInventory:function(e,t){d.call(this,{Action:"name/cos:GetBucketInventory",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"inventory",qs:{id:e.Id}},(function(e,n){if(e)return t(e);var r=n.InventoryConfiguration;if(r&&r.OptionalFields&&r.OptionalFields.Field){var i=r.OptionalFields.Field;o.isArray(i)||(i=[i]),r.OptionalFields=i}if(r.Destination&&r.Destination.COSBucketDestination&&r.Destination.COSBucketDestination.Encryption){var a=r.Destination.COSBucketDestination.Encryption;Object.keys(a).indexOf("SSE-COS")>-1&&(a.SSECOS=a["SSE-COS"],delete a["SSE-COS"])}t(null,{InventoryConfiguration:r,statusCode:n.statusCode,headers:n.headers})}))},listBucketInventory:function(e,t){d.call(this,{Action:"name/cos:ListBucketInventory",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"inventory",qs:{"continuation-token":e.ContinuationToken}},(function(e,n){if(e)return t(e);var r=n.ListInventoryConfigurationResult,i=r.InventoryConfiguration||[];i=o.isArray(i)?i:[i],delete r.InventoryConfiguration,o.each(i,(function(e){if(e&&e.OptionalFields&&e.OptionalFields.Field){var t=e.OptionalFields.Field;o.isArray(t)||(t=[t]),e.OptionalFields=t}if(e.Destination&&e.Destination.COSBucketDestination&&e.Destination.COSBucketDestination.Encryption){var n=e.Destination.COSBucketDestination.Encryption;Object.keys(n).indexOf("SSE-COS")>-1&&(n.SSECOS=n["SSE-COS"],delete n["SSE-COS"])}})),r.InventoryConfigurations=i,o.extend(r,{statusCode:n.statusCode,headers:n.headers}),t(null,r)}))},deleteBucketInventory:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketInventory",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"inventory",qs:{id:e.Id}},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},putBucketAccelerate:function(e,t){if(e.AccelerateConfiguration){var n={AccelerateConfiguration:e.AccelerateConfiguration||{}},r=o.json2xml(n),i={"Content-Type":"application/xml"};i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:PutBucketAccelerate",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:r,action:"accelerate",headers:i},(function(e,n){if(e)return t(e);t(null,{statusCode:n.statusCode,headers:n.headers})}))}else t(o.error(new Error("missing param AccelerateConfiguration")))},getBucketAccelerate:function(e,t){d.call(this,{Action:"name/cos:GetBucketAccelerate",method:"GET",Bucket:e.Bucket,Region:e.Region,action:"accelerate"},(function(e,n){e||!n.AccelerateConfiguration&&(n.AccelerateConfiguration={}),t(e,n)}))},putBucketEncryption:function(e,t){var n=e.ServerSideEncryptionConfiguration||{},r=n.Rule||n.Rules||[],i=o.json2xml({ServerSideEncryptionConfiguration:{Rule:r}}),a=e.Headers;a["Content-Type"]="application/xml",a["Content-MD5"]=o.binaryBase64(o.md5(i)),d.call(this,{Action:"name/cos:PutBucketEncryption",method:"PUT",Bucket:e.Bucket,Region:e.Region,body:i,action:"encryption",headers:a},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getBucketEncryption:function(e,t){d.call(this,{Action:"name/cos:GetBucketEncryption",method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"encryption"},(function(e,n){if(e)if(404===e.statusCode&&"NoSuchEncryptionConfiguration"===e.code){var r={EncryptionConfiguration:{Rules:[]},statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else t(e);else{var i=o.makeArray(n.EncryptionConfiguration&&n.EncryptionConfiguration.Rule||[]);n.EncryptionConfiguration={Rules:i},t(e,n)}}))},deleteBucketEncryption:function(e,t){d.call(this,{Action:"name/cos:DeleteBucketReplication",method:"DELETE",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"encryption"},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getObject:function(e,t){var n=e.Query||{},r=e.QueryString||"",i=o.throttleOnProgress.call(this,0,e.onProgress),a=e.tracker;a&&a.setParams({signStartTime:(new Date).getTime()}),n["response-content-type"]=e.ResponseContentType,n["response-content-language"]=e.ResponseContentLanguage,n["response-expires"]=e.ResponseExpires,n["response-cache-control"]=e.ResponseCacheControl,n["response-content-disposition"]=e.ResponseContentDisposition,n["response-content-encoding"]=e.ResponseContentEncoding,d.call(this,{Action:"name/cos:GetObject",method:"GET",Bucket:e.Bucket,Region:e.Region,Key:e.Key,VersionId:e.VersionId,DataType:e.DataType,headers:e.Headers,qs:n,qsStr:r,rawBody:!0,onDownloadProgress:i,tracker:a},(function(n,r){if(i(null,!0),n){var a=n.statusCode;return e.Headers["If-Modified-Since"]&&a&&304===a?t(null,{NotModified:!0}):t(n)}t(null,{Body:r.body,ETag:o.attr(r.headers,"etag",""),statusCode:r.statusCode,headers:r.headers})}))},headObject:function(e,t){d.call(this,{Action:"name/cos:HeadObject",method:"HEAD",Bucket:e.Bucket,Region:e.Region,Key:e.Key,VersionId:e.VersionId,headers:e.Headers},(function(n,r){if(n){var i=n.statusCode;return e.Headers["If-Modified-Since"]&&i&&304===i?t(null,{NotModified:!0,statusCode:i}):t(n)}r.ETag=o.attr(r.headers,"etag",""),t(null,r)}))},listObjectVersions:function(e,t){var n={};n.prefix=e.Prefix||"",n.delimiter=e.Delimiter,n["key-marker"]=e.KeyMarker,n["version-id-marker"]=e.VersionIdMarker,n["max-keys"]=e.MaxKeys,n["encoding-type"]=e.EncodingType,d.call(this,{Action:"name/cos:GetBucketObjectVersions",ResourceKey:n.prefix,method:"GET",Bucket:e.Bucket,Region:e.Region,headers:e.Headers,qs:n,action:"versions"},(function(e,n){if(e)return t(e);var r=n.ListVersionsResult||{},i=r.DeleteMarker||[];i=o.isArray(i)?i:[i];var a=r.Version||[];a=o.isArray(a)?a:[a];var s=o.clone(r);delete s.DeleteMarker,delete s.Version,o.extend(s,{DeleteMarkers:i,Versions:a,statusCode:n.statusCode,headers:n.headers}),t(null,s)}))},putObject:function(e,t){var n=this,r=e.ContentLength,i=o.throttleOnProgress.call(n,r,e.onProgress),a=e.Headers;a["Cache-Control"]||a["cache-control"]||(a["Cache-Control"]=""),a["Content-Type"]||a["content-type"]||(a["Content-Type"]=e.Body&&e.Body.type||"");var c=e.UploadAddMetaMd5||n.options.UploadAddMetaMd5||n.options.UploadCheckContentMd5,u=e.tracker;c&&u&&u.setParams({md5StartTime:(new Date).getTime()}),o.getBodyMd5(c,e.Body,(function(c){c&&(u&&u.setParams({md5EndTime:(new Date).getTime()}),n.options.UploadCheckContentMd5&&(a["Content-MD5"]=o.binaryBase64(c)),(e.UploadAddMetaMd5||n.options.UploadAddMetaMd5)&&(a["x-cos-meta-md5"]=c)),void 0!==e.ContentLength&&(a["Content-Length"]=e.ContentLength),i(null,!0),d.call(n,{Action:"name/cos:PutObject",TaskId:e.TaskId,method:"PUT",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,qs:e.Query,body:e.Body,onProgress:i,tracker:u},(function(a,c){if(a)return i(null,!0),t(a);i({loaded:r,total:r},!0);var u=s({ForcePathStyle:n.options.ForcePathStyle,protocol:n.options.Protocol,domain:n.options.Domain,bucket:e.Bucket,region:n.options.UseAccelerate?"accelerate":e.Region,object:e.Key});u=u.substr(u.indexOf("://")+3),c.Location=u,c.ETag=o.attr(c.headers,"etag",""),t(null,c)}))}),e.onHashProgress)},deleteObject:function(e,t){d.call(this,{Action:"name/cos:DeleteObject",method:"DELETE",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,VersionId:e.VersionId,action:e.Recursive?"recursive":""},(function(e,n){if(e){var r=e.statusCode;return r&&404===r?t(null,{BucketNotFound:!0,statusCode:r}):t(e)}t(null,{statusCode:n.statusCode,headers:n.headers})}))},getObjectAcl:function(e,t){d.call(this,{Action:"name/cos:GetObjectACL",method:"GET",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,action:"acl"},(function(e,n){if(e)return t(e);var r=n.AccessControlPolicy||{},a=r.Owner||{},s=r.AccessControlList&&r.AccessControlList.Grant||[];s=o.isArray(s)?s:[s];var c=i(r);delete c.GrantWrite,n.headers&&n.headers["x-cos-acl"]&&(c.ACL=n.headers["x-cos-acl"]),c=o.extend(c,{Owner:a,Grants:s,statusCode:n.statusCode,headers:n.headers}),t(null,c)}))},putObjectAcl:function(e,t){var n=e.Headers,r="";if(e.AccessControlPolicy){var i=o.clone(e.AccessControlPolicy||{}),s=i.Grants||i.Grant;s=o.isArray(s)?s:[s],delete i.Grant,delete i.Grants,i.AccessControlList={Grant:s},r=o.json2xml({AccessControlPolicy:i}),n["Content-Type"]="application/xml",n["Content-MD5"]=o.binaryBase64(o.md5(r))}o.each(n,(function(e,t){0===t.indexOf("x-cos-grant-")&&(n[t]=a(n[t]))})),d.call(this,{Action:"name/cos:PutObjectACL",method:"PUT",Bucket:e.Bucket,Region:e.Region,Key:e.Key,action:"acl",headers:n,body:r},(function(e,n){if(e)return t(e);t(null,{statusCode:n.statusCode,headers:n.headers})}))},optionsObject:function(e,t){var n=e.Headers;n.Origin=e.Origin,n["Access-Control-Request-Method"]=e.AccessControlRequestMethod,n["Access-Control-Request-Headers"]=e.AccessControlRequestHeaders,d.call(this,{Action:"name/cos:OptionsObject",method:"OPTIONS",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:n},(function(e,n){if(e)return e.statusCode&&403===e.statusCode?t(null,{OptionsForbidden:!0,statusCode:e.statusCode}):t(e);var r=n.headers||{};t(null,{AccessControlAllowOrigin:r["access-control-allow-origin"],AccessControlAllowMethods:r["access-control-allow-methods"],AccessControlAllowHeaders:r["access-control-allow-headers"],AccessControlExposeHeaders:r["access-control-expose-headers"],AccessControlMaxAge:r["access-control-max-age"],statusCode:n.statusCode,headers:n.headers})}))},putObjectCopy:function(e,t){var n=this,r=e.Headers;r["Cache-Control"]||r["cache-control"]||(r["Cache-Control"]="");var i=e.CopySource||"",a=o.getSourceParams.call(this,i);if(a){var c=a[1],u=a[3],l=decodeURIComponent(a[4]);d.call(this,{Scope:[{action:"name/cos:GetObject",bucket:c,region:u,prefix:l},{action:"name/cos:PutObject",bucket:e.Bucket,region:e.Region,prefix:e.Key}],method:"PUT",Bucket:e.Bucket,Region:e.Region,Key:e.Key,VersionId:e.VersionId,headers:e.Headers},(function(r,i){if(r)return t(r);var a=o.clone(i.CopyObjectResult||{}),c=s({ForcePathStyle:n.options.ForcePathStyle,protocol:n.options.Protocol,domain:n.options.Domain,bucket:e.Bucket,region:e.Region,object:e.Key,isLocation:!0});o.extend(a,{Location:c,statusCode:i.statusCode,headers:i.headers}),t(null,a)}))}else t(o.error(new Error("CopySource format error")))},deleteMultipleObject:function(e,t){var n=e.Objects||[],r=e.Quiet;n=o.isArray(n)?n:[n];var i=o.json2xml({Delete:{Object:n,Quiet:r||!1}}),a=e.Headers;a["Content-Type"]="application/xml",a["Content-MD5"]=o.binaryBase64(o.md5(i));var s=o.map(n,(function(t){return{action:"name/cos:DeleteObject",bucket:e.Bucket,region:e.Region,prefix:t.Key}}));d.call(this,{Scope:s,method:"POST",Bucket:e.Bucket,Region:e.Region,body:i,action:"delete",headers:a},(function(e,n){if(e)return t(e);var r=n.DeleteResult||{},i=r.Deleted||[],a=r.Error||[];i=o.isArray(i)?i:[i],a=o.isArray(a)?a:[a];var s=o.clone(r);o.extend(s,{Error:a,Deleted:i,statusCode:n.statusCode,headers:n.headers}),t(null,s)}))},restoreObject:function(e,t){var n=e.Headers;if(e.RestoreRequest){var r=e.RestoreRequest||{},i=o.json2xml({RestoreRequest:r});n["Content-Type"]="application/xml",n["Content-MD5"]=o.binaryBase64(o.md5(i)),d.call(this,{Action:"name/cos:RestoreObject",method:"POST",Bucket:e.Bucket,Region:e.Region,Key:e.Key,VersionId:e.VersionId,body:i,action:"restore",headers:n},t)}else t(o.error(new Error("missing param RestoreRequest")))},putObjectTagging:function(e,t){var n=e.Tagging||{},r=n.TagSet||n.Tags||e.Tags||[];r=o.clone(o.isArray(r)?r:[r]);var i=o.json2xml({Tagging:{TagSet:{Tag:r}}}),a=e.Headers;a["Content-Type"]="application/xml",a["Content-MD5"]=o.binaryBase64(o.md5(i)),d.call(this,{Action:"name/cos:PutObjectTagging",method:"PUT",Bucket:e.Bucket,Key:e.Key,Region:e.Region,body:i,action:"tagging",headers:a,VersionId:e.VersionId},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},getObjectTagging:function(e,t){d.call(this,{Action:"name/cos:GetObjectTagging",method:"GET",Key:e.Key,Bucket:e.Bucket,Region:e.Region,headers:e.Headers,action:"tagging",VersionId:e.VersionId},(function(e,n){if(e)if(404!==e.statusCode||!e.error||"Not Found"!==e.error&&"NoSuchTagSet"!==e.error.Code)t(e);else{var r={Tags:[],statusCode:e.statusCode};e.headers&&(r.headers=e.headers),t(null,r)}else{var i=[];try{i=n.Tagging.TagSet.Tag||[]}catch(e){}i=o.clone(o.isArray(i)?i:[i]),t(null,{Tags:i,statusCode:n.statusCode,headers:n.headers})}}))},deleteObjectTagging:function(e,t){d.call(this,{Action:"name/cos:DeleteObjectTagging",method:"DELETE",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,action:"tagging",VersionId:e.VersionId},(function(e,n){return e&&204===e.statusCode?t(null,{statusCode:e.statusCode}):e?t(e):void t(null,{statusCode:n.statusCode,headers:n.headers})}))},selectObjectContent:function(e,t){if(!e.SelectType)return t(o.error(new Error("missing param SelectType")));var n=e.SelectRequest||{},r=o.json2xml({SelectRequest:n}),i=e.Headers;i["Content-Type"]="application/xml",i["Content-MD5"]=o.binaryBase64(o.md5(r)),d.call(this,{Action:"name/cos:GetObject",method:"POST",Bucket:e.Bucket,Region:e.Region,Key:e.Key,headers:e.Headers,action:"select",qs:{"select-type":e.SelectType},VersionId:e.VersionId,body:r,DataType:"arraybuffer",rawBody:!0},(function(e,n){if(e&&204===e.statusCode)return t(null,{statusCode:e.statusCode});if(e)return t(e);var r=o.parseSelectPayload(n.body);t(null,{statusCode:n.statusCode,headers:n.headers,Body:r.body,Payload:r.payload})}))},appendObject:function(e,t){var n=e.Headers;n["Cache-Control"]||n["cache-control"]||(n["Cache-Control"]=""),n["Content-Type"]||n["content-type"]||(n["Content-Type"]=e.Body&&e.Body.type||""),d.call(this,{Action:"name/cos:AppendObject",method:"POST",Bucket:e.Bucket,Region:e.Region,action:"append",Key:e.Key,body:e.Body,qs:{position:e.Position},headers:e.Headers},(function(e,n){if(e)return t(e);t(null,n)}))},uploadPartCopy:function(e,t){var n=e.CopySource||"",r=o.getSourceParams.call(this,n);if(r){var i=r[1],a=r[3],s=decodeURIComponent(r[4]);d.call(this,{Scope:[{action:"name/cos:GetObject",bucket:i,region:a,prefix:s},{action:"name/cos:PutObject",bucket:e.Bucket,region:e.Region,prefix:e.Key}],method:"PUT",Bucket:e.Bucket,Region:e.Region,Key:e.Key,VersionId:e.VersionId,qs:{partNumber:e.PartNumber,uploadId:e.UploadId},headers:e.Headers},(function(e,n){if(e)return t(e);var r=o.clone(n.CopyPartResult||{});o.extend(r,{statusCode:n.statusCode,headers:n.headers}),t(null,r)}))}else t(o.error(new Error("CopySource format error")))},multipartInit:function(e,t){var n=this,r=e.Headers,i=e.tracker;r["Cache-Control"]||r["cache-control"]||(r["Cache-Control"]=""),r["Content-Type"]||r["content-type"]||(r["Content-Type"]=e.Body&&e.Body.type||"");var a=e.Body&&(e.UploadAddMetaMd5||n.options.UploadAddMetaMd5);a&&i&&i.setParams({md5StartTime:(new Date).getTime()}),o.getBodyMd5(a,e.Body,(function(r){r&&(e.Headers["x-cos-meta-md5"]=r),a&&i&&i.setParams({md5EndTime:(new Date).getTime()}),d.call(n,{Action:"name/cos:InitiateMultipartUpload",method:"POST",Bucket:e.Bucket,Region:e.Region,Key:e.Key,action:"uploads",headers:e.Headers,qs:e.Query,tracker:i},(function(e,n){return e?(i&&i.parent&&i.parent.setParams({errorNode:"multipartInit"}),t(e)):(n=o.clone(n||{}))&&n.InitiateMultipartUploadResult?t(null,o.extend(n.InitiateMultipartUploadResult,{statusCode:n.statusCode,headers:n.headers})):void t(null,n)}))}),e.onHashProgress)},multipartUpload:function(e,t){var n=this;o.getFileSize("multipartUpload",e,(function(){var r=e.tracker,i=n.options.UploadCheckContentMd5;i&&r&&r.setParams({md5StartTime:(new Date).getTime()}),o.getBodyMd5(i,e.Body,(function(a){a&&(e.Headers["Content-MD5"]=o.binaryBase64(a)),i&&r&&r.setParams({md5EndTime:(new Date).getTime()}),r&&r.setParams({partNumber:e.PartNumber}),d.call(n,{Action:"name/cos:UploadPart",TaskId:e.TaskId,method:"PUT",Bucket:e.Bucket,Region:e.Region,Key:e.Key,qs:{partNumber:e.PartNumber,uploadId:e.UploadId},headers:e.Headers,onProgress:e.onProgress,body:e.Body||null,tracker:r},(function(e,n){if(e)return r&&r.parent&&r.parent.setParams({errorNode:"multipartUpload"}),t(e);t(null,{ETag:o.attr(n.headers,"etag",""),statusCode:n.statusCode,headers:n.headers})}))}))}))},multipartComplete:function(e,t){for(var n=this,r=e.UploadId,i=e.Parts,a=e.tracker,c=0,u=i.length;c-1?function(e){var t=e.match(/q-url-param-list.*?(?=&)/g)[0],n="q-url-param-list="+encodeURIComponent(t.replace(/q-url-param-list=/,"")).toLowerCase(),r=new RegExp(t,"g");return e.replace(r,n)}(n.Authorization):"sign="+encodeURIComponent(n.Authorization)),n.SecurityToken&&(r+="&x-cos-security-token="+n.SecurityToken),n.ClientIP&&(r+="&clientIP="+n.ClientIP),n.ClientUA&&(r+="&clientUA="+n.ClientUA),n.Token&&(r+="&token="+n.Token),a&&(r+="&"+a),setTimeout((function(){t(null,{Url:r})}))}}));return p?(l+="?"+p.Authorization+(p.SecurityToken?"&x-cos-security-token="+p.SecurityToken:""),a&&(l+="&"+a)):a&&(l+="?"+a),l},getAuth:function(e){return o.getAuth({SecretId:e.SecretId||this.options.SecretId||"",SecretKey:e.SecretKey||this.options.SecretKey||"",Bucket:e.Bucket,Region:e.Region,Method:e.Method,Key:e.Key,Query:e.Query,Headers:e.Headers,Expires:e.Expires,UseRawKey:this.options.UseRawKey,SystemClockOffset:this.options.SystemClockOffset})}};e.exports.init=function(e,t){t.transferToTaskMethod(f,"putObject"),o.each(f,(function(t,n){e.prototype[n]=o.apiWrapper(n,t),function(e,t,n){o.each(["Cors","Acl"],(function(r){if(e.slice(-r.length)===r){var i=e.slice(0,-r.length)+r.toUpperCase(),a=o.apiWrapper(e,t);n[i]=function(){a.apply(this,arguments)}}}))}(n,t,e.prototype)}))}},function(e,t,n){var r=n(0),o=function(e){switch(r(e)){case"string":return e;case"boolean":return e?"true":"false";case"number":return isFinite(e)?e:"";default:return""}},i=function(e,t,n){var r={};return t.getAllResponseHeaders().trim().split("\n").forEach((function(e){if(e){var t=e.indexOf(":"),n=e.substr(0,t).trim().toLowerCase(),o=e.substr(t+1).trim();r[n]=o}})),{error:e,statusCode:t.status,statusMessage:t.statusText,headers:r,body:n}},a=function(e,t){return t||"text"!==t?e.response:e.responseText};e.exports=function(e,t){var n,s,c,u,l=(e.method||"GET").toUpperCase(),d=e.url;if(e.qs){var p=(n=e.qs,s=s||"&",c=c||"=",null===n&&(n=void 0),"object"===r(n)?Object.keys(n).map((function(e){var t=encodeURIComponent(o(e))+c;return Array.isArray(n[e])?n[e].map((function(e){return t+encodeURIComponent(o(e))})).join(s):t+encodeURIComponent(o(n[e]))})).filter(Boolean).join(s):u?encodeURIComponent(o(u))+c+encodeURIComponent(o(n)):"");p&&(d+=(-1===d.indexOf("?")?"?":"&")+p)}var f=new XMLHttpRequest;if(f.open(l,d,!0),f.responseType=e.dataType||"text",e.xhrFields)for(var h in e.xhrFields)f[h]=e.xhrFields[h];var m=e.headers;if(m)for(var g in m)m.hasOwnProperty(g)&&"content-length"!==g.toLowerCase()&&"user-agent"!==g.toLowerCase()&&"origin"!==g.toLowerCase()&&"host"!==g.toLowerCase()&&f.setRequestHeader(g,m[g]);return e.onProgress&&f.upload&&(f.upload.onprogress=e.onProgress),e.onDownloadProgress&&(f.onprogress=e.onDownloadProgress),e.timeout&&(f.timeout=e.timeout),f.ontimeout=function(e){var n=new Error("timeout");t(i(n,f))},f.onload=function(){t(i(null,f,a(f,e.dataType)))},f.onerror=function(n){var r=a(f,e.dataType);if(r)t(i(null,f,r));else{var o=f.statusText;o||0!==f.status||(o=new Error("CORS blocked or network error")),t(i(o,f,r))}},f.send(e.body||""),f}},function(e,t,n){var r=n(0),o=n(10),i=n(29),a=n(9).EventProxy,s=n(1),c=n(7);function u(e,t){var n=e.TaskId,r=e.Bucket,c=e.Region,u=e.Key,p=e.StorageClass,f=this,h={},m=e.FileSize,g=e.SliceSize,y=Math.ceil(m/g),v=0,C=s.throttleOnProgress.call(f,m,e.onHashProgress),k=function(t,n){var r=t.length;if(0===r)return n(null,!0);if(r>y)return n(null,!1);if(r>1&&Math.max(t[0].Size,t[1].Size)!==g)return n(null,!1);!function o(i){if(i=a.length)S.emit("has_and_check_upload_id",t);else{var p=a[l];if(!s.isInArray(t,p))return o.removeUploadId.call(f,p),void i(l+1);o.using[p]?i(l+1):d.call(f,{Bucket:r,Region:c,Key:u,UploadId:p,tracker:e.tracker},(function(e,t){f._isRunningTask(n)&&(e?(o.removeUploadId.call(f,p),i(l+1)):S.emit("upload_id_available",{UploadId:p,PartList:t.PartList}))}))}}(0)}else S.emit("has_and_check_upload_id",t)})),S.on("get_remote_upload_id_list",(function(){l.call(f,{Bucket:r,Region:c,Key:u,tracker:e.tracker},(function(t,i){if(f._isRunningTask(n)){if(t)return S.emit("error",t);var a=s.filter(i.UploadList,(function(e){return e.Key===u&&(!p||e.StorageClass.toUpperCase()===p.toUpperCase())})).reverse().map((function(e){return e.UploadId||e.UploadID}));if(a.length)S.emit("seek_local_avail_upload_id",a);else{var c,l=o.getFileId(e.Body,e.ChunkSize,r,u);l&&(c=o.getUploadIdList.call(f,l))&&s.each(c,(function(e){o.removeUploadId.call(f,e)})),S.emit("no_available_upload_id")}}}))})),S.emit("get_remote_upload_id_list")}function l(e,t){var n=this,r=[],o={Bucket:e.Bucket,Region:e.Region,Prefix:e.Key,calledBySdk:e.calledBySdk||"sliceUploadFile",tracker:e.tracker};!function e(){n.multipartList(o,(function(n,i){if(n)return t(n);r.push.apply(r,i.Upload||[]),"true"===i.IsTruncated?(o.KeyMarker=i.NextKeyMarker,o.UploadIdMarker=i.NextUploadIdMarker,e()):t(null,{UploadList:r})}))}()}function d(e,t){var n=this,r=[],o={Bucket:e.Bucket,Region:e.Region,Key:e.Key,UploadId:e.UploadId,calledBySdk:"sliceUploadFile",tracker:e.tracker};!function e(){n.multipartListPart(o,(function(n,i){if(n)return t(n);r.push.apply(r,i.Part||[]),"true"===i.IsTruncated?(o.PartNumberMarker=i.NextPartNumberMarker,e()):t(null,{PartList:r})}))}()}function p(e,t){var n=this,r=e.TaskId,o=e.Bucket,a=e.Region,c=e.Key,u=e.UploadData,l=e.FileSize,d=e.SliceSize,p=Math.min(e.AsyncLimit||n.options.ChunkParallelLimit||1,256),h=e.Body,m=Math.ceil(l/d),g=0,y=e.ServerSideEncryption,v=e.Headers,C=s.filter(u.PartList,(function(e){return e.Uploaded&&(g+=e.PartNumber>=m&&l%d||d),!e.Uploaded})),k=e.onProgress;i.eachLimit(C,p,(function(t,i){if(n._isRunningTask(r)){var s=t.PartNumber,p=Math.min(l,t.PartNumber*d)-(t.PartNumber-1)*d,m=0;f.call(n,{TaskId:r,Bucket:o,Region:a,Key:c,SliceSize:d,FileSize:l,PartNumber:s,ServerSideEncryption:y,Body:h,UploadData:u,Headers:v,onProgress:function(e){g+=e.loaded-m,m=e.loaded,k({loaded:g,total:l})},tracker:e.tracker},(function(e,o){n._isRunningTask(r)&&(e||o.ETag||(e='get ETag error, please add "ETag" to CORS ExposeHeader setting.( 获取ETag失败,请在CORS ExposeHeader设置中添加ETag,请参考文档:https://cloud.tencent.com/document/product/436/13318 )'),e?g-=m:(g+=p-m,t.ETag=o.ETag),k({loaded:g,total:l}),i(e||null,o))}))}}),(function(e){if(n._isRunningTask(r))return e?t(e):void t(null,{UploadId:u.UploadId,SliceList:u.PartList})}))}function f(e,t){var n=this,r=e.TaskId,o=e.Bucket,a=e.Region,c=e.Key,u=e.FileSize,l=e.Body,d=1*e.PartNumber,p=e.SliceSize,f=e.ServerSideEncryption,h=e.UploadData,m=e.Headers||{},g=n.options.ChunkRetryTimes+1,y=p*(d-1),v=p,C=y+p;C>u&&(v=(C=u)-y);var k=["x-cos-traffic-limit","x-cos-mime-limit"],S={};s.each(m,(function(e,t){k.indexOf(t)>-1&&(S[t]=e)}));var b=h.PartList[d-1];i.retry(g,(function(t){n._isRunningTask(r)&&s.fileSlice(l,y,C,!0,(function(i){n.multipartUpload({TaskId:r,Bucket:o,Region:a,Key:c,ContentLength:v,PartNumber:d,UploadId:h.UploadId,ServerSideEncryption:f,Body:i,Headers:S,onProgress:e.onProgress,calledBySdk:"sliceUploadFile",tracker:e.tracker},(function(e,o){if(n._isRunningTask(r))return e?t(e):(b.Uploaded=!0,t(null,o))}))}))}),(function(e,o){if(n._isRunningTask(r))return t(e,o)}))}function h(e,t){var n=e.Bucket,r=e.Region,o=e.Key,a=e.UploadId,s=e.SliceList,c=this,u=this.options.ChunkRetryTimes+1,l=e.Headers,d=s.map((function(e){return{PartNumber:e.PartNumber,ETag:e.ETag}}));i.retry(u,(function(t){c.multipartComplete({Bucket:n,Region:r,Key:o,UploadId:a,Parts:d,Headers:l,calledBySdk:"sliceUploadFile",tracker:e.tracker},t)}),(function(e,n){t(e,n)}))}function m(e,t){var n=e.Bucket,r=e.Region,o=e.Key,a=e.AbortArray,s=e.AsyncLimit||1,c=this,u=0,l=new Array(a.length);i.eachLimit(a,s,(function(t,i){var a=u;if(o&&o!==t.Key)return l[a]={error:{KeyNotMatch:!0}},void i(null);var s=t.UploadId||t.UploadID;c.multipartAbort({Bucket:n,Region:r,Key:t.Key,Headers:e.Headers,UploadId:s},(function(e){var o={Bucket:n,Region:r,Key:t.Key,UploadId:s};l[a]={error:e,task:o},i(null)})),u++}),(function(e){if(e)return t(e);for(var n=[],r=[],o=0,i=l.length;oo?"sliceUploadFile":"putObject",h=e.onFileFinish;i.push({api:f,params:e,callback:function(n,r){e.tracker&&e.tracker.formatResult(n,r),h&&h(n,r,l),t&&t(n,r)}}),n._addTasks(i)},uploadFiles:function(e,t){var n=this,o=void 0===e.SliceSize?n.options.SliceSize:e.SliceSize,i=0,a=0,u=s.throttleOnProgress.call(n,a,e.onProgress),l=e.files.length,d=e.onFileFinish,p=Array(l),f=function(e,n,r){u(null,!0),d&&d(e,n,r),p[r.Index]={options:r,error:e,data:n},--l<=0&&t&&t(null,{files:p})},h=[];s.each(e.files,(function(e,t){!function(){var l=e.Body,d=l.size||l.length||0,p={Index:t,TaskId:""};if(i+=d,n.options.EnableTracker){var m=n.options.UseAccelerate||n.options.Domain.includes("accelerate.");e.tracker=new c({bucket:e.Bucket,region:e.Region,apiName:"uploadFiles",fileKey:e.Key,fileSize:d,accelerate:m,deepTracker:n.options.DeepTracker,customId:n.options.CustomId,delay:n.options.TrackerDelay})}s.each(e,(function(e,t){"object"!==r(e)&&"function"!=typeof e&&(p[t]=e)}));var g=e.onTaskReady;e.onTaskReady=function(e){p.TaskId=e,g&&g(e)};var y=0,v=e.onProgress;e.onProgress=function(e){a=a-y+e.loaded,y=e.loaded,v&&v(e),u({loaded:a,total:i})};var C=d>o?"sliceUploadFile":"putObject",k=e.onFileFinish;h.push({api:C,params:e,callback:function(t,n){e.tracker&&e.tracker.formatResult(t,n),k&&k(t,n),f&&f(t,n,p)}})}()})),n._addTasks(h)},sliceCopyFile:function(e,t){var n=new a,r=this,o=e.Bucket,c=e.Region,u=e.Key,l=e.CopySource,d=s.getSourceParams.call(this,l);if(d){var p=d.Bucket,f=d.Region,h=decodeURIComponent(d.Key),m=void 0===e.CopySliceSize?r.options.CopySliceSize:e.CopySliceSize;m=Math.max(0,m);var y,v,C=e.CopyChunkSize||this.options.CopyChunkSize,k=this.options.CopyChunkParallelLimit,S=0;n.on("copy_slice_complete",(function(n){var i={};s.each(e.Headers,(function(e,t){0===t.toLowerCase().indexOf("x-cos-meta-")&&(i[t]=e)}));var a=s.map(n.PartList,(function(e){return{PartNumber:e.PartNumber,ETag:e.ETag}}));r.multipartComplete({Bucket:o,Region:c,Key:u,UploadId:n.UploadId,Parts:a,calledBySdk:"sliceCopyFile"},(function(e,n){if(e)return v(null,!0),t(e);v({loaded:y,total:y},!0),t(null,n)}))})),n.on("get_copy_data_finish",(function(e){i.eachLimit(e.PartList,k,(function(t,n){var i=t.PartNumber,a=t.CopySourceRange,s=t.end-t.start;g.call(r,{Bucket:o,Region:c,Key:u,CopySource:l,UploadId:e.UploadId,PartNumber:i,CopySourceRange:a},(function(e,r){if(e)return n(e);v({loaded:S+=s,total:y}),t.ETag=r.ETag,n(e||null,r)}))}),(function(r){if(r)return v(null,!0),t(r);n.emit("copy_slice_complete",e)}))})),n.on("get_file_size_finish",(function(i){var a;if(function(){for(var t=[1,2,4,8,16,32,64,128,256,512,1024,2048,4096,5120],n=1048576,o=0;on.length&&(c[t]=e)})),n.emit("get_file_size_finish",c)}else t(s.error(new Error('get Content-Length error, please add "Content-Length" to CORS ExposeHeader setting.( 获取Content-Length失败,请在CORS ExposeHeader设置中添加Content-Length,请参考文档:https://cloud.tencent.com/document/product/436/13318 )')))}))}else t(s.error(new Error("CopySource format error")))}};e.exports.init=function(e,t){t.transferToTaskMethod(y,"sliceUploadFile"),s.each(y,(function(t,n){e.prototype[n]=s.apiWrapper(n,t)}))}},function(e,t){var n={eachLimit:function(e,t,n,r){if(r=r||function(){},!e.length||t<=0)return r();var o=0,i=0,a=0;!function s(){if(o>=e.length)return r();for(;a=e.length?r():s())}))}()},retry:function(e,t,n){e<1?n():function r(o){t((function(t,i){t&&o= 0 || agent.indexOf("wow32") >= 0) { diff --git a/webpack.config.js b/webpack.config.js index 3586869..7af9150 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -50,7 +50,7 @@ replaceVersion(); module.exports = { mode: process.env.NODE_ENV, entry: path.resolve(__dirname, './index.js'), - devtool: "none", + devtool: process.env.NODE_ENV === 'production' ? "none" : "cheap-inline-source-map", output: { path: path.resolve(__dirname, './dist'), publicPath: '/dist/',