From 179a25f1206b91bc61b8fbabae17aa8e5fd929af Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 20 Feb 2017 00:08:52 +1100 Subject: [PATCH] Don't use minified anything Minified build will come when 1.0.0 is ready --- dist/json-schema-form-core.js | 2766 +++++++++------ dist/json-schema-form-core.js.map | 2 +- dist/json-schema-form-core.min.js | 9 + lib/json-refs-standalone.js | 5409 +++++++++++++++++++++++++++++ src/lib/resolve.js | 8 +- src/lib/resolve.spec.js | 23 +- 6 files changed, 7070 insertions(+), 1147 deletions(-) create mode 100644 dist/json-schema-form-core.min.js create mode 100644 lib/json-refs-standalone.js diff --git a/dist/json-schema-form-core.js b/dist/json-schema-form-core.js index f06f837..4efd5c6 100644 --- a/dist/json-schema-form-core.js +++ b/dist/json-schema-form-core.js @@ -1,7 +1,7 @@ /*! * json-schema-form-core * @version 1.0.0-alpha.2 - * @date Sun, 19 Feb 2017 04:08:50 GMT + * @date Sun, 19 Feb 2017 13:06:51 GMT * @link https://github.com/json-schema-form/json-schema-form-core * @license MIT * Copyright (c) 2014-2017 JSON Schema Form @@ -511,1143 +511,1629 @@ var canonicalTitleMap = __WEBPACK_IMPORTED_MODULE_2__lib_canonical_title_map__[" /* 5 */ /***/ (function(module, exports, __webpack_require__) { -var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var require;var require;var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -!function (e) { - if ("object" == ( false ? "undefined" : _typeof(exports)) && "undefined" != typeof module) module.exports = e();else if (true) !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (e), +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var require;var require;var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};(function(f){if(( false?"undefined":_typeof(exports))==="object"&&typeof module!=="undefined"){module.exports=f();}else if(true){!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else { - var t;t = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this, t.JsonRefs = e(); - } -}(function () { - var e;return function t(e, r, n) { - function o(s, a) { - if (!r[s]) { - if (!e[s]) { - var u = "function" == typeof require && require;if (!a && u) return require(s, !0);if (i) return i(s, !0);var c = new Error("Cannot find module '" + s + "'");throw c.code = "MODULE_NOT_FOUND", c; - }var f = r[s] = { exports: {} };e[s][0].call(f.exports, function (t) { - var r = e[s][1][t];return o(r ? r : t); - }, f, f.exports, t, e, r, n); - }return r[s].exports; - }for (var i = "function" == typeof require && require, s = 0; s < n.length; s++) { - o(n[s]); - }return o; - }({ 1: [function (e, t, r) { - "use strict"; - function n(e) { - var t;return d(e, "Array") ? (t = [], e.forEach(function (e, r) { - t[r] = n(e); - })) : d(e, "Object") ? (t = {}, Object.keys(e).forEach(function (r) { - t[r] = n(e[r]); - })) : t = e, t; - }function o(e, t) { - function r(e) { - Object.keys(e).forEach(function (t) { - n[t] = e[t]; - }); - }var n = {};return r(N.parse(e || "")), r(N.parse(t || "")), 0 === Object.keys(n).length ? void 0 : N.stringify(n); - }function i(e, t) { - d(e, "String") && (e = F(e)), d(t, "String") && (t = F(t));var r, - n, - i = m(d(t, "Undefined") ? "" : t);return M.indexOf(i.reference) > -1 ? n = i : (r = d(e, "Undefined") ? void 0 : m(e), d(r, "Undefined") ? n = i : (n = r, n.path = F(U.join(r.path, i.path)), n.query = o(r.query, i.query))), n.fragment = void 0, (-1 === M.indexOf(n.reference) && 0 === n.path.indexOf("../") ? "../" : "") + q.serialize(n); - }function s(e, t) { - var r, - n = [];return t.length > 0 && (r = e, t.slice(0, t.length - 1).forEach(function (e) { - e in r && (r = r[e], n.push(r)); - })), n; - }function a(e, t, r, o, i, s, a, f, p) { - var h, l;if (r.length > 0) try { - h = c(t, r); - } catch (y) { - "remote" === e && (o.error = y.message, o.missing = !0); - } else h = t;return d(h, "Undefined") || (o.value = h), d(h, "Array") || d(h, "Object") ? (l = n(i), "local" === e ? (delete l.subDocPath, t = h) : (l.relativeBase = U.dirname(s[s.length - 1]), 0 === r.length ? delete l.subDocPath : l.subDocPath = r), u(t, l, s, a, f, p)) : void 0; - }function u(e, t, r, n, o, s) { - var u = Promise.resolve(), - c = n.length ? j(n[n.length - 1]) : [], - f = O(e, t), - p = t.subDocPath || [], - l = S(p), - y = ["#"];return r.forEach(function (e, t) { - "#" !== e.charAt(0) && y.push(n[t]); - }), y.reverse(), "#" !== (r[r.length - 1] || "").charAt(0) && (o.documents[S(c)] = e), Object.keys(f).forEach(function (v) { - var m, - g, - b, - E, - w = f[v];b = 0 === r.length ? c.concat(j(v)) : c.concat(j(v).slice(0 === r.length ? 0 : p.length)), E = S(b), d(o[E], "Undefined") && (o.refs[E] = f[v], d(w.error, "Undefined") && "invalid" !== w.type && (L.indexOf(w.type) > -1 ? (m = i(t.relativeBase, w.uri), g = r.indexOf(m)) : (m = w.uri, g = n.indexOf(m)), w.ancestorPtrs = y, w.indirect = s, -1 === g ? L.indexOf(w.type) > -1 ? u = u.then(function () { - return h(m, t).then(function (e) { - return a("remote", e, d(w.uriDetails.fragment, "Undefined") ? [] : j(decodeURI(w.uriDetails.fragment)), w, t, r.concat(m), n.concat(E), o, s); - })["catch"](function (e) { - w.error = e.message, w.missing = !0; - }); - }) : 0 !== E.indexOf(m + "/") && E !== m && 0 !== l.indexOf(m + "/") && l !== m ? 0 !== m.indexOf(l + "/") && (u = u.then(function () { - return a("local", e, j(m), w, t, r.concat(m), n.concat(E), o, s || -1 === m.indexOf(l + "/") && m !== l); - })) : w.circular = !0 : (n.slice(g).forEach(function (e) { - o.refs[e].circular = !0; - }), w.circular = !0))); - }), u = u.then(function () { - function e(i, s, a, u) { - Object.keys(o.refs).forEach(function (c) { - var f = o.refs[c];-1 === n.indexOf(u) && -1 === r.indexOf(a) && -1 === t.indexOf(u) && c !== a && 0 === c.indexOf(u + "/") && (s.indexOf(u) > -1 ? s.forEach(function (e) { - -1 === t.indexOf(u) && t.push(e); - }) : e(i.concat(a), s.concat(u), c, f.uri), r.push(a), n.push(u)); - }); - }var t = [], - r = [], - n = [];Object.keys(o.refs).forEach(function (r) { - var n = o.refs[r];"local" !== n.type || n.circular || -1 !== t.indexOf(n.uri) || e([], [], r, n.uri); - }), Object.keys(o.refs).forEach(function (e) { - var r = o.refs[e];t.indexOf(r.uri) > -1 && (r.circular = !0); - }); - }).then(function () { - return o; - }); - }function c(e, t) { - var r = e;return t.forEach(function (e) { - if (e = decodeURI(e), !(e in r)) throw Error("JSON Pointer points to missing location: " + S(t));r = r[e]; - }), r; - }function f(e) { - return Object.keys(e).filter(function (e) { - return "$ref" !== e; - }); - }function p(e) { - var t;switch (e.uriDetails.reference) {case "absolute":case "uri": - t = "remote";break;case "same-document": - t = "local";break;default: - t = e.uriDetails.reference;}return t; - }function h(e, t) { - var r = k[e], - o = Promise.resolve(), - i = n(t.loaderOptions || {});return d(r, "Undefined") ? (d(i.processContent, "Undefined") && (i.processContent = function (e, t) { - t(void 0, JSON.parse(e.text)); - }), o = I.load(decodeURI(e), i), o = o.then(function (t) { - return k[e] = { value: t }, t; - })["catch"](function (t) { - throw k[e] = { error: t }, t; - })) : o = o.then(function () { - return r.value; - }), o = o.then(function (e) { - return n(e); - }); - }function l(e, t) { - var r = !0;try { - if (!d(e, "Object")) throw new Error("obj is not an Object");if (!d(e.$ref, "String")) throw new Error("obj.$ref is not a String"); - } catch (n) { - if (t) throw n;r = !1; - }return r; - }function d(e, t) { - return "Undefined" === t ? "undefined" == typeof e : Object.prototype.toString.call(e) === "[object " + t + "]"; - }function y(e) { - var t, r;return d(e.filter, "Array") || d(e.filter, "String") ? (r = d(e.filter, "String") ? [e.filter] : e.filter, t = function t(e) { - return r.indexOf(e.type) > -1 || r.indexOf(p(e)) > -1; - }) : d(e.filter, "Function") ? t = e.filter : d(e.filter, "Undefined") && (t = function t() { - return !0; - }), function (r, n) { - return ("invalid" !== r.type || e.includeInvalid === !0) && t(r, n); - }; - }function v(e) { - var t;return d(e.subDocPath, "Array") ? t = e.subDocPath : d(e.subDocPath, "String") ? t = j(e.subDocPath) : d(e.subDocPath, "Undefined") && (t = []), t; - }function m(e) { - return q.parse(encodeURI(decodeURI(e))); - }function g(e, t, r) { - c(e, t.slice(0, t.length - 1))[decodeURI(t[t.length - 1])] = r; - }function b(e, t, r, n) { - function o(t, o) { - r.push(o), b(e, t, r, n), r.pop(); - }var i = !0;d(n, "Function") && (i = n(e, t, r)), -1 === e.indexOf(t) && (e.push(t), i !== !1 && (d(t, "Array") ? t.forEach(function (e, t) { - o(e, t.toString()); - }) : d(t, "Object") && Object.keys(t).forEach(function (e) { - o(t[e], e); - }))), e.pop(); - }function E(e, t) { - if (e = d(e, "Undefined") ? {} : n(e), !d(e, "Object")) throw new TypeError("options must be an Object");if (!(d(e.filter, "Undefined") || d(e.filter, "Array") || d(e.filter, "Function") || d(e.filter, "String"))) throw new TypeError("options.filter must be an Array, a Function of a String");if (!d(e.includeInvalid, "Undefined") && !d(e.includeInvalid, "Boolean")) throw new TypeError("options.includeInvalid must be a Boolean");if (!d(e.refPreProcessor, "Undefined") && !d(e.refPreProcessor, "Function")) throw new TypeError("options.refPreProcessor must be a Function");if (!d(e.refPostProcessor, "Undefined") && !d(e.refPostProcessor, "Function")) throw new TypeError("options.refPostProcessor must be a Function");if (!d(e.subDocPath, "Undefined") && !d(e.subDocPath, "Array") && !_(e.subDocPath)) throw new TypeError("options.subDocPath must be an Array of path segments or a valid JSON Pointer");if (e.filter = y(e), e.subDocPath = v(e), !d(t, "Undefined")) try { - c(t, e.subDocPath); - } catch (r) { - throw r.message = r.message.replace("JSON Pointer", "options.subDocPath"), r; - }return e; - }function w() { - k = {}; - }function x(e) { - if (!d(e, "Array")) throw new TypeError("path must be an array");return e.map(function (e) { - return d(e, "String") || (e = JSON.stringify(e)), decodeURI(e.replace(/~1/g, "/").replace(/~0/g, "~")); - }); - }function C(e) { - if (!d(e, "Array")) throw new TypeError("path must be an array");return e.map(function (e) { - return d(e, "String") || (e = JSON.stringify(e)), e.replace(/~/g, "~0").replace(/\//g, "~1"); - }); - }function O(e, t) { - var r = {};if (!d(e, "Array") && !d(e, "Object")) throw new TypeError("obj must be an Array or an Object");return t = E(t, e), b(s(e, t.subDocPath), c(e, t.subDocPath), n(t.subDocPath), function (e, o, i) { - var s, - a = !0;return l(o) && (d(t.refPreProcessor, "Undefined") || (o = t.refPreProcessor(n(o), i)), s = T(o), d(t.refPostProcessor, "Undefined") || (s = t.refPostProcessor(s, i)), t.filter(s, i) && (r[S(i)] = s), f(o).length > 0 && (a = !1)), a; - }), r; - }function P(e, t) { - var r = Promise.resolve();return r = r.then(function () { - if (!d(e, "String")) throw new TypeError("location must be a string");return t = E(t), e = i(t.relativeBase, e), h(e, t); - }).then(function (r) { - var o = n(k[e]), - i = n(t), - s = m(e);return d(o.refs, "Undefined") && (delete i.filter, delete i.subDocPath, i.includeInvalid = !0, k[e].refs = O(r, i)), d(t.filter, "Undefined") || (i.filter = t.filter), d(s.fragment, "Undefined") ? d(s.subDocPath, "Undefined") || (i.subDocPath = t.subDocPath) : i.subDocPath = j(decodeURI(s.fragment)), { refs: O(r, i), value: r }; - }); - }function T(e) { - var t, - r, - n, - o = { def: e };try { - l(e, !0) ? (t = e.$ref, n = $[t], d(n, "Undefined") && (n = $[t] = m(t)), o.uri = t, o.uriDetails = n, d(n.error, "Undefined") ? o.type = p(o) : (o.error = o.uriDetails.error, o.type = "invalid"), r = f(e), r.length > 0 && (o.warning = "Extra JSON Reference properties will be ignored: " + r.join(", "))) : o.type = "invalid"; - } catch (i) { - o.error = i.message, o.type = "invalid"; - }return o; - }function _(e, t) { - var r, - n = !0;try { - if (!d(e, "String")) throw new Error("ptr is not a String");if ("" !== e) { - if (r = e.charAt(0), -1 === ["#", "/"].indexOf(r)) throw new Error("ptr must start with a / or #/");if ("#" === r && "#" !== e && "/" !== e.charAt(1)) throw new Error("ptr must start with a / or #/");if (e.match(H)) throw new Error("ptr has invalid token(s)"); - } - } catch (o) { - if (t === !0) throw o;n = !1; - }return n; - }function A(e, t) { - return l(e, t) && "invalid" !== T(e, t).type; - }function j(e) { - if (!_(e)) throw new Error("ptr must be a JSON Pointer");var t = e.split("/");return t.shift(), x(t); - }function S(e, t) { - if (!d(e, "Array")) throw new Error("path must be an Array");return (t !== !1 ? "#" : "") + (e.length > 0 ? "/" : "") + C(e).join("/"); - }function D(e, t) { - var r = Promise.resolve();return r = r.then(function () { - if (!d(e, "Array") && !d(e, "Object")) throw new TypeError("obj must be an Array or an Object");t = E(t, e), e = n(e); - }).then(function () { - return u(e, t, [], [], { documents: {}, refs: {} }); - }).then(function (t) { - function r(e, t) { - return j(e).length - j(t).length; - }var n = {}, - o = {};return Object.keys(t.refs).sort(r).forEach(function (r) { - var i = t.refs[r];i.indirect || (o[r] = i), delete i.indirect, d(i.error, "Undefined") && "invalid" !== i.type ? (d(i.value, "Undefined") && i.circular && (i.value = i.def), d(i.value, "Undefined") ? n[r] = i : ("#" === r ? e = i.value : g(e, j(r), i.value), delete i.ancestorPtrs)) : delete i.ancestorPtrs; - }), Object.keys(n).forEach(function (r) { - var o = n[r];o.ancestorPtrs.forEach(function (n, i) { - if (d(o.value, "Undefined")) try { - o.value = c(t.documents[n], j(o.uri)), delete o.ancestorPtrs, g(e, j(r), o.value); - } catch (s) { - i === o.ancestorPtrs.length - 1 && (o.error = s.message, o.missing = !0, delete o.ancestorPtrs); - } - }); - }), { refs: o, resolved: e }; - }); - }function R(e, t) { - var r = Promise.resolve();return r = r.then(function () { - if (!d(e, "String")) throw new TypeError("location must be a string");return t = E(t), e = i(t.relativeBase, e), h(e, t); - }).then(function (r) { - var o = n(t), - i = m(e);return d(i.fragment, "Undefined") || (o.subDocPath = j(decodeURI(i.fragment))), o.relativeBase = U.dirname(e), D(r, o).then(function (e) { - return { refs: e.refs, resolved: e.resolved, value: r }; - }); - }); - }var U = e("path"), - I = e("path-loader"), - N = e("querystring"), - F = e("slash"), - q = e("uri-js"), - H = /~(?:[^01]|$)/g, - k = {}, - L = ["relative", "remote"], - M = ["absolute", "uri"], - $ = {};"undefined" == typeof Promise && e("native-promise-only"), t.exports.clearCache = w, t.exports.decodePath = x, t.exports.encodePath = C, t.exports.findRefs = O, t.exports.findRefsAt = P, t.exports.getRefDetails = T, t.exports.isPtr = _, t.exports.isRef = A, t.exports.pathFromPtr = j, t.exports.pathToPtr = S, t.exports.resolveRefs = D, t.exports.resolveRefsAt = R; - }, { "native-promise-only": 3, path: 4, "path-loader": 5, querystring: 11, slash: 13, "uri-js": 23 }], 2: [function (e, t, r) { - function n(e) { - return e ? o(e) : void 0; - }function o(e) { - for (var t in n.prototype) { - e[t] = n.prototype[t]; - }return e; - }t.exports = n, n.prototype.on = n.prototype.addEventListener = function (e, t) { - return this._callbacks = this._callbacks || {}, (this._callbacks["$" + e] = this._callbacks["$" + e] || []).push(t), this; - }, n.prototype.once = function (e, t) { - function r() { - this.off(e, r), t.apply(this, arguments); - }return r.fn = t, this.on(e, r), this; - }, n.prototype.off = n.prototype.removeListener = n.prototype.removeAllListeners = n.prototype.removeEventListener = function (e, t) { - if (this._callbacks = this._callbacks || {}, 0 == arguments.length) return this._callbacks = {}, this;var r = this._callbacks["$" + e];if (!r) return this;if (1 == arguments.length) return delete this._callbacks["$" + e], this;for (var n, o = 0; o < r.length; o++) { - if (n = r[o], n === t || n.fn === t) { - r.splice(o, 1);break; - } - }return this; - }, n.prototype.emit = function (e) { - this._callbacks = this._callbacks || {};var t = [].slice.call(arguments, 1), - r = this._callbacks["$" + e];if (r) { - r = r.slice(0);for (var n = 0, o = r.length; o > n; ++n) { - r[n].apply(this, t); - } - }return this; - }, n.prototype.listeners = function (e) { - return this._callbacks = this._callbacks || {}, this._callbacks["$" + e] || []; - }, n.prototype.hasListeners = function (e) { - return !!this.listeners(e).length; - }; - }, {}], 3: [function (t, r, n) { - (function (t) { - !function (t, n, o) { - n[t] = n[t] || o(), "undefined" != typeof r && r.exports ? r.exports = n[t] : "function" == typeof e && e.amd && e(function () { - return n[t]; - }); - }("Promise", "undefined" != typeof t ? t : this, function () { - "use strict"; - function e(e, t) { - h.add(e, t), p || (p = d(h.drain)); - }function t(e) { - var t, - r = typeof e === "undefined" ? "undefined" : _typeof(e);return null == e || "object" != r && "function" != r || (t = e.then), "function" == typeof t ? t : !1; - }function r() { - for (var e = 0; e < this.chain.length; e++) { - n(this, 1 === this.state ? this.chain[e].success : this.chain[e].failure, this.chain[e]); - }this.chain.length = 0; - }function n(e, r, n) { - var o, i;try { - r === !1 ? n.reject(e.msg) : (o = r === !0 ? e.msg : r.call(void 0, e.msg), o === n.promise ? n.reject(TypeError("Promise-chain cycle")) : (i = t(o)) ? i.call(o, n.resolve, n.reject) : n.resolve(o)); - } catch (s) { - n.reject(s); - } - }function o(n) { - var s, - u = this;if (!u.triggered) { - u.triggered = !0, u.def && (u = u.def);try { - (s = t(n)) ? e(function () { - var e = new a(u);try { - s.call(n, function () { - o.apply(e, arguments); - }, function () { - i.apply(e, arguments); - }); - } catch (t) { - i.call(e, t); - } - }) : (u.msg = n, u.state = 1, u.chain.length > 0 && e(r, u)); - } catch (c) { - i.call(new a(u), c); - } - } - }function i(t) { - var n = this;n.triggered || (n.triggered = !0, n.def && (n = n.def), n.msg = t, n.state = 2, n.chain.length > 0 && e(r, n)); - }function s(e, t, r, n) { - for (var o = 0; o < t.length; o++) { - !function (o) { - e.resolve(t[o]).then(function (e) { - r(o, e); - }, n); - }(o); - } - }function a(e) { - this.def = e, this.triggered = !1; - }function u(e) { - this.promise = e, this.state = 0, this.triggered = !1, this.chain = [], this.msg = void 0; - }function c(t) { - if ("function" != typeof t) throw TypeError("Not a function");if (0 !== this.__NPO__) throw TypeError("Not a promise");this.__NPO__ = 1;var n = new u(this);this.then = function (t, o) { - var i = { success: "function" == typeof t ? t : !0, failure: "function" == typeof o ? o : !1 };return i.promise = new this.constructor(function (e, t) { - if ("function" != typeof e || "function" != typeof t) throw TypeError("Not a function");i.resolve = e, i.reject = t; - }), n.chain.push(i), 0 !== n.state && e(r, n), i.promise; - }, this["catch"] = function (e) { - return this.then(void 0, e); - };try { - t.call(void 0, function (e) { - o.call(n, e); - }, function (e) { - i.call(n, e); - }); - } catch (s) { - i.call(n, s); - } - }var f, - p, - h, - l = Object.prototype.toString, - d = "undefined" != typeof setImmediate ? function (e) { - return setImmediate(e); - } : setTimeout;try { - Object.defineProperty({}, "x", {}), f = function f(e, t, r, n) { - return Object.defineProperty(e, t, { value: r, writable: !0, configurable: n !== !1 }); - }; - } catch (y) { - f = function f(e, t, r) { - return e[t] = r, e; - }; - }h = function () { - function e(e, t) { - this.fn = e, this.self = t, this.next = void 0; - }var t, r, n;return { add: function add(o, i) { - n = new e(o, i), r ? r.next = n : t = n, r = n, n = void 0; - }, drain: function drain() { - var e = t;for (t = r = p = void 0; e;) { - e.fn.call(e.self), e = e.next; - } - } }; - }();var v = f({}, "constructor", c, !1);return c.prototype = v, f(v, "__NPO__", 0, !1), f(c, "resolve", function (e) { - var t = this;return e && "object" == (typeof e === "undefined" ? "undefined" : _typeof(e)) && 1 === e.__NPO__ ? e : new t(function (t, r) { - if ("function" != typeof t || "function" != typeof r) throw TypeError("Not a function");t(e); - }); - }), f(c, "reject", function (e) { - return new this(function (t, r) { - if ("function" != typeof t || "function" != typeof r) throw TypeError("Not a function");r(e); - }); - }), f(c, "all", function (e) { - var t = this;return "[object Array]" != l.call(e) ? t.reject(TypeError("Not an array")) : 0 === e.length ? t.resolve([]) : new t(function (r, n) { - if ("function" != typeof r || "function" != typeof n) throw TypeError("Not a function");var o = e.length, - i = Array(o), - a = 0;s(t, e, function (e, t) { - i[e] = t, ++a === o && r(i); - }, n); - }); - }), f(c, "race", function (e) { - var t = this;return "[object Array]" != l.call(e) ? t.reject(TypeError("Not an array")) : new t(function (r, n) { - if ("function" != typeof r || "function" != typeof n) throw TypeError("Not a function");s(t, e, function (e, t) { - r(t); - }, n); - }); - }), c; - }); - }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {}); - }, {}], 4: [function (e, t, r) { - (function (e) { - function t(e, t) { - for (var r = 0, n = e.length - 1; n >= 0; n--) { - var o = e[n];"." === o ? e.splice(n, 1) : ".." === o ? (e.splice(n, 1), r++) : r && (e.splice(n, 1), r--); - }if (t) for (; r--; r) { - e.unshift(".."); - }return e; - }function n(e, t) { - if (e.filter) return e.filter(t);for (var r = [], n = 0; n < e.length; n++) { - t(e[n], n, e) && r.push(e[n]); - }return r; - }var o = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/, - i = function i(e) { - return o.exec(e).slice(1); - };r.resolve = function () { - for (var r = "", o = !1, i = arguments.length - 1; i >= -1 && !o; i--) { - var s = i >= 0 ? arguments[i] : e.cwd();if ("string" != typeof s) throw new TypeError("Arguments to path.resolve must be strings");s && (r = s + "/" + r, o = "/" === s.charAt(0)); - }return r = t(n(r.split("/"), function (e) { - return !!e; - }), !o).join("/"), (o ? "/" : "") + r || "."; - }, r.normalize = function (e) { - var o = r.isAbsolute(e), - i = "/" === s(e, -1);return e = t(n(e.split("/"), function (e) { - return !!e; - }), !o).join("/"), e || o || (e = "."), e && i && (e += "/"), (o ? "/" : "") + e; - }, r.isAbsolute = function (e) { - return "/" === e.charAt(0); - }, r.join = function () { - var e = Array.prototype.slice.call(arguments, 0);return r.normalize(n(e, function (e, t) { - if ("string" != typeof e) throw new TypeError("Arguments to path.join must be strings");return e; - }).join("/")); - }, r.relative = function (e, t) { - function n(e) { - for (var t = 0; t < e.length && "" === e[t]; t++) {}for (var r = e.length - 1; r >= 0 && "" === e[r]; r--) {}return t > r ? [] : e.slice(t, r - t + 1); - }e = r.resolve(e).substr(1), t = r.resolve(t).substr(1);for (var o = n(e.split("/")), i = n(t.split("/")), s = Math.min(o.length, i.length), a = s, u = 0; s > u; u++) { - if (o[u] !== i[u]) { - a = u;break; - } - }for (var c = [], u = a; u < o.length; u++) { - c.push(".."); - }return c = c.concat(i.slice(a)), c.join("/"); - }, r.sep = "/", r.delimiter = ":", r.dirname = function (e) { - var t = i(e), - r = t[0], - n = t[1];return r || n ? (n && (n = n.substr(0, n.length - 1)), r + n) : "."; - }, r.basename = function (e, t) { - var r = i(e)[2];return t && r.substr(-1 * t.length) === t && (r = r.substr(0, r.length - t.length)), r; - }, r.extname = function (e) { - return i(e)[3]; - };var s = "b" === "ab".substr(-1) ? function (e, t, r) { - return e.substr(t, r); - } : function (e, t, r) { - return 0 > t && (t = e.length + t), e.substr(t, r); - }; - }).call(this, e("_process")); - }, { _process: 8 }], 5: [function (e, t, r) { - "use strict"; - function n(e) { - return "undefined" != typeof e && (e = -1 === e.indexOf("://") ? "" : e.split("://")[0]), e; - }function o(e) { - var t = n(e), - r = i[t];if ("undefined" == typeof r) { - if ("" !== t) throw new Error("Unsupported scheme: " + t);r = s; - }return r; - }var i = { file: e("./lib/loaders/file"), http: e("./lib/loaders/http"), https: e("./lib/loaders/http") }, - s = "object" == (typeof window === "undefined" ? "undefined" : _typeof(window)) || "function" == typeof importScripts ? i.http : i.file;"undefined" == typeof Promise && e("native-promise-only"), t.exports.load = function (e, t) { - var r = Promise.resolve();return "undefined" == typeof t && (t = {}), r = r.then(function () { - if ("undefined" == typeof e) throw new TypeError("location is required");if ("string" != typeof e) throw new TypeError("location must be a string");if ("undefined" != typeof t) { - if ("object" != (typeof t === "undefined" ? "undefined" : _typeof(t))) throw new TypeError("options must be an object");if ("undefined" != typeof t.processContent && "function" != typeof t.processContent) throw new TypeError("options.processContent must be a function"); - } - }), r = r.then(function () { - return new Promise(function (r, n) { - var i = o(e);i.load(e, t || {}, function (e, t) { - e ? n(e) : r(t); - }); - }); - }).then(function (e) { - return t.processContent ? new Promise(function (r, n) { - t.processContent("object" == (typeof e === "undefined" ? "undefined" : _typeof(e)) ? e : { text: e }, function (e, t) { - e ? n(e) : r(t); - }); - }) : "object" == (typeof e === "undefined" ? "undefined" : _typeof(e)) ? e.text : e; - }); - }; - }, { "./lib/loaders/file": 6, "./lib/loaders/http": 7, "native-promise-only": 3 }], 6: [function (e, t, r) { - "use strict"; - var n = new TypeError("The 'file' scheme is not supported in the browser");t.exports.getBase = function () { - throw n; - }, t.exports.load = function () { - var e = arguments[arguments.length - 1];if ("function" != typeof e) throw n;e(n); - }; - }, {}], 7: [function (e, t, r) { - "use strict"; - var n = e("superagent"), - o = ["delete", "get", "head", "patch", "post", "put"];t.exports.load = function (e, t, r) { - function i(e, t) { - e ? r(e) : ("function" == typeof t.buffer && t.buffer(!0), t.end(function (e, t) { - e ? r(e) : r(void 0, t); - })); - }var s, - a, - u = t.method ? t.method.toLowerCase() : "get";if ("undefined" != typeof t.method ? "string" != typeof t.method ? s = new TypeError("options.method must be a string") : -1 === o.indexOf(t.method) && (s = new TypeError("options.method must be one of the following: " + o.slice(0, o.length - 1).join(", ") + " or " + o[o.length - 1])) : "undefined" != typeof t.prepareRequest && "function" != typeof t.prepareRequest && (s = new TypeError("options.prepareRequest must be a function")), s) r(s);else if (a = n["delete" === u ? "del" : u](e), t.prepareRequest) try { - t.prepareRequest(a, i); - } catch (c) { - r(c); - } else i(void 0, a); - }; - }, { superagent: 14 }], 8: [function (e, t, r) { - function n() { - f = !1, a.length ? c = a.concat(c) : p = -1, c.length && o(); - }function o() { - if (!f) { - var e = setTimeout(n);f = !0;for (var t = c.length; t;) { - for (a = c, c = []; ++p < t;) { - a && a[p].run(); - }p = -1, t = c.length; - }a = null, f = !1, clearTimeout(e); - } - }function i(e, t) { - this.fun = e, this.array = t; - }function s() {}var a, - u = t.exports = {}, - c = [], - f = !1, - p = -1;u.nextTick = function (e) { - var t = new Array(arguments.length - 1);if (arguments.length > 1) for (var r = 1; r < arguments.length; r++) { - t[r - 1] = arguments[r]; - }c.push(new i(e, t)), 1 !== c.length || f || setTimeout(o, 0); - }, i.prototype.run = function () { - this.fun.apply(null, this.array); - }, u.title = "browser", u.browser = !0, u.env = {}, u.argv = [], u.version = "", u.versions = {}, u.on = s, u.addListener = s, u.once = s, u.off = s, u.removeListener = s, u.removeAllListeners = s, u.emit = s, u.binding = function (e) { - throw new Error("process.binding is not supported"); - }, u.cwd = function () { - return "/"; - }, u.chdir = function (e) { - throw new Error("process.chdir is not supported"); - }, u.umask = function () { - return 0; - }; - }, {}], 9: [function (e, t, r) { - "use strict"; - function n(e, t) { - return Object.prototype.hasOwnProperty.call(e, t); - }t.exports = function (e, t, r, i) { - t = t || "&", r = r || "=";var s = {};if ("string" != typeof e || 0 === e.length) return s;var a = /\+/g;e = e.split(t);var u = 1e3;i && "number" == typeof i.maxKeys && (u = i.maxKeys);var c = e.length;u > 0 && c > u && (c = u);for (var f = 0; c > f; ++f) { - var p, - h, - l, - d, - y = e[f].replace(a, "%20"), - v = y.indexOf(r);v >= 0 ? (p = y.substr(0, v), h = y.substr(v + 1)) : (p = y, h = ""), l = decodeURIComponent(p), d = decodeURIComponent(h), n(s, l) ? o(s[l]) ? s[l].push(d) : s[l] = [s[l], d] : s[l] = d; - }return s; - };var o = Array.isArray || function (e) { - return "[object Array]" === Object.prototype.toString.call(e); - }; - }, {}], 10: [function (e, t, r) { - "use strict"; - function n(e, t) { - if (e.map) return e.map(t);for (var r = [], n = 0; n < e.length; n++) { - r.push(t(e[n], n)); - }return r; - }var o = function o(e) { - switch (typeof e === "undefined" ? "undefined" : _typeof(e)) {case "string": - return e;case "boolean": - return e ? "true" : "false";case "number": - return isFinite(e) ? e : "";default: - return "";} - };t.exports = function (e, t, r, a) { - return t = t || "&", r = r || "=", null === e && (e = void 0), "object" == (typeof e === "undefined" ? "undefined" : _typeof(e)) ? n(s(e), function (s) { - var a = encodeURIComponent(o(s)) + r;return i(e[s]) ? n(e[s], function (e) { - return a + encodeURIComponent(o(e)); - }).join(t) : a + encodeURIComponent(o(e[s])); - }).join(t) : a ? encodeURIComponent(o(a)) + r + encodeURIComponent(o(e)) : ""; - };var i = Array.isArray || function (e) { - return "[object Array]" === Object.prototype.toString.call(e); - }, - s = Object.keys || function (e) { - var t = [];for (var r in e) { - Object.prototype.hasOwnProperty.call(e, r) && t.push(r); - }return t; - }; - }, {}], 11: [function (e, t, r) { - "use strict"; - r.decode = r.parse = e("./decode"), r.encode = r.stringify = e("./encode"); - }, { "./decode": 9, "./encode": 10 }], 12: [function (e, t, r) { - t.exports = function (e, t, r) { - for (var n = 0, o = e.length, i = 3 == arguments.length ? r : e[n++]; o > n;) { - i = t.call(null, i, e[n], ++n, e); - }return i; - }; - }, {}], 13: [function (e, t, r) { - "use strict"; - t.exports = function (e) { - var t = /^\\\\\?\\/.test(e), - r = /[^\x00-\x80]+/.test(e);return t || r ? e : e.replace(/\\/g, "/"); - }; - }, {}], 14: [function (e, t, r) { - function n() {}function o(e) { - var t = {}.toString.call(e);switch (t) {case "[object File]":case "[object Blob]":case "[object FormData]": - return !0;default: - return !1;} - }function i(e) { - if (!b(e)) return e;var t = [];for (var r in e) { - null != e[r] && s(t, r, e[r]); - }return t.join("&"); - }function s(e, t, r) { - return Array.isArray(r) ? r.forEach(function (r) { - s(e, t, r); - }) : void e.push(encodeURIComponent(t) + "=" + encodeURIComponent(r)); - }function a(e) { - for (var t, r, n = {}, o = e.split("&"), i = 0, s = o.length; s > i; ++i) { - r = o[i], t = r.split("="), n[decodeURIComponent(t[0])] = decodeURIComponent(t[1]); - }return n; - }function u(e) { - var t, - r, - n, - o, - i = e.split(/\r?\n/), - s = {};i.pop();for (var a = 0, u = i.length; u > a; ++a) { - r = i[a], t = r.indexOf(":"), n = r.slice(0, t).toLowerCase(), o = w(r.slice(t + 1)), s[n] = o; - }return s; - }function c(e) { - return (/[\/+]json\b/.test(e) - ); - }function f(e) { - return e.split(/ *; */).shift(); - }function p(e) { - return m(e.split(/ *; */), function (e, t) { - var r = t.split(/ *= */), - n = r.shift(), - o = r.shift();return n && o && (e[n] = o), e; - }, {}); - }function h(e, t) { - t = t || {}, this.req = e, this.xhr = this.req.xhr, this.text = "HEAD" != this.req.method && ("" === this.xhr.responseType || "text" === this.xhr.responseType) || "undefined" == typeof this.xhr.responseType ? this.xhr.responseText : null, this.statusText = this.req.xhr.statusText, this.setStatusProperties(this.xhr.status), this.header = this.headers = u(this.xhr.getAllResponseHeaders()), this.header["content-type"] = this.xhr.getResponseHeader("content-type"), this.setHeaderProperties(this.header), this.body = "HEAD" != this.req.method ? this.parseBody(this.text ? this.text : this.xhr.response) : null; - }function l(e, t) { - var r = this;this._query = this._query || [], this.method = e, this.url = t, this.header = {}, this._header = {}, this.on("end", function () { - var e = null, - t = null;try { - t = new h(r); - } catch (n) { - return e = new Error("Parser is unable to parse the response"), e.parse = !0, e.original = n, e.rawResponse = r.xhr && r.xhr.responseText ? r.xhr.responseText : null, e.statusCode = r.xhr && r.xhr.status ? r.xhr.status : null, r.callback(e); - }if (r.emit("response", t), e) return r.callback(e, t);if (t.status >= 200 && t.status < 300) return r.callback(e, t);var o = new Error(t.statusText || "Unsuccessful HTTP response");o.original = e, o.response = t, o.status = t.status, r.callback(o, t); - }); - }function d(e, t) { - var r = E("DELETE", e);return t && r.end(t), r; - }var y, - v = e("emitter"), - m = e("reduce"), - g = e("./request-base"), - b = e("./is-object");y = "undefined" != typeof window ? window : "undefined" != typeof self ? self : this;var E = t.exports = e("./request").bind(null, l);E.getXHR = function () { - if (!(!y.XMLHttpRequest || y.location && "file:" == y.location.protocol && y.ActiveXObject)) return new XMLHttpRequest();try { - return new ActiveXObject("Microsoft.XMLHTTP"); - } catch (e) {}try { - return new ActiveXObject("Msxml2.XMLHTTP.6.0"); - } catch (e) {}try { - return new ActiveXObject("Msxml2.XMLHTTP.3.0"); - } catch (e) {}try { - return new ActiveXObject("Msxml2.XMLHTTP"); - } catch (e) {}return !1; - };var w = "".trim ? function (e) { - return e.trim(); - } : function (e) { - return e.replace(/(^\s*|\s*$)/g, ""); - };E.serializeObject = i, E.parseString = a, E.types = { html: "text/html", json: "application/json", xml: "application/xml", urlencoded: "application/x-www-form-urlencoded", form: "application/x-www-form-urlencoded", "form-data": "application/x-www-form-urlencoded" }, E.serialize = { "application/x-www-form-urlencoded": i, "application/json": JSON.stringify }, E.parse = { "application/x-www-form-urlencoded": a, "application/json": JSON.parse }, h.prototype.get = function (e) { - return this.header[e.toLowerCase()]; - }, h.prototype.setHeaderProperties = function (e) { - var t = this.header["content-type"] || "";this.type = f(t);var r = p(t);for (var n in r) { - this[n] = r[n]; - } - }, h.prototype.parseBody = function (e) { - var t = E.parse[this.type];return !t && c(this.type) && (t = E.parse["application/json"]), t && e && (e.length || e instanceof Object) ? t(e) : null; - }, h.prototype.setStatusProperties = function (e) { - 1223 === e && (e = 204);var t = e / 100 | 0;this.status = this.statusCode = e, this.statusType = t, this.info = 1 == t, this.ok = 2 == t, this.clientError = 4 == t, this.serverError = 5 == t, this.error = 4 == t || 5 == t ? this.toError() : !1, this.accepted = 202 == e, this.noContent = 204 == e, this.badRequest = 400 == e, this.unauthorized = 401 == e, this.notAcceptable = 406 == e, this.notFound = 404 == e, this.forbidden = 403 == e; - }, h.prototype.toError = function () { - var e = this.req, - t = e.method, - r = e.url, - n = "cannot " + t + " " + r + " (" + this.status + ")", - o = new Error(n);return o.status = this.status, o.method = t, o.url = r, o; - }, E.Response = h, v(l.prototype);for (var x in g) { - l.prototype[x] = g[x]; - }l.prototype.abort = function () { - return this.aborted ? void 0 : (this.aborted = !0, this.xhr.abort(), this.clearTimeout(), this.emit("abort"), this); - }, l.prototype.type = function (e) { - return this.set("Content-Type", E.types[e] || e), this; - }, l.prototype.responseType = function (e) { - return this._responseType = e, this; - }, l.prototype.accept = function (e) { - return this.set("Accept", E.types[e] || e), this; - }, l.prototype.auth = function (e, t, r) { - switch (r || (r = { type: "basic" }), r.type) {case "basic": - var n = btoa(e + ":" + t);this.set("Authorization", "Basic " + n);break;case "auto": - this.username = e, this.password = t;}return this; - }, l.prototype.query = function (e) { - return "string" != typeof e && (e = i(e)), e && this._query.push(e), this; - }, l.prototype.attach = function (e, t, r) { - return this._getFormData().append(e, t, r || t.name), this; - }, l.prototype._getFormData = function () { - return this._formData || (this._formData = new y.FormData()), this._formData; - }, l.prototype.send = function (e) { - var t = b(e), - r = this._header["content-type"];if (t && b(this._data)) for (var n in e) { - this._data[n] = e[n]; - } else "string" == typeof e ? (r || this.type("form"), r = this._header["content-type"], "application/x-www-form-urlencoded" == r ? this._data = this._data ? this._data + "&" + e : e : this._data = (this._data || "") + e) : this._data = e;return !t || o(e) ? this : (r || this.type("json"), this); - }, h.prototype.parse = function (e) { - return y.console && console.warn("Client-side parse() method has been renamed to serialize(). This method is not compatible with superagent v2.0"), this.serialize(e), this; - }, h.prototype.serialize = function (e) { - return this._parser = e, this; - }, l.prototype.callback = function (e, t) { - var r = this._callback;this.clearTimeout(), r(e, t); - }, l.prototype.crossDomainError = function () { - var e = new Error("Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.");e.crossDomain = !0, e.status = this.status, e.method = this.method, e.url = this.url, this.callback(e); - }, l.prototype.timeoutError = function () { - var e = this._timeout, - t = new Error("timeout of " + e + "ms exceeded");t.timeout = e, this.callback(t); - }, l.prototype.withCredentials = function () { - return this._withCredentials = !0, this; - }, l.prototype.end = function (e) { - var t = this, - r = this.xhr = E.getXHR(), - i = this._query.join("&"), - s = this._timeout, - a = this._formData || this._data;this._callback = e || n, r.onreadystatechange = function () { - if (4 == r.readyState) { - var e;try { - e = r.status; - } catch (n) { - e = 0; - }if (0 == e) { - if (t.timedout) return t.timeoutError();if (t.aborted) return;return t.crossDomainError(); - }t.emit("end"); - } - };var u = function u(e) { - e.total > 0 && (e.percent = e.loaded / e.total * 100), e.direction = "download", t.emit("progress", e); - };this.hasListeners("progress") && (r.onprogress = u);try { - r.upload && this.hasListeners("progress") && (r.upload.onprogress = u); - } catch (f) {}if (s && !this._timer && (this._timer = setTimeout(function () { - t.timedout = !0, t.abort(); - }, s)), i && (i = E.serializeObject(i), this.url += ~this.url.indexOf("?") ? "&" + i : "?" + i), this.username && this.password ? r.open(this.method, this.url, !0, this.username, this.password) : r.open(this.method, this.url, !0), this._withCredentials && (r.withCredentials = !0), "GET" != this.method && "HEAD" != this.method && "string" != typeof a && !o(a)) { - var p = this._header["content-type"], - h = this._parser || E.serialize[p ? p.split(";")[0] : ""];!h && c(p) && (h = E.serialize["application/json"]), h && (a = h(a)); - }for (var l in this.header) { - null != this.header[l] && r.setRequestHeader(l, this.header[l]); - }return this._responseType && (r.responseType = this._responseType), this.emit("request", this), r.send("undefined" != typeof a ? a : null), this; - }, E.Request = l, E.get = function (e, t, r) { - var n = E("GET", e);return "function" == typeof t && (r = t, t = null), t && n.query(t), r && n.end(r), n; - }, E.head = function (e, t, r) { - var n = E("HEAD", e);return "function" == typeof t && (r = t, t = null), t && n.send(t), r && n.end(r), n; - }, E.del = d, E["delete"] = d, E.patch = function (e, t, r) { - var n = E("PATCH", e);return "function" == typeof t && (r = t, t = null), t && n.send(t), r && n.end(r), n; - }, E.post = function (e, t, r) { - var n = E("POST", e);return "function" == typeof t && (r = t, t = null), t && n.send(t), r && n.end(r), n; - }, E.put = function (e, t, r) { - var n = E("PUT", e);return "function" == typeof t && (r = t, t = null), t && n.send(t), r && n.end(r), n; - }; - }, { "./is-object": 15, "./request": 17, "./request-base": 16, emitter: 2, reduce: 12 }], 15: [function (e, t, r) { - function n(e) { - return null != e && "object" == (typeof e === "undefined" ? "undefined" : _typeof(e)); - }t.exports = n; - }, {}], 16: [function (e, t, r) { - var n = e("./is-object");r.clearTimeout = function () { - return this._timeout = 0, clearTimeout(this._timer), this; - }, r.parse = function (e) { - return this._parser = e, this; - }, r.timeout = function (e) { - return this._timeout = e, this; - }, r.then = function (e, t) { - return this.end(function (r, n) { - r ? t(r) : e(n); - }); - }, r.use = function (e) { - return e(this), this; - }, r.get = function (e) { - return this._header[e.toLowerCase()]; - }, r.getHeader = r.get, r.set = function (e, t) { - if (n(e)) { - for (var r in e) { - this.set(r, e[r]); - }return this; - }return this._header[e.toLowerCase()] = t, this.header[e] = t, this; - }, r.unset = function (e) { - return delete this._header[e.toLowerCase()], delete this.header[e], this; - }, r.field = function (e, t) { - return this._getFormData().append(e, t), this; - }; - }, { "./is-object": 15 }], 17: [function (e, t, r) { - function n(e, t, r) { - return "function" == typeof r ? new e("GET", t).end(r) : 2 == arguments.length ? new e("GET", t) : new e(t, r); - }t.exports = n; - }, {}], 18: [function (e, t, r) { - var n = function () { - function e(e) { - throw new RangeError(P[e]); - }function t(e, t) { - for (var r = e.length, n = []; r--;) { - n[r] = t(e[r]); - }return n; - }function r(e, r) { - var n = e.split("@"), - o = "";n.length > 1 && (o = n[0] + "@", e = n[1]), e = e.replace(O, ".");var i = e.split("."), - s = t(i, r).join(".");return o + s; - }function n(e) { - for (var t, r, n = [], o = 0, i = e.length; i > o;) { - t = e.charCodeAt(o++), t >= 55296 && 56319 >= t && i > o ? (r = e.charCodeAt(o++), 56320 == (64512 & r) ? n.push(((1023 & t) << 10) + (1023 & r) + 65536) : (n.push(t), o--)) : n.push(t); - }return n; - }function o(e) { - return t(e, function (e) { - var t = "";return e > 65535 && (e -= 65536, t += A(e >>> 10 & 1023 | 55296), e = 56320 | 1023 & e), t += A(e); - }).join(""); - }function i(e) { - return 10 > e - 48 ? e - 22 : 26 > e - 65 ? e - 65 : 26 > e - 97 ? e - 97 : d; - }function s(e, t) { - return e + 22 + 75 * (26 > e) - ((0 != t) << 5); - }function a(e, t, r) { - var n = 0;for (e = r ? _(e / g) : e >> 1, e += _(e / t); e > T * v >> 1; n += d) { - e = _(e / T); - }return _(n + (T + 1) * e / (e + m)); - }function u(t) { - var r, - n, - s, - u, - c, - f, - p, - h, - m, - g, - x = [], - C = t.length, - O = 0, - P = E, - T = b;for (n = t.lastIndexOf(w), 0 > n && (n = 0), s = 0; n > s; ++s) { - t.charCodeAt(s) >= 128 && e("not-basic"), x.push(t.charCodeAt(s)); - }for (u = n > 0 ? n + 1 : 0; C > u;) { - for (c = O, f = 1, p = d; u >= C && e("invalid-input"), h = i(t.charCodeAt(u++)), (h >= d || h > _((l - O) / f)) && e("overflow"), O += h * f, m = T >= p ? y : p >= T + v ? v : p - T, !(m > h); p += d) { - g = d - m, f > _(l / g) && e("overflow"), f *= g; - }r = x.length + 1, T = a(O - c, r, 0 == c), _(O / r) > l - P && e("overflow"), P += _(O / r), O %= r, x.splice(O++, 0, P); - }return o(x); - }function c(t) { - var r, - o, - i, - u, - c, - f, - p, - h, - m, - g, - x, - C, - O, - P, - T, - j = [];for (t = n(t), C = t.length, r = E, o = 0, c = b, f = 0; C > f; ++f) { - x = t[f], 128 > x && j.push(A(x)); - }for (i = u = j.length, u && j.push(w); C > i;) { - for (p = l, f = 0; C > f; ++f) { - x = t[f], x >= r && p > x && (p = x); - }for (O = i + 1, p - r > _((l - o) / O) && e("overflow"), o += (p - r) * O, r = p, f = 0; C > f; ++f) { - if (x = t[f], r > x && ++o > l && e("overflow"), x == r) { - for (h = o, m = d; g = c >= m ? y : m >= c + v ? v : m - c, !(g > h); m += d) { - T = h - g, P = d - g, j.push(A(s(g + T % P, 0))), h = _(T / P); - }j.push(A(s(h, 0))), c = a(o, O, i == u), o = 0, ++i; - } - }++o, ++r; - }return j.join(""); - }function f(e) { - return r(e, function (e) { - return x.test(e) ? u(e.slice(4).toLowerCase()) : e; - }); - }function p(e) { - return r(e, function (e) { - return C.test(e) ? "xn--" + c(e) : e; - }); - }var h, - l = 2147483647, - d = 36, - y = 1, - v = 26, - m = 38, - g = 700, - b = 72, - E = 128, - w = "-", - x = /^xn--/, - C = /[^\x20-\x7E]/, - O = /[\x2E\u3002\uFF0E\uFF61]/g, - P = { overflow: "Overflow: input needs wider integers to process", "not-basic": "Illegal input >= 0x80 (not a basic code point)", "invalid-input": "Invalid input" }, - T = d - y, - _ = Math.floor, - A = String.fromCharCode;return h = { version: "1.3.2", ucs2: { decode: n, encode: o }, decode: u, encode: c, toASCII: p, toUnicode: f }; - }();"undefined" == typeof COMPILED && "undefined" != typeof t && (t.exports = n); - }, {}], 19: [function (e, t, r) { - e("./schemes/http"), e("./schemes/urn"), e("./schemes/mailto"); - }, { "./schemes/http": 20, "./schemes/mailto": 21, "./schemes/urn": 22 }], 20: [function (e, t, r) { - if ("undefined" == typeof COMPILED && "undefined" == typeof n && "function" == typeof e) var n = e("../uri");n.SCHEMES.http = n.SCHEMES.https = { domainHost: !0, parse: function parse(e, t) { - return e.host || (e.error = e.error || "HTTP URIs must have a host."), e; - }, serialize: function serialize(e, t) { - return e.port !== ("https" !== String(e.scheme).toLowerCase() ? 80 : 443) && "" !== e.port || (e.port = void 0), e.path || (e.path = "/"), e; - } }; - }, { "../uri": 23 }], 21: [function (e, t, r) { - if ("undefined" == typeof COMPILED && "undefined" == typeof n && "function" == typeof e) var n = e("../uri"), - o = e("../punycode");!function () { - function e() { - for (var e = [], t = 0; t < arguments.length; t++) { - e[t - 0] = arguments[t]; - }if (e.length > 1) { - e[0] = e[0].slice(0, -1);for (var r = e.length - 1, n = 1; r > n; ++n) { - e[n] = e[n].slice(1, -1); - }return e[r] = e[r].slice(1), e.join(""); - }return e[0]; - }function t(e) { - return "(?:" + e + ")"; - }function r(e) { - return e.toUpperCase(); - }function i(e) { - var t = n.pctDecChars(e);return t.match(D) ? t : e; - }function s(e) { - return void 0 !== e && null !== e ? e instanceof Array && !e.callee ? e : "number" != typeof e.length || e.split || e.setInterval || e.call ? [e] : Array.prototype.slice.call(e) : []; - }var a = {}, - u = n.IRI_SUPPORT, - c = "[A-Za-z0-9\\-\\.\\_\\~" + (u ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]", - f = "[0-9A-Fa-f]", - p = t(t("%[EFef]" + f + "%" + f + f + "%" + f + f) + "|" + t("%[89A-Fa-f]" + f + "%" + f + f) + "|" + t("%" + f + f)), - h = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]", - l = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]", - d = e(l, '[\\"\\\\]'), - y = t(h + "+" + t("\\." + h + "+") + "*"), - v = t("\\\\" + d), - m = t(l + "|" + v), - g = t('\\"' + m + '*\\"'), - b = "[\\x21-\\x5A\\x5E-\\x7E]", - E = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]", - w = t(c + "|" + p + "|" + E), - x = t(y + "|\\[" + b + "*\\]"), - C = t(y + "|" + g), - O = t(C + "\\@" + x), - P = t(O + t("\\," + O) + "*"), - T = t(w + "*"), - _ = T, - A = t(T + "\\=" + _), - j = t(A + t("\\&" + A) + "*"), - S = t("\\?" + j), - D = (n.VALIDATE_SUPPORT && new RegExp("^mailto\\:" + P + "?" + S + "?$"), new RegExp(c, "g")), - R = new RegExp(p, "g"), - U = new RegExp(e("[^]", h, "[\\.]", '[\\"]', d), "g"), - I = new RegExp(e("[^]", h, "[\\.]", "[\\[]", b, "[\\]]"), "g"), - N = new RegExp(e("[^]", c, E), "g"), - F = N, - q = n.VALIDATE_SUPPORT && new RegExp("^" + P + "$"), - H = n.VALIDATE_SUPPORT && new RegExp("^" + j + "$");n.SCHEMES.mailto = { parse: function parse(e, t) { - n.VALIDATE_SUPPORT && !e.error && (e.path && !q.test(e.path) ? e.error = "Email address is not valid" : e.query && !H.test(e.query) && (e.error = "Header fields are invalid"));var r = e.to = e.path ? e.path.split(",") : [];if (e.path = void 0, e.query) { - for (var i = !1, s = {}, a = e.query.split("&"), u = 0, c = a.length; c > u; ++u) { - var f = a[u].split("=");switch (f[0]) {case "to": - for (var p = f[1].split(","), h = 0, l = p.length; l > h; ++h) { - r.push(p[h]); - }break;case "subject": - e.subject = n.unescapeComponent(f[1], t);break;case "body": - e.body = n.unescapeComponent(f[1], t);break;default: - i = !0, s[n.unescapeComponent(f[0], t)] = n.unescapeComponent(f[1], t);} - }i && (e.headers = s); - }e.query = void 0;for (var u = 0, c = r.length; c > u; ++u) { - var d = r[u].split("@");if (d[0] = n.unescapeComponent(d[0]), "undefined" == typeof o || t.unicodeSupport) d[1] = n.unescapeComponent(d[1], t).toLowerCase();else try { - d[1] = o.toASCII(n.unescapeComponent(d[1], t).toLowerCase()); - } catch (y) { - e.error = e.error || "Email address's domain name can not be converted to ASCII via punycode: " + y; - }r[u] = d.join("@"); - }return e; - }, serialize: function serialize(e, t) { - var u = s(e.to);if (u) { - for (var c = 0, f = u.length; f > c; ++c) { - var p = String(u[c]), - h = p.lastIndexOf("@"), - l = p.slice(0, h), - d = p.slice(h + 1);if (l = l.replace(R, i).replace(R, r).replace(U, n.pctEncChar), "undefined" != typeof o) try { - d = t.iri ? o.toUnicode(d) : o.toASCII(n.unescapeComponent(d, t).toLowerCase()); - } catch (y) { - e.error = e.error || "Email address's domain name can not be converted to " + (t.iri ? "Unicode" : "ASCII") + " via punycode: " + y; - } else d = d.replace(R, i).toLowerCase().replace(R, r).replace(I, n.pctEncChar);u[c] = l + "@" + d; - }e.path = u.join(","); - }var v = e.headers = e.headers || {};e.subject && (v.subject = e.subject), e.body && (v.body = e.body);var m = [];for (var g in v) { - v[g] !== a[g] && m.push(g.replace(R, i).replace(R, r).replace(N, n.pctEncChar) + "=" + v[g].replace(R, i).replace(R, r).replace(F, n.pctEncChar)); - }return m.length && (e.query = m.join("&")), e; - } }; - }(); - }, { "../punycode": 18, "../uri": 23 }], 22: [function (e, t, r) { - if ("undefined" == typeof COMPILED && "undefined" == typeof n && "function" == typeof e) var n = e("../uri");!function () { - var e = n.pctEncChar, - t = "(?:[0-9A-Za-z][0-9A-Za-z\\-]{1,31})", - r = "(?:\\%[0-9A-Fa-f]{2})", - o = "[0-9A-Za-z\\(\\)\\+\\,\\-\\.\\:\\=\\@\\;\\$\\_\\!\\*\\'\\/\\?\\#]", - i = "(?:(?:" + r + "|" + o + ")+)", - s = new RegExp("^urn\\:(" + t + ")$"), - a = new RegExp("^(" + t + ")\\:(" + i + ")$"), - u = /^([^\:]+)\:(.*)/, - c = /[\x00-\x20\\\"\&\<\>\[\]\^\`\{\|\}\~\x7F-\xFF]/g, - f = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/;n.SCHEMES.urn = { parse: function parse(e, t) { - var r, - o, - i = e.path.match(a);return i || (t.tolerant || (e.error = e.error || "URN is not strictly valid."), i = e.path.match(u)), i ? (r = "urn:" + i[1].toLowerCase(), o = n.SCHEMES[r], o || (o = n.SCHEMES[r] = { parse: function parse(e, t) { - return e; - }, serialize: n.SCHEMES.urn.serialize }), e.scheme = r, e.path = i[2], e = o.parse(e, t)) : e.error = e.error || "URN can not be parsed.", e; - }, serialize: function serialize(t, r) { - var n, - o = t.scheme || r.scheme;if (o && "urn" !== o) { - var n = o.match(s);n || (n = ["urn:" + o, o]), t.scheme = "urn", t.path = n[1] + ":" + (t.path ? t.path.replace(c, e) : ""); - }return t; - } }, n.SCHEMES["urn:uuid"] = { parse: function parse(e, t) { - return t.tolerant || e.path && e.path.match(f) || (e.error = e.error || "UUID is not valid."), e; - }, serialize: function serialize(e, t) { - return t.tolerant || e.path && e.path.match(f) ? e.path = (e.path || "").toLowerCase() : e.scheme = void 0, n.SCHEMES.urn.serialize(e, t); - } }; - }(); - }, { "../uri": 23 }], 23: [function (e, t, r) { - var n = !1, - o = !0, - i = !0, - s = function () { - function e() { - for (var e = [], t = 0; t < arguments.length; t++) { - e[t - 0] = arguments[t]; - }if (e.length > 1) { - e[0] = e[0].slice(0, -1);for (var r = e.length - 1, n = 1; r > n; ++n) { - e[n] = e[n].slice(1, -1); - }return e[r] = e[r].slice(1), e.join(""); - }return e[0]; - }function t(e) { - return "(?:" + e + ")"; - }function r(r) { - var n = "[A-Za-z]", - o = "[0-9]", - s = e(o, "[A-Fa-f]"), - a = t(t("%[EFef]" + s + "%" + s + s + "%" + s + s) + "|" + t("%[89A-Fa-f]" + s + "%" + s + s) + "|" + t("%" + s + s)), - u = "[\\:\\/\\?\\#\\[\\]\\@]", - c = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", - f = e(u, c), - p = r ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", - h = r ? "[\\uE000-\\uF8FF]" : "[]", - l = e(n, o, "[\\-\\.\\_\\~]", p), - d = t(n + e(n, o, "[\\+\\-\\.]") + "*"), - y = t(t(a + "|" + e(l, c, "[\\:]")) + "*"), - v = t(t("25[0-5]") + "|" + t("2[0-4]" + o) + "|" + t("1" + o + o) + "|" + t("[1-9]" + o) + "|" + o), - m = t(v + "\\." + v + "\\." + v + "\\." + v), - g = t(s + "{1,4}"), - b = (t(t(g + "\\:" + g) + "|" + m), t(e(l, c, "[\\:]") + "+")), - E = t("v" + s + "+\\." + e(l, c, "[\\:]") + "+"), - w = t("\\[" + t(b + "|" + E) + "\\]"), - x = t(t(a + "|" + e(l, c)) + "*"), - C = t(w + "|" + m + "(?!" + x + ")|" + x), - O = t(o + "*"), - P = t(t(y + "@") + "?" + C + t("\\:" + O) + "?"), - T = t(a + "|" + e(l, c, "[\\:\\@]")), - _ = t(T + "*"), - A = t(T + "+"), - j = t(t(a + "|" + e(l, c, "[\\@]")) + "+"), - S = t(t("\\/" + _) + "*"), - D = t("\\/" + t(A + S) + "?"), - R = t(j + S), - U = t(A + S), - I = "(?!" + T + ")", - N = (t(S + "|" + D + "|" + R + "|" + U + "|" + I), t(t(T + "|" + e("[\\/\\?]", h)) + "*")), - F = t(t(T + "|[\\/\\?]") + "*"), - q = t(t("\\/\\/" + P + S) + "|" + D + "|" + U + "|" + I), - H = t(d + "\\:" + q + t("\\?" + N) + "?" + t("\\#" + F) + "?"), - k = t(t("\\/\\/" + P + S) + "|" + D + "|" + R + "|" + I), - L = t(k + t("\\?" + N) + "?" + t("\\#" + F) + "?"), - M = (t(H + "|" + L), t(d + "\\:" + q + t("\\?" + N) + "?"), "^(" + d + ")\\:" + t(t("\\/\\/(" + t("(" + y + ")@") + "?(" + C + ")" + t("\\:(" + O + ")") + "?)") + "?(" + S + "|" + D + "|" + U + "|" + I + ")") + t("\\?(" + N + ")") + "?" + t("\\#(" + F + ")") + "?$"), - $ = "^(){0}" + t(t("\\/\\/(" + t("(" + y + ")@") + "?(" + C + ")" + t("\\:(" + O + ")") + "?)") + "?(" + S + "|" + D + "|" + R + "|" + I + ")") + t("\\?(" + N + ")") + "?" + t("\\#(" + F + ")") + "?$";"^(" + d + ")\\:" + t(t("\\/\\/(" + t("(" + y + ")@") + "?(" + C + ")" + t("\\:(" + O + ")") + "?)") + "?(" + S + "|" + D + "|" + U + "|" + I + ")") + t("\\?(" + N + ")") + "?$", "^" + t("\\#(" + F + ")") + "?$", "^" + t("(" + y + ")@") + "?(" + C + ")" + t("\\:(" + O + ")") + "?$";return { URI_REF: i && new RegExp("(" + M + ")|(" + $ + ")"), NOT_SCHEME: new RegExp(e("[^]", n, o, "[\\+\\-\\.]"), "g"), NOT_USERINFO: new RegExp(e("[^\\%\\:]", l, c), "g"), NOT_HOST: new RegExp(e("[^\\%]", l, c), "g"), NOT_PATH: new RegExp(e("[^\\%\\/\\:\\@]", l, c), "g"), NOT_PATH_NOSCHEME: new RegExp(e("[^\\%\\/\\@]", l, c), "g"), NOT_QUERY: new RegExp(e("[^\\%]", l, c, "[\\:\\@\\/\\?]", h), "g"), NOT_FRAGMENT: new RegExp(e("[^\\%]", l, c, "[\\:\\@\\/\\?]"), "g"), ESCAPE: new RegExp(e("[^]", l, c), "g"), UNRESERVED: new RegExp(l, "g"), OTHER_CHARS: new RegExp(e("[^\\%]", l, f), "g"), PCT_ENCODED: new RegExp(a, "g") }; - }function n(e) { - var t, - r = e.charCodeAt(0);return t = 16 > r ? "%0" + r.toString(16).toUpperCase() : 128 > r ? "%" + r.toString(16).toUpperCase() : 2048 > r ? "%" + (r >> 6 | 192).toString(16).toUpperCase() + "%" + (63 & r | 128).toString(16).toUpperCase() : "%" + (r >> 12 | 224).toString(16).toUpperCase() + "%" + (r >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (63 & r | 128).toString(16).toUpperCase(); - }function s(e) { - for (var t, r, n, o = "", i = 0, s = e.length; s > i;) { - t = parseInt(e.substr(i + 1, 2), 16), 128 > t ? (o += String.fromCharCode(t), i += 3) : t >= 194 && 224 > t ? (s - i >= 6 ? (r = parseInt(e.substr(i + 4, 2), 16), o += String.fromCharCode((31 & t) << 6 | 63 & r)) : o += e.substr(i, 6), i += 6) : t >= 224 ? (s - i >= 9 ? (r = parseInt(e.substr(i + 4, 2), 16), n = parseInt(e.substr(i + 7, 2), 16), o += String.fromCharCode((15 & t) << 12 | (63 & r) << 6 | 63 & n)) : o += e.substr(i, 9), i += 9) : (o += e.substr(i, 3), i += 3); - }return o; - }function u(e) { - return void 0 === e ? "undefined" : null === e ? "null" : Object.prototype.toString.call(e).split(" ").pop().split("]").shift().toLowerCase(); - }function c(e) { - return e.toUpperCase(); - }function f(e, t) { - function r(e) { - var r = s(e);return r.match(t.UNRESERVED) ? r : e; - }return e.scheme && (e.scheme = String(e.scheme).replace(t.PCT_ENCODED, r).toLowerCase().replace(t.NOT_SCHEME, "")), void 0 !== e.userinfo && (e.userinfo = String(e.userinfo).replace(t.PCT_ENCODED, r).replace(t.NOT_USERINFO, n).replace(t.PCT_ENCODED, c)), void 0 !== e.host && (e.host = String(e.host).replace(t.PCT_ENCODED, r).toLowerCase().replace(t.NOT_HOST, n).replace(t.PCT_ENCODED, c)), void 0 !== e.path && (e.path = String(e.path).replace(t.PCT_ENCODED, r).replace(e.scheme ? t.NOT_PATH : t.NOT_PATH_NOSCHEME, n).replace(t.PCT_ENCODED, c)), void 0 !== e.query && (e.query = String(e.query).replace(t.PCT_ENCODED, r).replace(t.NOT_QUERY, n).replace(t.PCT_ENCODED, c)), void 0 !== e.fragment && (e.fragment = String(e.fragment).replace(t.PCT_ENCODED, r).replace(t.NOT_FRAGMENT, n).replace(t.PCT_ENCODED, c)), e; - }function p(e, t) { - void 0 === t && (t = {});var r, - n, - u = o && t.iri !== !1 ? x : w, - c = !1, - p = {};if ("suffix" === t.reference && (e = (t.scheme ? t.scheme + ":" : "") + "//" + e), i ? (r = e.match(u.URI_REF), r && (r = r[1] ? r.slice(1, 10) : r.slice(10, 19)), r || (c = !0, t.tolerant || (p.error = p.error || "URI is not strictly valid."), r = e.match(C))) : r = e.match(C), r) { - if (A ? (p.scheme = r[1], p.userinfo = r[3], p.host = r[4], p.port = parseInt(r[5], 10), p.path = r[6] || "", p.query = r[7], p.fragment = r[8], isNaN(p.port) && (p.port = r[5])) : (p.scheme = r[1] || void 0, p.userinfo = -1 !== e.indexOf("@") ? r[3] : void 0, p.host = -1 !== e.indexOf("//") ? r[4] : void 0, p.port = parseInt(r[5], 10), p.path = r[6] || "", p.query = -1 !== e.indexOf("?") ? r[7] : void 0, p.fragment = -1 !== e.indexOf("#") ? r[8] : void 0, isNaN(p.port) && (p.port = e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? r[4] : void 0)), void 0 !== p.scheme || void 0 !== p.userinfo || void 0 !== p.host || void 0 !== p.port || p.path || void 0 !== p.query ? void 0 === p.scheme ? p.reference = "relative" : void 0 === p.fragment ? p.reference = "absolute" : p.reference = "uri" : p.reference = "same-document", t.reference && "suffix" !== t.reference && t.reference !== p.reference && (p.error = p.error || "URI is not a " + t.reference + " reference."), n = j[(t.scheme || p.scheme || "").toLowerCase()], !o || "undefined" == typeof a || t.unicodeSupport || n && n.unicodeSupport) f(p, u);else { - if (p.host && (t.domainHost || n && n.domainHost)) try { - p.host = a.toASCII(p.host.replace(u.PCT_ENCODED, s).toLowerCase()); - } catch (h) { - p.error = p.error || "Host's domain name can not be converted to ASCII via punycode: " + h; - }f(p, w); - }n && n.parse && n.parse(p, t); - } else c = !0, p.error = p.error || "URI can not be parsed.";return p; - }function h(e, t) { - var r = [];return void 0 !== e.userinfo && (r.push(e.userinfo), r.push("@")), void 0 !== e.host && r.push(e.host), "number" == typeof e.port && (r.push(":"), r.push(e.port.toString(10))), r.length ? r.join("") : void 0; - }function l(e) { - for (var t, r = []; e.length;) { - e.match(O) ? e = e.replace(O, "") : e.match(P) ? e = e.replace(P, "/") : e.match(T) ? (e = e.replace(T, "/"), r.pop()) : "." === e || ".." === e ? e = "" : (t = e.match(_)[0], e = e.slice(t.length), r.push(t)); - }return r.join(""); - }function d(e, t) { - void 0 === t && (t = {});var r, - n, - i, - u = o && t.iri ? x : w, - c = [];if (r = j[(t.scheme || e.scheme || "").toLowerCase()], r && r.serialize && r.serialize(e, t), o && "undefined" != typeof a && e.host && (t.domainHost || r && r.domainHost)) try { - e.host = t.iri ? a.toUnicode(e.host) : a.toASCII(e.host.replace(u.PCT_ENCODED, s).toLowerCase()); - } catch (p) { - e.error = e.error || "Host's domain name can not be converted to " + (t.iri ? "Unicode" : "ASCII") + " via punycode: " + p; - }return f(e, u), "suffix" !== t.reference && e.scheme && (c.push(e.scheme), c.push(":")), n = h(e, t), void 0 !== n && ("suffix" !== t.reference && c.push("//"), c.push(n), e.path && "/" !== e.path.charAt(0) && c.push("/")), void 0 !== e.path && (i = e.path, t.absolutePath || r && r.absolutePath || (i = l(i)), void 0 === n && (i = i.replace(/^\/\//, "/%2F")), c.push(i)), void 0 !== e.query && (c.push("?"), c.push(e.query)), void 0 !== e.fragment && (c.push("#"), c.push(e.fragment)), c.join(""); - }function y(e, t, r, n) { - void 0 === r && (r = {});var o = {};return n || (e = p(d(e, r), r), t = p(d(t, r), r)), r = r || {}, !r.tolerant && t.scheme ? (o.scheme = t.scheme, o.userinfo = t.userinfo, o.host = t.host, o.port = t.port, o.path = l(t.path), o.query = t.query) : (void 0 !== t.userinfo || void 0 !== t.host || void 0 !== t.port ? (o.userinfo = t.userinfo, o.host = t.host, o.port = t.port, o.path = l(t.path), o.query = t.query) : (t.path ? ("/" === t.path.charAt(0) ? o.path = l(t.path) : (void 0 === e.userinfo && void 0 === e.host && void 0 === e.port || e.path ? e.path ? o.path = e.path.slice(0, e.path.lastIndexOf("/") + 1) + t.path : o.path = t.path : o.path = "/" + t.path, o.path = l(o.path)), o.query = t.query) : (o.path = e.path, void 0 !== t.query ? o.query = t.query : o.query = e.query), o.userinfo = e.userinfo, o.host = e.host, o.port = e.port), o.scheme = e.scheme), o.fragment = t.fragment, o; - }function v(e, t, r) { - return d(y(p(e, r), p(t, r), r, !0), r); - }function m(e, t) { - return "string" == typeof e ? e = d(p(e, t), t) : "object" === u(e) && (e = p(d(e, t), t)), e; - }function g(e, t, r) { - return "string" == typeof e ? e = d(p(e, r), r) : "object" === u(e) && (e = d(e, r)), "string" == typeof t ? t = d(p(t, r), r) : "object" === u(t) && (t = d(t, r)), e === t; - }function b(e, t) { - return e && e.toString().replace(o && t && t.iri ? x.ESCAPE : w.ESCAPE, n); - }function E(e, t) { - return e && e.toString().replace(o && t && t.iri ? x.PCT_ENCODED : w.PCT_ENCODED, s); - }var w = r(!1), - x = o ? r(!0) : void 0, - C = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?([^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n)*))?/i, - O = /^\.\.?\//, - P = /^\/\.(\/|$)/, - T = /^\/\.\.(\/|$)/, - _ = /^\/?(?:.|\n)*?(?=\/|$)/, - A = void 0 === "".match(/(){0}/)[1], - j = {};return { IRI_SUPPORT: o, VALIDATE_SUPPORT: i, pctEncChar: n, pctDecChars: s, SCHEMES: j, parse: p, _recomposeAuthority: h, removeDotSegments: l, serialize: d, resolveComponents: y, resolve: v, normalize: m, equal: g, escapeComponent: b, unescapeComponent: E }; - }();if (!n && "undefined" != typeof t && "function" == typeof e) { - var a = e("./punycode");t.exports = s, e("./schemes"); - } - }, { "./punycode": 18, "./schemes": 19 }] }, {}, [1])(1); -}); + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));}else{var g;if(typeof window!=="undefined"){g=window;}else if(typeof global!=="undefined"){g=global;}else if(typeof self!=="undefined"){g=self;}else{g=this;}g.JsonRefs=f();}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return require(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f;}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e);},l,l.exports,e,t,n,r);}return n[o].exports;}var i=typeof require=="function"&&require;for(var o=0;o-1){combinedDetails=u2Details;}else{u1Details=isType(u1,'Undefined')?undefined:parseURI(u1);if(!isType(u1Details,'Undefined')){combinedDetails=u1Details;// Join the paths +combinedDetails.path=slash(path.join(u1Details.path,u2Details.path));// Join query parameters +combinedDetails.query=combineQueryParams(u1Details.query,u2Details.query);}else{combinedDetails=u2Details;}}// Remove the fragment +combinedDetails.fragment=undefined;// For relative URIs, add back the '..' since it was removed above +return(remoteUriTypes.indexOf(combinedDetails.reference)===-1&&combinedDetails.path.indexOf('../')===0?'../':'')+URI.serialize(combinedDetails);}function findAncestors(obj,path){var ancestors=[];var node;if(path.length>0){node=obj;path.slice(0,path.length-1).forEach(function(seg){if(seg in node){node=node[seg];ancestors.push(node);}});}return ancestors;}function processSubDocument(mode,doc,subDocPath,refDetails,options,parents,parentPtrs,allRefs,indirect){var refValue;var rOptions;if(subDocPath.length>0){try{refValue=findValue(doc,subDocPath);}catch(err){// We only mark missing remote references as missing because local references can have deferred values +if(mode==='remote'){refDetails.error=err.message;refDetails.missing=true;}}}else{refValue=doc;}if(!isType(refValue,'Undefined')){refDetails.value=refValue;}if(isType(refValue,'Array')||isType(refValue,'Object')){rOptions=clone(options);if(mode==='local'){delete rOptions.subDocPath;// Traverse the dereferenced value +doc=refValue;}else{rOptions.relativeBase=path.dirname(parents[parents.length-1]);if(subDocPath.length===0){delete rOptions.subDocPath;}else{rOptions.subDocPath=subDocPath;}}return findRefsRecursive(doc,rOptions,parents,parentPtrs,allRefs,indirect);}}// Should this be its own exported API? +function findRefsRecursive(obj,options,parents,parentPtrs,allRefs,indirect){var allTasks=Promise.resolve();var parentPath=parentPtrs.length?pathFromPtr(parentPtrs[parentPtrs.length-1]):[];var refs=findRefs(obj,options);var subDocPath=options.subDocPath||[];var subDocPtr=pathToPtr(subDocPath);var ancestorPtrs=['#'];parents.forEach(function(parent,index){if(parent.charAt(0)!=='#'){ancestorPtrs.push(parentPtrs[index]);}});// Reverse the order so we search them in the proper order +ancestorPtrs.reverse();if((parents[parents.length-1]||'').charAt(0)!=='#'){allRefs.documents[pathToPtr(parentPath)]=obj;}Object.keys(refs).forEach(function(refPtr){var refDetails=refs[refPtr];var location;var parentIndex;var refFullPath;var refFullPtr;// If there are no parents, treat the reference pointer as-is. Otherwise, the reference is a reference within a +// remote document and its sub document path prefix must be removed. +if(parents.length===0){refFullPath=parentPath.concat(pathFromPtr(refPtr));}else{refFullPath=parentPath.concat(pathFromPtr(refPtr).slice(parents.length===0?0:subDocPath.length));}refFullPtr=pathToPtr(refFullPath);// It is possible to process the same reference more than once in the event of hierarchical references so we avoid +// processing a reference if we've already done so. +if(!isType(allRefs[refFullPtr],'Undefined')){return;}// Record the reference metadata +allRefs.refs[refFullPtr]=refs[refPtr];// Do not process invalid references +if(isType(refDetails.error,'Undefined')&&refDetails.type!=='invalid'){if(remoteTypes.indexOf(refDetails.type)>-1){location=combineURIs(options.relativeBase,refDetails.uri);parentIndex=parents.indexOf(location);}else{location=refDetails.uri;parentIndex=parentPtrs.indexOf(location);}// Record ancestor paths +refDetails.ancestorPtrs=ancestorPtrs;// Record if the reference is indirect based on its parent +refDetails.indirect=indirect;// Only process non-circular references further +if(parentIndex===-1){if(remoteTypes.indexOf(refDetails.type)>-1){allTasks=allTasks.then(function(){return getRemoteDocument(location,options).then(function(doc){return processSubDocument('remote',doc,isType(refDetails.uriDetails.fragment,'Undefined')?[]:pathFromPtr(decodeURI(refDetails.uriDetails.fragment)),refDetails,options,parents.concat(location),parentPtrs.concat(refFullPtr),allRefs,indirect);}).catch(function(err){refDetails.error=err.message;refDetails.missing=true;});});}else{if(refFullPtr.indexOf(location+'/')!==0&&refFullPtr!==location&&subDocPtr.indexOf(location+'/')!==0&&subDocPtr!==location){if(location.indexOf(subDocPtr+'/')!==0){allTasks=allTasks.then(function(){return processSubDocument('local',obj,pathFromPtr(location),refDetails,options,parents.concat(location),parentPtrs.concat(refFullPtr),allRefs,indirect||location.indexOf(subDocPtr+'/')===-1&&location!==subDocPtr);});}}else{refDetails.circular=true;}}}else{// Mark seen ancestors as circular +parentPtrs.slice(parentIndex).forEach(function(parentPtr){allRefs.refs[parentPtr].circular=true;});refDetails.circular=true;}}});allTasks=allTasks.then(function(){// Identify indirect, local circular references (Issue 82) +var circulars=[];var processedRefPtrs=[];var processedRefs=[];function walkRefs(parentPtrs,parentRefs,refPtr,ref){Object.keys(allRefs.refs).forEach(function(dRefPtr){var dRefDetails=allRefs.refs[dRefPtr];// Do not process already processed references or references that are not a nested references +if(processedRefs.indexOf(ref)===-1&&processedRefPtrs.indexOf(refPtr)===-1&&circulars.indexOf(ref)===-1&&dRefPtr!==refPtr&&dRefPtr.indexOf(ref+'/')===0){if(parentRefs.indexOf(ref)>-1){parentRefs.forEach(function(parentRef){if(circulars.indexOf(ref)===-1){circulars.push(parentRef);}});}else{walkRefs(parentPtrs.concat(refPtr),parentRefs.concat(ref),dRefPtr,dRefDetails.uri);}processedRefPtrs.push(refPtr);processedRefs.push(ref);}});}Object.keys(allRefs.refs).forEach(function(refPtr){var refDetails=allRefs.refs[refPtr];// Only process local, non-circular references +if(refDetails.type==='local'&&!refDetails.circular&&circulars.indexOf(refDetails.uri)===-1){walkRefs([],[],refPtr,refDetails.uri);}});Object.keys(allRefs.refs).forEach(function(refPtr){var refDetails=allRefs.refs[refPtr];if(circulars.indexOf(refDetails.uri)>-1){refDetails.circular=true;}});}).then(function(){return allRefs;});return allTasks;}function findValue(obj,path){var value=obj;path.forEach(function(seg){seg=decodeURI(seg);if(seg in value){value=value[seg];}else{throw Error('JSON Pointer points to missing location: '+pathToPtr(path));}});return value;}function getExtraRefKeys(ref){return Object.keys(ref).filter(function(key){return key!=='$ref';});}function getRefType(refDetails){var type;// Convert the URI reference to one of our types +switch(refDetails.uriDetails.reference){case'absolute':case'uri':type='remote';break;case'same-document':type='local';break;default:type=refDetails.uriDetails.reference;}return type;}function getRemoteDocument(url,options){var cacheEntry=remoteCache[url];var allTasks=Promise.resolve();var loaderOptions=clone(options.loaderOptions||{});if(isType(cacheEntry,'Undefined')){// If there is no content processor, default to processing the raw response as JSON +if(isType(loaderOptions.processContent,'Undefined')){loaderOptions.processContent=function(res,callback){callback(undefined,JSON.parse(res.text));};}// Attempt to load the resource using path-loader +allTasks=PathLoader.load(decodeURI(url),loaderOptions);// Update the cache +allTasks=allTasks.then(function(res){remoteCache[url]={value:res};return res;}).catch(function(err){remoteCache[url]={error:err};throw err;});}else{// Return the cached version +allTasks=allTasks.then(function(){return cacheEntry.value;});}// Return a cloned version to avoid updating the cache +allTasks=allTasks.then(function(res){return clone(res);});return allTasks;}function isRefLike(obj,throwWithDetails){var refLike=true;try{if(!isType(obj,'Object')){throw new Error('obj is not an Object');}else if(!isType(obj.$ref,'String')){throw new Error('obj.$ref is not a String');}}catch(err){if(throwWithDetails){throw err;}refLike=false;}return refLike;}function isType(obj,type){// A PhantomJS bug (https://github.com/ariya/phantomjs/issues/11722) prohibits us from using the same approach for +// undefined checking that we use for other types. +if(type==='Undefined'){return typeof obj==='undefined';}else{return Object.prototype.toString.call(obj)==='[object '+type+']';}}function makeRefFilter(options){var refFilter;var validTypes;if(isType(options.filter,'Array')||isType(options.filter,'String')){validTypes=isType(options.filter,'String')?[options.filter]:options.filter;refFilter=function refFilter(refDetails){// Check the exact type or for invalid URIs, check its original type +return validTypes.indexOf(refDetails.type)>-1||validTypes.indexOf(getRefType(refDetails))>-1;};}else if(isType(options.filter,'Function')){refFilter=options.filter;}else if(isType(options.filter,'Undefined')){refFilter=function refFilter(){return true;};}return function(refDetails,path){return(refDetails.type!=='invalid'||options.includeInvalid===true)&&refFilter(refDetails,path);};}function makeSubDocPath(options){var subDocPath;if(isType(options.subDocPath,'Array')){subDocPath=options.subDocPath;}else if(isType(options.subDocPath,'String')){subDocPath=pathFromPtr(options.subDocPath);}else if(isType(options.subDocPath,'Undefined')){subDocPath=[];}return subDocPath;}function parseURI(uri){// We decode first to avoid doubly encoding +return URI.parse(encodeURI(decodeURI(uri)));}function setValue(obj,refPath,value){findValue(obj,refPath.slice(0,refPath.length-1))[decodeURI(refPath[refPath.length-1])]=value;}function walk(ancestors,node,path,fn){var processChildren=true;function walkItem(item,segment){path.push(segment);walk(ancestors,item,path,fn);path.pop();}// Call the iteratee +if(isType(fn,'Function')){processChildren=fn(ancestors,node,path);}// We do not process circular objects again +if(ancestors.indexOf(node)===-1){ancestors.push(node);if(processChildren!==false){if(isType(node,'Array')){node.forEach(function(member,index){walkItem(member,index.toString());});}else if(isType(node,'Object')){Object.keys(node).forEach(function(key){walkItem(node[key],key);});}}}ancestors.pop();}function validateOptions(options,obj){if(isType(options,'Undefined')){// Default to an empty options object +options={};}else{// Clone the options so we do not alter the ones passed in +options=clone(options);}if(!isType(options,'Object')){throw new TypeError('options must be an Object');}else if(!isType(options.filter,'Undefined')&&!isType(options.filter,'Array')&&!isType(options.filter,'Function')&&!isType(options.filter,'String')){throw new TypeError('options.filter must be an Array, a Function of a String');}else if(!isType(options.includeInvalid,'Undefined')&&!isType(options.includeInvalid,'Boolean')){throw new TypeError('options.includeInvalid must be a Boolean');}else if(!isType(options.refPreProcessor,'Undefined')&&!isType(options.refPreProcessor,'Function')){throw new TypeError('options.refPreProcessor must be a Function');}else if(!isType(options.refPostProcessor,'Undefined')&&!isType(options.refPostProcessor,'Function')){throw new TypeError('options.refPostProcessor must be a Function');}else if(!isType(options.subDocPath,'Undefined')&&!isType(options.subDocPath,'Array')&&!isPtr(options.subDocPath)){// If a pointer is provided, throw an error if it's not the proper type +throw new TypeError('options.subDocPath must be an Array of path segments or a valid JSON Pointer');}options.filter=makeRefFilter(options);// Set the subDocPath to avoid everyone else having to compute it +options.subDocPath=makeSubDocPath(options);if(!isType(obj,'Undefined')){try{findValue(obj,options.subDocPath);}catch(err){err.message=err.message.replace('JSON Pointer','options.subDocPath');throw err;}}return options;}/* Module Members *//* + * Each of the functions below are defined as function statements and *then* exported in two steps instead of one due + * to a bug in jsdoc (https://github.com/jsdoc2md/jsdoc-parse/issues/18) that causes our documentation to be + * generated improperly. The impact to the user is significant enough for us to warrant working around it until this + * is fixed. + *//** + * The options used for various JsonRefs APIs. + * + * @typedef {object} JsonRefsOptions + * + * @param {string|string[]|function} [filter=function () {return true;}] - The filter to use when gathering JSON + * References *(If this value is a single string or an array of strings, the value(s) are expected to be the `type(s)` + * you are interested in collecting as described in {@link module:JsonRefs.getRefDetails}. If it is a function, it is + * expected that the function behaves like {@link module:JsonRefs~RefDetailsFilter}.)* + * @param {boolean} [includeInvalid=false] - Whether or not to include invalid JSON Reference details *(This will make + * it so that objects that are like JSON Reference objects, as in they are an `Object` and the have a `$ref` property, + * but fail validation will be included. This is very useful for when you want to know if you have invalid JSON + * Reference definitions. This will not mean that APIs will process invalid JSON References but the reasons as to why + * the JSON References are invalid will be included in the returned metadata.)* + * @param {object} [loaderOptions] - The options to pass to + * {@link https://github.com/whitlockjc/path-loader/blob/master/docs/API.md#module_PathLoader.load|PathLoader~load} + * @param {module:JsonRefs~RefPreProcessor} [refPreProcessor] - The callback used to pre-process a JSON Reference like + * object *(This is called prior to validating the JSON Reference like object and getting its details)* + * @param {module:JsonRefs~RefPostProcessor} [refPostProcessor] - The callback used to post-process the JSON Reference + * metadata *(This is called prior filtering the references)* + * @param {string} [options.relativeBase] - The base location to use when resolving relative references *(Only useful + * for APIs that do remote reference resolution. If this value is not defined, + * {@link https://github.com/whitlockjc/path-loader|path-loader} will use `window.location.href` for the browser and + * `process.cwd()` for Node.js.)* + * @param {string|string[]} [options.subDocPath=[]] - The JSON Pointer or array of path segments to the sub document + * location to search from + *//** + * Simple function used to filter out JSON References. + * + * @typedef {function} RefDetailsFilter + * + * @param {module:JsonRefs~UnresolvedRefDetails} refDetails - The JSON Reference details to test + * @param {string[]} path - The path to the JSON Reference + * + * @returns {boolean} whether the JSON Reference should be filtered *(out)* or not + *//** + * Simple function used to pre-process a JSON Reference like object. + * + * @typedef {function} RefPreProcessor + * + * @param {object} obj - The JSON Reference like object + * @param {string[]} path - The path to the JSON Reference like object + * + * @returns {object} the processed JSON Reference like object + *//** + * Simple function used to post-process a JSON Reference details. + * + * @typedef {function} RefPostProcessor + * + * @param {module:JsonRefs~UnresolvedRefDetails} refDetails - The JSON Reference details to test + * @param {string[]} path - The path to the JSON Reference + * + * @returns {object} the processed JSON Reference details object + *//** + * Detailed information about resolved JSON References. + * + * @typedef {module:JsonRefs~UnresolvedRefDetails} ResolvedRefDetails + * + * @property {boolean} [circular] - Whether or not the JSON Reference is circular *(Will not be set if the JSON + * Reference is not circular)* + * @property {boolean} [missing] - Whether or not the referenced value was missing or not *(Will not be set if the + * referenced value is not missing)* + * @property {*} [value] - The referenced value *(Will not be set if the referenced value is missing)* + *//** + * The results of resolving the JSON References of an array/object. + * + * @typedef {object} ResolvedRefsResults + * + * @property {module:JsonRefs~ResolvedRefDetails} refs - An object whose keys are JSON Pointers *(fragment version)* + * to where the JSON Reference is defined and whose values are {@link module:JsonRefs~ResolvedRefDetails} + * @property {object} resolved - The array/object with its JSON References fully resolved + *//** + * An object containing the retrieved document and detailed information about its JSON References. + * + * @typedef {module:JsonRefs~ResolvedRefsResults} RetrievedRefsResults + * + * @property {object} value - The retrieved document + *//** + * An object containing the retrieved document, the document with its references resolved and detailed information + * about its JSON References. + * + * @typedef {object} RetrievedResolvedRefsResults + * + * @property {module:JsonRefs~UnresolvedRefDetails} refs - An object whose keys are JSON Pointers *(fragment version)* + * to where the JSON Reference is defined and whose values are {@link module:JsonRefs~UnresolvedRefDetails} + * @property {ResolvedRefsResults} - An object whose keys are JSON Pointers *(fragment version)* + * to where the JSON Reference is defined and whose values are {@link module:JsonRefs~ResolvedRefDetails} + * @property {object} value - The retrieved document + *//** + * Detailed information about unresolved JSON References. + * + * @typedef {object} UnresolvedRefDetails + * + * @property {object} def - The JSON Reference definition + * @property {string} [error] - The error information for invalid JSON Reference definition *(Only present when the + * JSON Reference definition is invalid or there was a problem retrieving a remote reference during resolution)* + * @property {string} uri - The URI portion of the JSON Reference + * @property {object} uriDetails - Detailed information about the URI as provided by + * {@link https://github.com/garycourt/uri-js|URI.parse}. + * @property {string} type - The JSON Reference type *(This value can be one of the following: `invalid`, `local`, + * `relative` or `remote`.)* + * @property {string} [warning] - The warning information *(Only present when the JSON Reference definition produces a + * warning)* + *//** + * Clears the internal cache of remote documents, reference details, etc. + * + * @alias module:JsonRefs.clearCache + */function clearCache(){remoteCache={};}/** + * Takes an array of path segments and decodes the JSON Pointer tokens in them. + * + * @param {string[]} path - The array of path segments + * + * @returns {string} the array of path segments with their JSON Pointer tokens decoded + * + * @throws {Error} if the path is not an `Array` + * + * @see {@link https://tools.ietf.org/html/rfc6901#section-3} + * + * @alias module:JsonRefs.decodePath + */function decodePath(path){if(!isType(path,'Array')){throw new TypeError('path must be an array');}return path.map(function(seg){if(!isType(seg,'String')){seg=JSON.stringify(seg);}return decodeURI(seg.replace(/~1/g,'/').replace(/~0/g,'~'));});}/** + * Takes an array of path segments and encodes the special JSON Pointer characters in them. + * + * @param {string[]} path - The array of path segments + * + * @returns {string} the array of path segments with their JSON Pointer tokens encoded + * + * @throws {Error} if the path is not an `Array` + * + * @see {@link https://tools.ietf.org/html/rfc6901#section-3} + * + * @alias module:JsonRefs.encodePath + */function encodePath(path){if(!isType(path,'Array')){throw new TypeError('path must be an array');}return path.map(function(seg){if(!isType(seg,'String')){seg=JSON.stringify(seg);}return seg.replace(/~/g,'~0').replace(/\//g,'~1');});}/** + * Finds JSON References defined within the provided array/object. + * + * @param {array|object} obj - The structure to find JSON References within + * @param {module:JsonRefs~JsonRefsOptions} [options] - The JsonRefs options + * + * @returns {object} an object whose keys are JSON Pointers *(fragment version)* to where the JSON Reference is defined + * and whose values are {@link module:JsonRefs~UnresolvedRefDetails}. + * + * @throws {Error} when the input arguments fail validation or if `options.subDocPath` points to an invalid location + * + * @alias module:JsonRefs.findRefs + * + * @example + * // Finding all valid references + * var allRefs = JsonRefs.findRefs(obj); + * // Finding all remote references + * var remoteRefs = JsonRefs.findRefs(obj, {filter: ['relative', 'remote']}); + * // Finding all invalid references + * var invalidRefs = JsonRefs.findRefs(obj, {filter: 'invalid', includeInvalid: true}); + */function findRefs(obj,options){var refs={};// Validate the provided document +if(!isType(obj,'Array')&&!isType(obj,'Object')){throw new TypeError('obj must be an Array or an Object');}// Validate options +options=validateOptions(options,obj);// Walk the document (or sub document) and find all JSON References +walk(findAncestors(obj,options.subDocPath),findValue(obj,options.subDocPath),clone(options.subDocPath),function(ancestors,node,path){var processChildren=true;var refDetails;if(isRefLike(node)){// Pre-process the node when necessary +if(!isType(options.refPreProcessor,'Undefined')){node=options.refPreProcessor(clone(node),path);}refDetails=getRefDetails(node);// Post-process the reference details +if(!isType(options.refPostProcessor,'Undefined')){refDetails=options.refPostProcessor(refDetails,path);}if(options.filter(refDetails,path)){refs[pathToPtr(path)]=refDetails;}// Whenever a JSON Reference has extra children, its children should not be processed. +// See: http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03#section-3 +if(getExtraRefKeys(node).length>0){processChildren=false;}}return processChildren;});return refs;}/** + * Finds JSON References defined within the document at the provided location. + * + * This API is identical to {@link module:JsonRefs.findRefs} except this API will retrieve a remote document and then + * return the result of {@link module:JsonRefs.findRefs} on the retrieved document. + * + * @param {string} location - The location to retrieve *(Can be relative or absolute, just make sure you look at the + * {@link module:JsonRefs~JsonRefsOptions|options documentation} to see how relative references are handled.)* + * @param {module:JsonRefs~JsonRefsOptions} [options] - The JsonRefs options + * + * @returns {Promise} a promise that resolves a {@link module:JsonRefs~RetrievedRefsResults} and rejects with an + * `Error` when the input arguments fail validation, when `options.subDocPath` points to an invalid location or when + * the location argument points to an unloadable resource + * + * @alias module:JsonRefs.findRefsAt + * + * @example + * // Example that only resolves references within a sub document + * JsonRefs.findRefsAt('http://petstore.swagger.io/v2/swagger.json', { + * subDocPath: '#/definitions' + * }) + * .then(function (res) { + * // Do something with the response + * // + * // res.refs: JSON Reference locations and details + * // res.value: The retrieved document + * }, function (err) { + * console.log(err.stack); + * }); + */function findRefsAt(location,options){var allTasks=Promise.resolve();allTasks=allTasks.then(function(){// Validate the provided location +if(!isType(location,'String')){throw new TypeError('location must be a string');}// Validate options +options=validateOptions(options);// Combine the location and the optional relative base +location=combineURIs(options.relativeBase,location);return getRemoteDocument(location,options);}).then(function(res){var cacheEntry=clone(remoteCache[location]);var cOptions=clone(options);var uriDetails=parseURI(location);if(isType(cacheEntry.refs,'Undefined')){// Do not filter any references so the cache is complete +delete cOptions.filter;delete cOptions.subDocPath;cOptions.includeInvalid=true;remoteCache[location].refs=findRefs(res,cOptions);}// Add the filter options back +if(!isType(options.filter,'Undefined')){cOptions.filter=options.filter;}if(!isType(uriDetails.fragment,'Undefined')){cOptions.subDocPath=pathFromPtr(decodeURI(uriDetails.fragment));}else if(!isType(uriDetails.subDocPath,'Undefined')){cOptions.subDocPath=options.subDocPath;}// This will use the cache so don't worry about calling it twice +return{refs:findRefs(res,cOptions),value:res};});return allTasks;}/** + * Returns detailed information about the JSON Reference. + * + * @param {object} obj - The JSON Reference definition + * + * @returns {module:JsonRefs~UnresolvedRefDetails} the detailed information + * + * @alias module:JsonRefs.getRefDetails + */function getRefDetails(obj){var details={def:obj};var cacheKey;var extraKeys;var uriDetails;try{if(isRefLike(obj,true)){cacheKey=obj.$ref;uriDetails=uriDetailsCache[cacheKey];if(isType(uriDetails,'Undefined')){uriDetails=uriDetailsCache[cacheKey]=parseURI(cacheKey);}details.uri=cacheKey;details.uriDetails=uriDetails;if(isType(uriDetails.error,'Undefined')){details.type=getRefType(details);}else{details.error=details.uriDetails.error;details.type='invalid';}// Identify warning +extraKeys=getExtraRefKeys(obj);if(extraKeys.length>0){details.warning='Extra JSON Reference properties will be ignored: '+extraKeys.join(', ');}}else{details.type='invalid';}}catch(err){details.error=err.message;details.type='invalid';}return details;}/** + * Returns whether the argument represents a JSON Pointer. + * + * A string is a JSON Pointer if the following are all true: + * + * * The string is of type `String` + * * The string must be empty, `#` or start with a `/` or `#/` + * + * @param {string} ptr - The string to check + * @param {boolean} [throwWithDetails=false] - Whether or not to throw an `Error` with the details as to why the value + * provided is invalid + * + * @returns {boolean} the result of the check + * + * @throws {error} when the provided value is invalid and the `throwWithDetails` argument is `true` + * + * @alias module:JsonRefs.isPtr + * + * @see {@link https://tools.ietf.org/html/rfc6901#section-3} + * + * @example + * // Separating the different ways to invoke isPtr for demonstration purposes + * if (isPtr(str)) { + * // Handle a valid JSON Pointer + * } else { + * // Get the reason as to why the value is not a JSON Pointer so you can fix/report it + * try { + * isPtr(str, true); + * } catch (err) { + * // The error message contains the details as to why the provided value is not a JSON Pointer + * } + * } + */function isPtr(ptr,throwWithDetails){var valid=true;var firstChar;try{if(isType(ptr,'String')){if(ptr!==''){firstChar=ptr.charAt(0);if(['#','/'].indexOf(firstChar)===-1){throw new Error('ptr must start with a / or #/');}else if(firstChar==='#'&&ptr!=='#'&&ptr.charAt(1)!=='/'){throw new Error('ptr must start with a / or #/');}else if(ptr.match(badPtrTokenRegex)){throw new Error('ptr has invalid token(s)');}}}else{throw new Error('ptr is not a String');}}catch(err){if(throwWithDetails===true){throw err;}valid=false;}return valid;}/** + * Returns whether the argument represents a JSON Reference. + * + * An object is a JSON Reference only if the following are all true: + * + * * The object is of type `Object` + * * The object has a `$ref` property + * * The `$ref` property is a valid URI *(We do not require 100% strict URIs and will handle unescaped special + * characters.)* + * + * @param {object} obj - The object to check + * @param {boolean} [throwWithDetails=false] - Whether or not to throw an `Error` with the details as to why the value + * provided is invalid + * + * @returns {boolean} the result of the check + * + * @throws {error} when the provided value is invalid and the `throwWithDetails` argument is `true` + * + * @alias module:JsonRefs.isRef + * + * @see {@link http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03#section-3} + * + * @example + * // Separating the different ways to invoke isRef for demonstration purposes + * if (isRef(obj)) { + * // Handle a valid JSON Reference + * } else { + * // Get the reason as to why the value is not a JSON Reference so you can fix/report it + * try { + * isRef(str, true); + * } catch (err) { + * // The error message contains the details as to why the provided value is not a JSON Reference + * } + * } + */function isRef(obj,throwWithDetails){return isRefLike(obj,throwWithDetails)&&getRefDetails(obj,throwWithDetails).type!=='invalid';}/** + * Returns an array of path segments for the provided JSON Pointer. + * + * @param {string} ptr - The JSON Pointer + * + * @returns {string[]} the path segments + * + * @throws {Error} if the provided `ptr` argument is not a JSON Pointer + * + * @alias module:JsonRefs.pathFromPtr + */function pathFromPtr(ptr){if(!isPtr(ptr)){throw new Error('ptr must be a JSON Pointer');}var segments=ptr.split('/');// Remove the first segment +segments.shift();return decodePath(segments);}/** + * Returns a JSON Pointer for the provided array of path segments. + * + * **Note:** If a path segment in `path` is not a `String`, it will be converted to one using `JSON.stringify`. + * + * @param {string[]} path - The array of path segments + * @param {boolean} [hashPrefix=true] - Whether or not create a hash-prefixed JSON Pointer + * + * @returns {string} the corresponding JSON Pointer + * + * @throws {Error} if the `path` argument is not an array + * + * @alias module:JsonRefs.pathToPtr + */function pathToPtr(path,hashPrefix){if(!isType(path,'Array')){throw new Error('path must be an Array');}// Encode each segment and return +return(hashPrefix!==false?'#':'')+(path.length>0?'/':'')+encodePath(path).join('/');}/** + * Finds JSON References defined within the provided array/object and resolves them. + * + * @param {array|object} obj - The structure to find JSON References within + * @param {module:JsonRefs~JsonRefsOptions} [options] - The JsonRefs options + * + * @returns {Promise} a promise that resolves a {@link module:JsonRefs~ResolvedRefsResults} and rejects with an + * `Error` when the input arguments fail validation, when `options.subDocPath` points to an invalid location or when + * the location argument points to an unloadable resource + * + * @alias module:JsonRefs.resolveRefs + * + * @example + * // Example that only resolves relative and remote references + * JsonRefs.resolveRefs(swaggerObj, { + * filter: ['relative', 'remote'] + * }) + * .then(function (res) { + * // Do something with the response + * // + * // res.refs: JSON Reference locations and details + * // res.resolved: The document with the appropriate JSON References resolved + * }, function (err) { + * console.log(err.stack); + * }); + */function resolveRefs(obj,options){var allTasks=Promise.resolve();allTasks=allTasks.then(function(){// Validate the provided document +if(!isType(obj,'Array')&&!isType(obj,'Object')){throw new TypeError('obj must be an Array or an Object');}// Validate options +options=validateOptions(options,obj);// Clone the input so we do not alter it +obj=clone(obj);}).then(function(){return findRefsRecursive(obj,options,[],[],{documents:{},refs:{}});}).then(function(allRefs){var deferredRefs={};var refs={};function pathSorter(p1,p2){return pathFromPtr(p1).length-pathFromPtr(p2).length;}// Resolve all references with a known value +Object.keys(allRefs.refs).sort(pathSorter).forEach(function(refPtr){var refDetails=allRefs.refs[refPtr];// Record all direct references +if(!refDetails.indirect){refs[refPtr]=refDetails;}// Delete helper property +delete refDetails.indirect;if(isType(refDetails.error,'Undefined')&&refDetails.type!=='invalid'){if(isType(refDetails.value,'Undefined')&&refDetails.circular){refDetails.value=refDetails.def;}// We defer processing all references without a value until later +if(isType(refDetails.value,'Undefined')){deferredRefs[refPtr]=refDetails;}else{if(refPtr==='#'){obj=refDetails.value;}else{setValue(obj,pathFromPtr(refPtr),refDetails.value);}// Delete helper property +delete refDetails.ancestorPtrs;}}else{// Delete helper property +delete refDetails.ancestorPtrs;}});// Resolve all deferred references +Object.keys(deferredRefs).forEach(function(refPtr){var refDetails=deferredRefs[refPtr];// Attempt to resolve the value against all if its ancestors in order +refDetails.ancestorPtrs.forEach(function(ancestorPtr,index){if(isType(refDetails.value,'Undefined')){try{refDetails.value=findValue(allRefs.documents[ancestorPtr],pathFromPtr(refDetails.uri));// Delete helper property +delete refDetails.ancestorPtrs;setValue(obj,pathFromPtr(refPtr),refDetails.value);}catch(err){if(index===refDetails.ancestorPtrs.length-1){refDetails.error=err.message;refDetails.missing=true;// Delete helper property +delete refDetails.ancestorPtrs;}}}});});return{refs:refs,resolved:obj};});return allTasks;}/** + * Resolves JSON References defined within the document at the provided location. + * + * This API is identical to {@link module:JsonRefs.resolveRefs} except this API will retrieve a remote document and then + * return the result of {@link module:JsonRefs.resolveRefs} on the retrieved document. + * + * @param {string} location - The location to retrieve *(Can be relative or absolute, just make sure you look at the + * {@link module:JsonRefs~JsonRefsOptions|options documentation} to see how relative references are handled.)* + * @param {module:JsonRefs~JsonRefsOptions} [options] - The JsonRefs options + * + * @returns {Promise} a promise that resolves a {@link module:JsonRefs~RetrievedResolvedRefsResults} and rejects with an + * `Error` when the input arguments fail validation, when `options.subDocPath` points to an invalid location or when + * the location argument points to an unloadable resource + * + * @alias module:JsonRefs.resolveRefsAt + * + * @example + * // Example that loads a JSON document (No options.loaderOptions.processContent required) and resolves all references + * JsonRefs.resolveRefsAt('./swagger.json') + * .then(function (res) { + * // Do something with the response + * // + * // res.refs: JSON Reference locations and details + * // res.resolved: The document with the appropriate JSON References resolved + * // res.value: The retrieved document + * }, function (err) { + * console.log(err.stack); + * }); + */function resolveRefsAt(location,options){var allTasks=Promise.resolve();allTasks=allTasks.then(function(){// Validate the provided location +if(!isType(location,'String')){throw new TypeError('location must be a string');}// Validate options +options=validateOptions(options);// Combine the location and the optional relative base +location=combineURIs(options.relativeBase,location);return getRemoteDocument(location,options);}).then(function(res){var cOptions=clone(options);var uriDetails=parseURI(location);// Set the sub document path if necessary +if(!isType(uriDetails.fragment,'Undefined')){cOptions.subDocPath=pathFromPtr(decodeURI(uriDetails.fragment));}// Update the relative base based on the retrieved location +cOptions.relativeBase=path.dirname(location);return resolveRefs(res,cOptions).then(function(res2){return{refs:res2.refs,resolved:res2.resolved,value:res};});});return allTasks;}/* Export the module members */module.exports.clearCache=clearCache;module.exports.decodePath=decodePath;module.exports.encodePath=encodePath;module.exports.findRefs=findRefs;module.exports.findRefsAt=findRefsAt;module.exports.getRefDetails=getRefDetails;module.exports.isPtr=isPtr;module.exports.isRef=isRef;module.exports.pathFromPtr=pathFromPtr;module.exports.pathToPtr=pathToPtr;module.exports.resolveRefs=resolveRefs;module.exports.resolveRefsAt=resolveRefsAt;},{"native-promise-only":3,"path":4,"path-loader":5,"querystring":11,"slash":13,"uri-js":23}],2:[function(require,module,exports){/** + * Expose `Emitter`. + */module.exports=Emitter;/** + * Initialize a new `Emitter`. + * + * @api public + */function Emitter(obj){if(obj)return mixin(obj);};/** + * Mixin the emitter properties. + * + * @param {Object} obj + * @return {Object} + * @api private + */function mixin(obj){for(var key in Emitter.prototype){obj[key]=Emitter.prototype[key];}return obj;}/** + * Listen on the given `event` with `fn`. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){this._callbacks=this._callbacks||{};(this._callbacks['$'+event]=this._callbacks['$'+event]||[]).push(fn);return this;};/** + * Adds an `event` listener that will be invoked a single + * time then automatically removed. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */Emitter.prototype.once=function(event,fn){function on(){this.off(event,on);fn.apply(this,arguments);}on.fn=fn;this.on(event,on);return this;};/** + * Remove the given callback for `event` or all + * registered callbacks. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){this._callbacks=this._callbacks||{};// all +if(0==arguments.length){this._callbacks={};return this;}// specific event +var callbacks=this._callbacks['$'+event];if(!callbacks)return this;// remove all handlers +if(1==arguments.length){delete this._callbacks['$'+event];return this;}// remove specific handler +var cb;for(var i=0;i0){schedule(notify,self);}}}catch(err){reject.call(new MakeDefWrapper(self),err);}}function reject(msg){var self=this;// already triggered? +if(self.triggered){return;}self.triggered=true;// unwrap +if(self.def){self=self.def;}self.msg=msg;self.state=2;if(self.chain.length>0){schedule(notify,self);}}function iteratePromises(Constructor,arr,resolver,rejecter){for(var idx=0;idx 0 +var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==='.'){parts.splice(i,1);}else if(last==='..'){parts.splice(i,1);up++;}else if(up){parts.splice(i,1);up--;}}// if the path is allowed to go above the root, restore leading ..s +if(allowAboveRoot){for(;up--;up){parts.unshift('..');}}return parts;}// Split a filename into [root, dir, basename, ext], unix version +// 'root' is just a slash, or nothing. +var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;var splitPath=function splitPath(filename){return splitPathRe.exec(filename).slice(1);};// path.resolve([from ...], to) +// posix version +exports.resolve=function(){var resolvedPath='',resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:process.cwd();// Skip empty and invalid entries +if(typeof path!=='string'){throw new TypeError('Arguments to path.resolve must be strings');}else if(!path){continue;}resolvedPath=path+'/'+resolvedPath;resolvedAbsolute=path.charAt(0)==='/';}// At this point the path should be resolved to a full absolute path, but +// handle relative paths to be safe (might happen when process.cwd() fails) +// Normalize the path +resolvedPath=normalizeArray(filter(resolvedPath.split('/'),function(p){return!!p;}),!resolvedAbsolute).join('/');return(resolvedAbsolute?'/':'')+resolvedPath||'.';};// path.normalize(path) +// posix version +exports.normalize=function(path){var isAbsolute=exports.isAbsolute(path),trailingSlash=substr(path,-1)==='/';// Normalize the path +path=normalizeArray(filter(path.split('/'),function(p){return!!p;}),!isAbsolute).join('/');if(!path&&!isAbsolute){path='.';}if(path&&trailingSlash){path+='/';}return(isAbsolute?'/':'')+path;};// posix version +exports.isAbsolute=function(path){return path.charAt(0)==='/';};// posix version +exports.join=function(){var paths=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(paths,function(p,index){if(typeof p!=='string'){throw new TypeError('Arguments to path.join must be strings');}return p;}).join('/'));};// path.relative(from, to) +// posix version +exports.relative=function(from,to){from=exports.resolve(from).substr(1);to=exports.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=='')break;}if(start>end)return[];return arr.slice(start,end-start+1);}var fromParts=trim(from.split('/'));var toParts=trim(to.split('/'));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i1){for(var i=1;i0&&len>maxKeys){len=maxKeys;}for(var i=0;i=0){kstr=x.substr(0,idx);vstr=x.substr(idx+1);}else{kstr=x;vstr='';}k=decodeURIComponent(kstr);v=decodeURIComponent(vstr);if(!hasOwnProperty(obj,k)){obj[k]=v;}else if(isArray(obj[k])){obj[k].push(v);}else{obj[k]=[obj[k],v];}}return obj;};var isArray=Array.isArray||function(xs){return Object.prototype.toString.call(xs)==='[object Array]';};},{}],10:[function(require,module,exports){// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. +'use strict';var stringifyPrimitive=function stringifyPrimitive(v){switch(typeof v==="undefined"?"undefined":_typeof(v)){case'string':return v;case'boolean':return v?'true':'false';case'number':return isFinite(v)?v:'';default:return'';}};module.exports=function(obj,sep,eq,name){sep=sep||'&';eq=eq||'=';if(obj===null){obj=undefined;}if((typeof obj==="undefined"?"undefined":_typeof(obj))==='object'){return map(objectKeys(obj),function(k){var ks=encodeURIComponent(stringifyPrimitive(k))+eq;if(isArray(obj[k])){return map(obj[k],function(v){return ks+encodeURIComponent(stringifyPrimitive(v));}).join(sep);}else{return ks+encodeURIComponent(stringifyPrimitive(obj[k]));}}).join(sep);}if(!name)return'';return encodeURIComponent(stringifyPrimitive(name))+eq+encodeURIComponent(stringifyPrimitive(obj));};var isArray=Array.isArray||function(xs){return Object.prototype.toString.call(xs)==='[object Array]';};function map(xs,f){if(xs.map)return xs.map(f);var res=[];for(var i=0;i=200&&res.status<300){return self.callback(err,res);}var new_err=new Error(res.statusText||'Unsuccessful HTTP response');new_err.original=err;new_err.response=res;new_err.status=res.status;self.callback(new_err,res);});}/** + * Mixin `Emitter` and `requestBase`. + */Emitter(Request.prototype);for(var key in requestBase){Request.prototype[key]=requestBase[key];}/** + * Abort the request, and clear potential timeout. + * + * @return {Request} + * @api public + */Request.prototype.abort=function(){if(this.aborted)return;this.aborted=true;this.xhr.abort();this.clearTimeout();this.emit('abort');return this;};/** + * Set Content-Type to `type`, mapping values from `request.types`. + * + * Examples: + * + * superagent.types.xml = 'application/xml'; + * + * request.post('/') + * .type('xml') + * .send(xmlstring) + * .end(callback); + * + * request.post('/') + * .type('application/xml') + * .send(xmlstring) + * .end(callback); + * + * @param {String} type + * @return {Request} for chaining + * @api public + */Request.prototype.type=function(type){this.set('Content-Type',request.types[type]||type);return this;};/** + * Set responseType to `val`. Presently valid responseTypes are 'blob' and + * 'arraybuffer'. + * + * Examples: + * + * req.get('/') + * .responseType('blob') + * .end(callback); + * + * @param {String} val + * @return {Request} for chaining + * @api public + */Request.prototype.responseType=function(val){this._responseType=val;return this;};/** + * Set Accept to `type`, mapping values from `request.types`. + * + * Examples: + * + * superagent.types.json = 'application/json'; + * + * request.get('/agent') + * .accept('json') + * .end(callback); + * + * request.get('/agent') + * .accept('application/json') + * .end(callback); + * + * @param {String} accept + * @return {Request} for chaining + * @api public + */Request.prototype.accept=function(type){this.set('Accept',request.types[type]||type);return this;};/** + * Set Authorization field value with `user` and `pass`. + * + * @param {String} user + * @param {String} pass + * @param {Object} options with 'type' property 'auto' or 'basic' (default 'basic') + * @return {Request} for chaining + * @api public + */Request.prototype.auth=function(user,pass,options){if(!options){options={type:'basic'};}switch(options.type){case'basic':var str=btoa(user+':'+pass);this.set('Authorization','Basic '+str);break;case'auto':this.username=user;this.password=pass;break;}return this;};/** +* Add query-string `val`. +* +* Examples: +* +* request.get('/shoes') +* .query('size=10') +* .query({ color: 'blue' }) +* +* @param {Object|String} val +* @return {Request} for chaining +* @api public +*/Request.prototype.query=function(val){if('string'!=typeof val)val=serialize(val);if(val)this._query.push(val);return this;};/** + * Queue the given `file` as an attachment to the specified `field`, + * with optional `filename`. + * + * ``` js + * request.post('/upload') + * .attach(new Blob(['hey!'], { type: "text/html"})) + * .end(callback); + * ``` + * + * @param {String} field + * @param {Blob|File} file + * @param {String} filename + * @return {Request} for chaining + * @api public + */Request.prototype.attach=function(field,file,filename){this._getFormData().append(field,file,filename||file.name);return this;};Request.prototype._getFormData=function(){if(!this._formData){this._formData=new root.FormData();}return this._formData;};/** + * Send `data` as the request body, defaulting the `.type()` to "json" when + * an object is given. + * + * Examples: + * + * // manual json + * request.post('/user') + * .type('json') + * .send('{"name":"tj"}') + * .end(callback) + * + * // auto json + * request.post('/user') + * .send({ name: 'tj' }) + * .end(callback) + * + * // manual x-www-form-urlencoded + * request.post('/user') + * .type('form') + * .send('name=tj') + * .end(callback) + * + * // auto x-www-form-urlencoded + * request.post('/user') + * .type('form') + * .send({ name: 'tj' }) + * .end(callback) + * + * // defaults to x-www-form-urlencoded + * request.post('/user') + * .send('name=tobi') + * .send('species=ferret') + * .end(callback) + * + * @param {String|Object} data + * @return {Request} for chaining + * @api public + */Request.prototype.send=function(data){var obj=isObject(data);var type=this._header['content-type'];// merge +if(obj&&isObject(this._data)){for(var key in data){this._data[key]=data[key];}}else if('string'==typeof data){if(!type)this.type('form');type=this._header['content-type'];if('application/x-www-form-urlencoded'==type){this._data=this._data?this._data+'&'+data:data;}else{this._data=(this._data||'')+data;}}else{this._data=data;}if(!obj||isHost(data))return this;if(!type)this.type('json');return this;};/** + * @deprecated + */Response.prototype.parse=function serialize(fn){if(root.console){console.warn("Client-side parse() method has been renamed to serialize(). This method is not compatible with superagent v2.0");}this.serialize(fn);return this;};Response.prototype.serialize=function serialize(fn){this._parser=fn;return this;};/** + * Invoke the callback with `err` and `res` + * and handle arity check. + * + * @param {Error} err + * @param {Response} res + * @api private + */Request.prototype.callback=function(err,res){var fn=this._callback;this.clearTimeout();fn(err,res);};/** + * Invoke callback with x-domain error. + * + * @api private + */Request.prototype.crossDomainError=function(){var err=new Error('Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.');err.crossDomain=true;err.status=this.status;err.method=this.method;err.url=this.url;this.callback(err);};/** + * Invoke callback with timeout error. + * + * @api private + */Request.prototype.timeoutError=function(){var timeout=this._timeout;var err=new Error('timeout of '+timeout+'ms exceeded');err.timeout=timeout;this.callback(err);};/** + * Enable transmission of cookies with x-domain requests. + * + * Note that for this to work the origin must not be + * using "Access-Control-Allow-Origin" with a wildcard, + * and also must set "Access-Control-Allow-Credentials" + * to "true". + * + * @api public + */Request.prototype.withCredentials=function(){this._withCredentials=true;return this;};/** + * Initiate request, invoking callback `fn(res)` + * with an instanceof `Response`. + * + * @param {Function} fn + * @return {Request} for chaining + * @api public + */Request.prototype.end=function(fn){var self=this;var xhr=this.xhr=request.getXHR();var query=this._query.join('&');var timeout=this._timeout;var data=this._formData||this._data;// store callback +this._callback=fn||noop;// state change +xhr.onreadystatechange=function(){if(4!=xhr.readyState)return;// In IE9, reads to any property (e.g. status) off of an aborted XHR will +// result in the error "Could not complete the operation due to error c00c023f" +var status;try{status=xhr.status;}catch(e){status=0;}if(0==status){if(self.timedout)return self.timeoutError();if(self.aborted)return;return self.crossDomainError();}self.emit('end');};// progress +var handleProgress=function handleProgress(e){if(e.total>0){e.percent=e.loaded/e.total*100;}e.direction='download';self.emit('progress',e);};if(this.hasListeners('progress')){xhr.onprogress=handleProgress;}try{if(xhr.upload&&this.hasListeners('progress')){xhr.upload.onprogress=handleProgress;}}catch(e){}// Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist. +// Reported here: +// https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context +// timeout +if(timeout&&!this._timer){this._timer=setTimeout(function(){self.timedout=true;self.abort();},timeout);}// querystring +if(query){query=request.serializeObject(query);this.url+=~this.url.indexOf('?')?'&'+query:'?'+query;}// initiate request +if(this.username&&this.password){xhr.open(this.method,this.url,true,this.username,this.password);}else{xhr.open(this.method,this.url,true);}// CORS +if(this._withCredentials)xhr.withCredentials=true;// body +if('GET'!=this.method&&'HEAD'!=this.method&&'string'!=typeof data&&!isHost(data)){// serialize stuff +var contentType=this._header['content-type'];var serialize=this._parser||request.serialize[contentType?contentType.split(';')[0]:''];if(!serialize&&isJSON(contentType))serialize=request.serialize['application/json'];if(serialize)data=serialize(data);}// set header fields +for(var field in this.header){if(null==this.header[field])continue;xhr.setRequestHeader(field,this.header[field]);}if(this._responseType){xhr.responseType=this._responseType;}// send stuff +this.emit('request',this);// IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing) +// We need null here if data is undefined +xhr.send(typeof data!=='undefined'?data:null);return this;};/** + * Expose `Request`. + */request.Request=Request;/** + * GET `url` with optional callback `fn(res)`. + * + * @param {String} url + * @param {Mixed|Function} data or fn + * @param {Function} fn + * @return {Request} + * @api public + */request.get=function(url,data,fn){var req=request('GET',url);if('function'==typeof data)fn=data,data=null;if(data)req.query(data);if(fn)req.end(fn);return req;};/** + * HEAD `url` with optional callback `fn(res)`. + * + * @param {String} url + * @param {Mixed|Function} data or fn + * @param {Function} fn + * @return {Request} + * @api public + */request.head=function(url,data,fn){var req=request('HEAD',url);if('function'==typeof data)fn=data,data=null;if(data)req.send(data);if(fn)req.end(fn);return req;};/** + * DELETE `url` with optional callback `fn(res)`. + * + * @param {String} url + * @param {Function} fn + * @return {Request} + * @api public + */function del(url,fn){var req=request('DELETE',url);if(fn)req.end(fn);return req;};request['del']=del;request['delete']=del;/** + * PATCH `url` with optional `data` and callback `fn(res)`. + * + * @param {String} url + * @param {Mixed} data + * @param {Function} fn + * @return {Request} + * @api public + */request.patch=function(url,data,fn){var req=request('PATCH',url);if('function'==typeof data)fn=data,data=null;if(data)req.send(data);if(fn)req.end(fn);return req;};/** + * POST `url` with optional `data` and callback `fn(res)`. + * + * @param {String} url + * @param {Mixed} data + * @param {Function} fn + * @return {Request} + * @api public + */request.post=function(url,data,fn){var req=request('POST',url);if('function'==typeof data)fn=data,data=null;if(data)req.send(data);if(fn)req.end(fn);return req;};/** + * PUT `url` with optional `data` and callback `fn(res)`. + * + * @param {String} url + * @param {Mixed|Function} data or fn + * @param {Function} fn + * @return {Request} + * @api public + */request.put=function(url,data,fn){var req=request('PUT',url);if('function'==typeof data)fn=data,data=null;if(data)req.send(data);if(fn)req.end(fn);return req;};},{"./is-object":15,"./request":17,"./request-base":16,"emitter":2,"reduce":12}],15:[function(require,module,exports){/** + * Check if `obj` is an object. + * + * @param {Object} obj + * @return {Boolean} + * @api private + */function isObject(obj){return null!=obj&&'object'==(typeof obj==="undefined"?"undefined":_typeof(obj));}module.exports=isObject;},{}],16:[function(require,module,exports){/** + * Module of mixed-in functions shared between node and client code + */var isObject=require('./is-object');/** + * Clear previous timeout. + * + * @return {Request} for chaining + * @api public + */exports.clearTimeout=function _clearTimeout(){this._timeout=0;clearTimeout(this._timer);return this;};/** + * Force given parser + * + * Sets the body parser no matter type. + * + * @param {Function} + * @api public + */exports.parse=function parse(fn){this._parser=fn;return this;};/** + * Set timeout to `ms`. + * + * @param {Number} ms + * @return {Request} for chaining + * @api public + */exports.timeout=function timeout(ms){this._timeout=ms;return this;};/** + * Faux promise support + * + * @param {Function} fulfill + * @param {Function} reject + * @return {Request} + */exports.then=function then(fulfill,reject){return this.end(function(err,res){err?reject(err):fulfill(res);});};/** + * Allow for extension + */exports.use=function use(fn){fn(this);return this;};/** + * Get request header `field`. + * Case-insensitive. + * + * @param {String} field + * @return {String} + * @api public + */exports.get=function(field){return this._header[field.toLowerCase()];};/** + * Get case-insensitive header `field` value. + * This is a deprecated internal API. Use `.get(field)` instead. + * + * (getHeader is no longer used internally by the superagent code base) + * + * @param {String} field + * @return {String} + * @api private + * @deprecated + */exports.getHeader=exports.get;/** + * Set header `field` to `val`, or multiple fields with one object. + * Case-insensitive. + * + * Examples: + * + * req.get('/') + * .set('Accept', 'application/json') + * .set('X-API-Key', 'foobar') + * .end(callback); + * + * req.get('/') + * .set({ Accept: 'application/json', 'X-API-Key': 'foobar' }) + * .end(callback); + * + * @param {String|Object} field + * @param {String} val + * @return {Request} for chaining + * @api public + */exports.set=function(field,val){if(isObject(field)){for(var key in field){this.set(key,field[key]);}return this;}this._header[field.toLowerCase()]=val;this.header[field]=val;return this;};/** + * Remove header `field`. + * Case-insensitive. + * + * Example: + * + * req.get('/') + * .unset('User-Agent') + * .end(callback); + * + * @param {String} field + */exports.unset=function(field){delete this._header[field.toLowerCase()];delete this.header[field];return this;};/** + * Write the field `name` and `val` for "multipart/form-data" + * request bodies. + * + * ``` js + * request.post('/upload') + * .field('foo', 'bar') + * .end(callback); + * ``` + * + * @param {String} name + * @param {String|Blob|File|Buffer|fs.ReadStream} val + * @return {Request} for chaining + * @api public + */exports.field=function(name,val){this._getFormData().append(name,val);return this;};},{"./is-object":15}],17:[function(require,module,exports){// The node and browser modules expose versions of this with the +// appropriate constructor function bound as first argument +/** + * Issue a request: + * + * Examples: + * + * request('GET', '/users').end(callback) + * request('/users').end(callback) + * request('/users', callback) + * + * @param {String} method + * @param {String|Function} url or callback + * @return {Request} + * @api public + */function request(RequestConstructor,method,url){// callback +if('function'==typeof url){return new RequestConstructor('GET',method).end(url);}// url first +if(2==arguments.length){return new RequestConstructor('GET',method);}return new RequestConstructor(method,url);}module.exports=request;},{}],18:[function(require,module,exports){/*! https://mths.be/punycode v1.3.2 by @mathias, modified for URI.js */var punycode=function(){/** + * The `punycode` object. + * @name punycode + * @type Object + */var punycode,/** Highest positive signed 32-bit float value */maxInt=2147483647,// aka. 0x7FFFFFFF or 2^31-1 +/** Bootstring parameters */base=36,tMin=1,tMax=26,skew=38,damp=700,initialBias=72,initialN=128,// 0x80 +delimiter='-',// '\x2D' +/** Regular expressions */regexPunycode=/^xn--/,regexNonASCII=/[^\x20-\x7E]/,// unprintable ASCII chars + non-ASCII chars +regexSeparators=/[\x2E\u3002\uFF0E\uFF61]/g,// RFC 3490 separators +/** Error messages */errors={'overflow':'Overflow: input needs wider integers to process','not-basic':'Illegal input >= 0x80 (not a basic code point)','invalid-input':'Invalid input'},/** Convenience shortcuts */baseMinusTMin=base-tMin,floor=Math.floor,stringFromCharCode=String.fromCharCode,/** Temporary variable */key;/*--------------------------------------------------------------------------*//** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */function error(type){throw new RangeError(errors[type]);}/** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */function map(array,fn){var length=array.length;var result=[];while(length--){result[length]=fn(array[length]);}return result;}/** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */function mapDomain(string,fn){var parts=string.split('@');var result='';if(parts.length>1){// In email addresses, only the domain name should be punycoded. Leave +// the local part (i.e. everything up to `@`) intact. +result=parts[0]+'@';string=parts[1];}// Avoid `split(regex)` for IE8 compatibility. See #17. +string=string.replace(regexSeparators,'\x2E');var labels=string.split('.');var encoded=map(labels,fn).join('.');return result+encoded;}/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */function ucs2decode(string){var output=[],counter=0,length=string.length,value,extra;while(counter=0xD800&&value<=0xDBFF&&counter0xFFFF){value-=0x10000;output+=stringFromCharCode(value>>>10&0x3FF|0xD800);value=0xDC00|value&0x3FF;}output+=stringFromCharCode(value);return output;}).join('');}/** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */function basicToDigit(codePoint){if(codePoint-48<10){return codePoint-22;}if(codePoint-65<26){return codePoint-65;}if(codePoint-97<26){return codePoint-97;}return base;}/** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */function digitToBasic(digit,flag){// 0..25 map to ASCII a..z or A..Z +// 26..35 map to ASCII 0..9 +return digit+22+75*(digit<26)-((flag!=0)<<5);}/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */function adapt(delta,numPoints,firstTime){var k=0;delta=firstTime?floor(delta/damp):delta>>1;delta+=floor(delta/numPoints);for(;/* no initialization */delta>baseMinusTMin*tMax>>1;k+=base){delta=floor(delta/baseMinusTMin);}return floor(k+(baseMinusTMin+1)*delta/(delta+skew));}/** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */function decode(input){// Don't use UCS-2 +var output=[],inputLength=input.length,out,i=0,n=initialN,bias=initialBias,basic,j,index,oldi,w,k,digit,t,/** Cached calculation results */baseMinusT;// Handle the basic code points: let `basic` be the number of input code +// points before the last delimiter, or `0` if there is none, then copy +// the first basic code points to the output. +basic=input.lastIndexOf(delimiter);if(basic<0){basic=0;}for(j=0;j=0x80){error('not-basic');}output.push(input.charCodeAt(j));}// Main decoding loop: start just after the last delimiter if any basic code +// points were copied; start at the beginning otherwise. +for(index=basic>0?basic+1:0;index=inputLength){error('invalid-input');}digit=basicToDigit(input.charCodeAt(index++));if(digit>=base||digit>floor((maxInt-i)/w)){error('overflow');}i+=digit*w;t=k<=bias?tMin:k>=bias+tMax?tMax:k-bias;if(digitfloor(maxInt/baseMinusT)){error('overflow');}w*=baseMinusT;}out=output.length+1;bias=adapt(i-oldi,out,oldi==0);// `i` was supposed to wrap around from `out` to `0`, +// incrementing `n` each time, so we'll fix that now: +if(floor(i/out)>maxInt-n){error('overflow');}n+=floor(i/out);i%=out;// Insert `n` at position `i` of the output +output.splice(i++,0,n);}return ucs2encode(output);}/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */function encode(input){var n,delta,handledCPCount,basicLength,bias,j,m,q,k,t,currentValue,output=[],/** `inputLength` will hold the number of code points in `input`. */inputLength,/** Cached calculation results */handledCPCountPlusOne,baseMinusT,qMinusT;// Convert the input in UCS-2 to Unicode +input=ucs2decode(input);// Cache the length +inputLength=input.length;// Initialize the state +n=initialN;delta=0;bias=initialBias;// Handle the basic code points +for(j=0;j=n&¤tValue state to , +// but guard against overflow +handledCPCountPlusOne=handledCPCount+1;if(m-n>floor((maxInt-delta)/handledCPCountPlusOne)){error('overflow');}delta+=(m-n)*handledCPCountPlusOne;n=m;for(j=0;jmaxInt){error('overflow');}if(currentValue==n){// Represent delta as a generalized variable-length integer +for(q=delta,k=base;;/* no condition */k+=base){t=k<=bias?tMin:k>=bias+tMax?tMax:k-bias;if(q + * @memberOf punycode + * @type Object + */ucs2:{decode:ucs2decode,encode:ucs2encode},decode:decode,encode:encode,toASCII:toASCII,toUnicode:toUnicode};return punycode;}();if(typeof COMPILED==="undefined"&&typeof module!=="undefined")module.exports=punycode;},{}],19:[function(require,module,exports){/// +require("./schemes/http");require("./schemes/urn");require("./schemes/mailto");},{"./schemes/http":20,"./schemes/mailto":21,"./schemes/urn":22}],20:[function(require,module,exports){/// +if(typeof COMPILED==="undefined"&&typeof URI==="undefined"&&typeof require==="function")var URI=require("../uri");URI.SCHEMES["http"]=URI.SCHEMES["https"]={domainHost:true,parse:function parse(components,options){//report missing host +if(!components.host){components.error=components.error||"HTTP URIs must have a host.";}return components;},serialize:function serialize(components,options){//normalize the default port +if(components.port===(String(components.scheme).toLowerCase()!=="https"?80:443)||components.port===""){components.port=undefined;}//normalize the empty path +if(!components.path){components.path="/";}//NOTE: We do not parse query strings for HTTP URIs +//as WWW Form Url Encoded query strings are part of the HTML4+ spec, +//and not the HTTP spec. +return components;}};},{"../uri":23}],21:[function(require,module,exports){/// +if(typeof COMPILED==="undefined"&&typeof URI==="undefined"&&typeof require==="function"){var URI=require("../uri"),punycode=require("../punycode");}(function(){function merge(){var sets=[];for(var _i=0;_i1){sets[0]=sets[0].slice(0,-1);var xl=sets.length-1;for(var x=1;x ASCII IDN +try{addr[1]=punycode.toASCII(URI.unescapeComponent(addr[1],options).toLowerCase());}catch(e){components.error=components.error||"Email address's domain name can not be converted to ASCII via punycode: "+e;}}else{addr[1]=URI.unescapeComponent(addr[1],options).toLowerCase();}to[x]=addr.join("@");}return components;},serialize:function serialize(components,options){var to=toArray(components.to);if(to){for(var x=0,xl=to.length;x +if(typeof COMPILED==="undefined"&&typeof URI==="undefined"&&typeof require==="function")var URI=require("../uri");(function(){var pctEncChar=URI.pctEncChar,NID$="(?:[0-9A-Za-z][0-9A-Za-z\\-]{1,31})",PCT_ENCODED$="(?:\\%[0-9A-Fa-f]{2})",TRANS$$="[0-9A-Za-z\\(\\)\\+\\,\\-\\.\\:\\=\\@\\;\\$\\_\\!\\*\\'\\/\\?\\#]",NSS$="(?:(?:"+PCT_ENCODED$+"|"+TRANS$$+")+)",URN_SCHEME=new RegExp("^urn\\:("+NID$+")$"),URN_PATH=new RegExp("^("+NID$+")\\:("+NSS$+")$"),URN_PARSE=/^([^\:]+)\:(.*)/,URN_EXCLUDED=/[\x00-\x20\\\"\&\<\>\[\]\^\`\{\|\}\~\x7F-\xFF]/g,UUID=/^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/;//RFC 2141 +URI.SCHEMES["urn"]={parse:function parse(components,options){var matches=components.path.match(URN_PATH),scheme,schemeHandler;if(!matches){if(!options.tolerant){components.error=components.error||"URN is not strictly valid.";}matches=components.path.match(URN_PARSE);}if(matches){scheme="urn:"+matches[1].toLowerCase();schemeHandler=URI.SCHEMES[scheme];//in order to serialize properly, +//every URN must have a serializer that calls the URN serializer +if(!schemeHandler){//create fake scheme handler +schemeHandler=URI.SCHEMES[scheme]={parse:function parse(components,options){return components;},serialize:URI.SCHEMES["urn"].serialize};}components.scheme=scheme;components.path=matches[2];components=schemeHandler.parse(components,options);}else{components.error=components.error||"URN can not be parsed.";}return components;},serialize:function serialize(components,options){var scheme=components.scheme||options.scheme,matches;if(scheme&&scheme!=="urn"){var matches=scheme.match(URN_SCHEME);if(!matches){matches=["urn:"+scheme,scheme];}components.scheme="urn";components.path=matches[1]+":"+(components.path?components.path.replace(URN_EXCLUDED,pctEncChar):"");}return components;}};//RFC 4122 +URI.SCHEMES["urn:uuid"]={parse:function parse(components,options){if(!options.tolerant&&(!components.path||!components.path.match(UUID))){components.error=components.error||"UUID is not valid.";}return components;},serialize:function serialize(components,options){//ensure UUID is valid +if(!options.tolerant&&(!components.path||!components.path.match(UUID))){//invalid UUIDs can not have this scheme +components.scheme=undefined;}else{//normalize UUID +components.path=(components.path||"").toLowerCase();}return URI.SCHEMES["urn"].serialize(components,options);}};})();},{"../uri":23}],23:[function(require,module,exports){/** + * URI.js + * + * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript. + * @author Gary Court + * @version 2.0.0 + * @see http://github.com/garycourt/uri-js + * @license URI.js v2.0.0 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js + *//** + * Copyright 2011 Gary Court. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gary Court. + *//// +/// +/** + * Compiler switch for indicating code is compiled + * @define {boolean} + */var COMPILED=false;/** + * Compiler switch for supporting IRI URIs + * @define {boolean} + */var URI__IRI_SUPPORT=true;/** + * Compiler switch for supporting URI validation + * @define {boolean} + */var URI__VALIDATE_SUPPORT=true;var URI=function(){function merge(){var sets=[];for(var _i=0;_i1){sets[0]=sets[0].slice(0,-1);var xl=sets.length-1;for(var x=1;x>6|192).toString(16).toUpperCase()+"%"+(c&63|128).toString(16).toUpperCase();else e="%"+(c>>12|224).toString(16).toUpperCase()+"%"+(c>>6&63|128).toString(16).toUpperCase()+"%"+(c&63|128).toString(16).toUpperCase();return e;}function pctDecChars(str){var newStr="",i=0,il=str.length,c,c2,c3;while(i=194&&c<224){if(il-i>=6){c2=parseInt(str.substr(i+4,2),16);newStr+=String.fromCharCode((c&31)<<6|c2&63);}else{newStr+=str.substr(i,6);}i+=6;}else if(c>=224){if(il-i>=9){c2=parseInt(str.substr(i+4,2),16);c3=parseInt(str.substr(i+7,2),16);newStr+=String.fromCharCode((c&15)<<12|(c2&63)<<6|c3&63);}else{newStr+=str.substr(i,9);}i+=9;}else{newStr+=str.substr(i,3);i+=3;}}return newStr;}function typeOf(o){return o===undefined?"undefined":o===null?"null":Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase();}function toUpperCase(str){return str.toUpperCase();}var SCHEMES={};function _normalizeComponentEncoding(components,protocol){function decodeUnreserved(str){var decStr=pctDecChars(str);return!decStr.match(protocol.UNRESERVED)?str:decStr;}if(components.scheme)components.scheme=String(components.scheme).replace(protocol.PCT_ENCODED,decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME,"");if(components.userinfo!==undefined)components.userinfo=String(components.userinfo).replace(protocol.PCT_ENCODED,decodeUnreserved).replace(protocol.NOT_USERINFO,pctEncChar).replace(protocol.PCT_ENCODED,toUpperCase);if(components.host!==undefined)components.host=String(components.host).replace(protocol.PCT_ENCODED,decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST,pctEncChar).replace(protocol.PCT_ENCODED,toUpperCase);if(components.path!==undefined)components.path=String(components.path).replace(protocol.PCT_ENCODED,decodeUnreserved).replace(components.scheme?protocol.NOT_PATH:protocol.NOT_PATH_NOSCHEME,pctEncChar).replace(protocol.PCT_ENCODED,toUpperCase);if(components.query!==undefined)components.query=String(components.query).replace(protocol.PCT_ENCODED,decodeUnreserved).replace(protocol.NOT_QUERY,pctEncChar).replace(protocol.PCT_ENCODED,toUpperCase);if(components.fragment!==undefined)components.fragment=String(components.fragment).replace(protocol.PCT_ENCODED,decodeUnreserved).replace(protocol.NOT_FRAGMENT,pctEncChar).replace(protocol.PCT_ENCODED,toUpperCase);return components;};function parse(uriString,options){if(options===void 0){options={};}var protocol=URI__IRI_SUPPORT&&options.iri!==false?IRI_PROTOCOL:URI_PROTOCOL,matches,parseError=false,components={},schemeHandler;if(options.reference==="suffix")uriString=(options.scheme?options.scheme+":":"")+"//"+uriString;if(URI__VALIDATE_SUPPORT){matches=uriString.match(protocol.URI_REF);if(matches){if(matches[1]){//generic URI +matches=matches.slice(1,10);}else{//relative URI +matches=matches.slice(10,19);}}if(!matches){parseError=true;if(!options.tolerant)components.error=components.error||"URI is not strictly valid.";matches=uriString.match(URI_PARSE);}}else{matches=uriString.match(URI_PARSE);}if(matches){if(NO_MATCH_IS_UNDEFINED){//store each component +components.scheme=matches[1];//components.authority = matches[2]; +components.userinfo=matches[3];components.host=matches[4];components.port=parseInt(matches[5],10);components.path=matches[6]||"";components.query=matches[7];components.fragment=matches[8];//fix port number +if(isNaN(components.port)){components.port=matches[5];}}else{//store each component +components.scheme=matches[1]||undefined;//components.authority = (uriString.indexOf("//") !== -1 ? matches[2] : undefined); +components.userinfo=uriString.indexOf("@")!==-1?matches[3]:undefined;components.host=uriString.indexOf("//")!==-1?matches[4]:undefined;components.port=parseInt(matches[5],10);components.path=matches[6]||"";components.query=uriString.indexOf("?")!==-1?matches[7]:undefined;components.fragment=uriString.indexOf("#")!==-1?matches[8]:undefined;//fix port number +if(isNaN(components.port)){components.port=uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?matches[4]:undefined;}}//determine reference type +if(components.scheme===undefined&&components.userinfo===undefined&&components.host===undefined&&components.port===undefined&&!components.path&&components.query===undefined){components.reference="same-document";}else if(components.scheme===undefined){components.reference="relative";}else if(components.fragment===undefined){components.reference="absolute";}else{components.reference="uri";}//check for reference errors +if(options.reference&&options.reference!=="suffix"&&options.reference!==components.reference){components.error=components.error||"URI is not a "+options.reference+" reference.";}//find scheme handler +schemeHandler=SCHEMES[(options.scheme||components.scheme||"").toLowerCase()];//check if scheme can't handle IRIs +if(URI__IRI_SUPPORT&&typeof punycode!=="undefined"&&!options.unicodeSupport&&(!schemeHandler||!schemeHandler.unicodeSupport)){//if host component is a domain name +if(components.host&&(options.domainHost||schemeHandler&&schemeHandler.domainHost)){//convert Unicode IDN -> ASCII IDN +try{components.host=punycode.toASCII(components.host.replace(protocol.PCT_ENCODED,pctDecChars).toLowerCase());}catch(e){components.error=components.error||"Host's domain name can not be converted to ASCII via punycode: "+e;}}//convert IRI -> URI +_normalizeComponentEncoding(components,URI_PROTOCOL);}else{//normalize encodings +_normalizeComponentEncoding(components,protocol);}//perform scheme specific parsing +if(schemeHandler&&schemeHandler.parse){schemeHandler.parse(components,options);}}else{parseError=true;components.error=components.error||"URI can not be parsed.";}return components;};function _recomposeAuthority(components,options){var uriTokens=[];if(components.userinfo!==undefined){uriTokens.push(components.userinfo);uriTokens.push("@");}if(components.host!==undefined){uriTokens.push(components.host);}if(typeof components.port==="number"){uriTokens.push(":");uriTokens.push(components.port.toString(10));}return uriTokens.length?uriTokens.join(""):undefined;};function removeDotSegments(input){var output=[],s;while(input.length){if(input.match(RDS1)){input=input.replace(RDS1,"");}else if(input.match(RDS2)){input=input.replace(RDS2,"/");}else if(input.match(RDS3)){input=input.replace(RDS3,"/");output.pop();}else if(input==="."||input===".."){input="";}else{s=input.match(RDS5)[0];input=input.slice(s.length);output.push(s);}}return output.join("");};function serialize(components,options){if(options===void 0){options={};}var protocol=URI__IRI_SUPPORT&&options.iri?IRI_PROTOCOL:URI_PROTOCOL,uriTokens=[],schemeHandler,authority,s;//find scheme handler +schemeHandler=SCHEMES[(options.scheme||components.scheme||"").toLowerCase()];//perform scheme specific serialization +if(schemeHandler&&schemeHandler.serialize)schemeHandler.serialize(components,options);//if host component is a domain name +if(URI__IRI_SUPPORT&&typeof punycode!=="undefined"&&components.host&&(options.domainHost||schemeHandler&&schemeHandler.domainHost)){//convert IDN via punycode +try{components.host=!options.iri?punycode.toASCII(components.host.replace(protocol.PCT_ENCODED,pctDecChars).toLowerCase()):punycode.toUnicode(components.host);}catch(e){components.error=components.error||"Host's domain name can not be converted to "+(!options.iri?"ASCII":"Unicode")+" via punycode: "+e;}}//normalize encoding +_normalizeComponentEncoding(components,protocol);if(options.reference!=="suffix"&&components.scheme){uriTokens.push(components.scheme);uriTokens.push(":");}authority=_recomposeAuthority(components,options);if(authority!==undefined){if(options.reference!=="suffix"){uriTokens.push("//");}uriTokens.push(authority);if(components.path&&components.path.charAt(0)!=="/"){uriTokens.push("/");}}if(components.path!==undefined){s=components.path;if(!options.absolutePath&&(!schemeHandler||!schemeHandler.absolutePath)){s=removeDotSegments(s);}if(authority===undefined){s=s.replace(/^\/\//,"/%2F");//don't allow the path to start with "//" +}uriTokens.push(s);}if(components.query!==undefined){uriTokens.push("?");uriTokens.push(components.query);}if(components.fragment!==undefined){uriTokens.push("#");uriTokens.push(components.fragment);}return uriTokens.join('');//merge tokens into a string +};function resolveComponents(base,relative,options,skipNormalization){if(options===void 0){options={};}var target={};if(!skipNormalization){base=parse(serialize(base,options),options);//normalize base components +relative=parse(serialize(relative,options),options);//normalize relative components +}options=options||{};if(!options.tolerant&&relative.scheme){target.scheme=relative.scheme;//target.authority = relative.authority; +target.userinfo=relative.userinfo;target.host=relative.host;target.port=relative.port;target.path=removeDotSegments(relative.path);target.query=relative.query;}else{if(relative.userinfo!==undefined||relative.host!==undefined||relative.port!==undefined){//target.authority = relative.authority; +target.userinfo=relative.userinfo;target.host=relative.host;target.port=relative.port;target.path=removeDotSegments(relative.path);target.query=relative.query;}else{if(!relative.path){target.path=base.path;if(relative.query!==undefined){target.query=relative.query;}else{target.query=base.query;}}else{if(relative.path.charAt(0)==="/"){target.path=removeDotSegments(relative.path);}else{if((base.userinfo!==undefined||base.host!==undefined||base.port!==undefined)&&!base.path){target.path="/"+relative.path;}else if(!base.path){target.path=relative.path;}else{target.path=base.path.slice(0,base.path.lastIndexOf("/")+1)+relative.path;}target.path=removeDotSegments(target.path);}target.query=relative.query;}//target.authority = base.authority; +target.userinfo=base.userinfo;target.host=base.host;target.port=base.port;}target.scheme=base.scheme;}target.fragment=relative.fragment;return target;};function resolve(baseURI,relativeURI,options){return serialize(resolveComponents(parse(baseURI,options),parse(relativeURI,options),options,true),options);};function normalize(uri,options){if(typeof uri==="string"){uri=serialize(parse(uri,options),options);}else if(typeOf(uri)==="object"){uri=parse(serialize(uri,options),options);}return uri;};function equal(uriA,uriB,options){if(typeof uriA==="string"){uriA=serialize(parse(uriA,options),options);}else if(typeOf(uriA)==="object"){uriA=serialize(uriA,options);}if(typeof uriB==="string"){uriB=serialize(parse(uriB,options),options);}else if(typeOf(uriB)==="object"){uriB=serialize(uriB,options);}return uriA===uriB;};function escapeComponent(str,options){return str&&str.toString().replace(!URI__IRI_SUPPORT||!options||!options.iri?URI_PROTOCOL.ESCAPE:IRI_PROTOCOL.ESCAPE,pctEncChar);};function unescapeComponent(str,options){return str&&str.toString().replace(!URI__IRI_SUPPORT||!options||!options.iri?URI_PROTOCOL.PCT_ENCODED:IRI_PROTOCOL.PCT_ENCODED,pctDecChars);};return{IRI_SUPPORT:URI__IRI_SUPPORT,VALIDATE_SUPPORT:URI__VALIDATE_SUPPORT,pctEncChar:pctEncChar,pctDecChars:pctDecChars,SCHEMES:SCHEMES,parse:parse,_recomposeAuthority:_recomposeAuthority,removeDotSegments:removeDotSegments,serialize:serialize,resolveComponents:resolveComponents,resolve:resolve,normalize:normalize,equal:equal,escapeComponent:escapeComponent,unescapeComponent:unescapeComponent};}();if(!COMPILED&&typeof module!=="undefined"&&typeof require==="function"){var punycode=require("./punycode");module.exports=URI;require("./schemes");}},{"./punycode":18,"./schemes":19}]},{},[1])(1);}); /***/ }), /* 6 */ @@ -1794,15 +2280,15 @@ function merge(lookup, form, ignore, options, readonly, asyncTemplates) { /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lib_json_refs_standalone_min__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lib_json_refs_standalone_min___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__lib_json_refs_standalone_min__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lib_json_refs_standalone__ = __webpack_require__(5); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lib_json_refs_standalone___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__lib_json_refs_standalone__); /* harmony export (immutable) */ __webpack_exports__["a"] = jsonref; function jsonref(schema, callBack) { var promise = new Promise(function (resolve, reject) { - __WEBPACK_IMPORTED_MODULE_0__lib_json_refs_standalone_min__["resolveRefs"](schema, { - "filter": ['relative', 'local'] + __WEBPACK_IMPORTED_MODULE_0__lib_json_refs_standalone__["resolveRefs"](schema, { + "filter": ['relative', 'local', 'remote'] }).then(function (res) { resolve(res.resolved); }).catch(function (err) { diff --git a/dist/json-schema-form-core.js.map b/dist/json-schema-form-core.js.map index ac72be6..2b5564e 100644 --- a/dist/json-schema-form-core.js.map +++ b/dist/json-schema-form-core.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap e8f18493d2f2aec0ee09","webpack:///./src/lib/sf-path.js","webpack:///./src/lib/canonical-title-map.js","webpack:///./~/objectpath/index.js","webpack:///./src/lib/schema-defaults.js","webpack:///./src/module.js","webpack:///./lib/json-refs-standalone-min.js","webpack:///./src/lib/merge.js","webpack:///./src/lib/resolve.js","webpack:///./src/lib/select.js","webpack:///./src/lib/traverse.js","webpack:///./src/lib/validate.js","webpack:///./~/objectpath/lib/ObjectPath.js","webpack:///external \"tv4\""],"names":["name","key","separator","formName","omitNumbers","fieldKey","slice","fieldSeparator","filter","currentKey","length","join","titleMap","originalEnum","Array","isArray","canonical","forEach","value","push","Object","keys","stripNullType","type","enumToTitleMap","enm","defaultFormDefinition","schemaTypes","schema","options","rules","def","innerDefaultFormDefinition","childName","childSchema","childOptions","i","assign","stdFormObj","f","global","formDefaults","supressPropertyTitles","title","description","required","maxLength","maxlength","minLength","minlength","readOnly","readonly","minimum","exclusiveMinimum","maximum","exclusiveMaximum","validationMessage","enumNames","canonicalTitleMap","ngModelOptions","text","path","lookup","stringify","number","integer","checkbox","select","checkboxes","items","fieldset","defaultFormDef","properties","ignore","indexOf","array","arrPath","createDefaults","string","object","boolean","defaultForm","defaultSchemaTypes","globalOptions","form","Error","sfPath","schemaDefaults","e","exports","module","t","window","self","JsonRefs","r","n","o","s","a","u","require","c","code","call","d","N","parse","F","m","M","reference","U","query","fragment","q","serialize","p","h","l","y","error","message","missing","subDocPath","relativeBase","dirname","Promise","resolve","j","O","S","charAt","reverse","documents","v","g","b","E","w","concat","refs","L","uri","ancestorPtrs","indirect","then","uriDetails","decodeURI","circular","k","loaderOptions","processContent","JSON","I","load","$ref","prototype","toString","includeInvalid","encodeURI","pop","TypeError","refPreProcessor","refPostProcessor","_","replace","x","map","C","T","P","$","warning","match","H","A","split","shift","D","sort","resolved","R","clearCache","decodePath","encodePath","findRefs","findRefsAt","getRefDetails","isPtr","isRef","pathFromPtr","pathToPtr","resolveRefs","resolveRefsAt","querystring","slash","on","addEventListener","_callbacks","once","off","apply","arguments","fn","removeListener","removeAllListeners","removeEventListener","splice","emit","listeners","hasListeners","amd","add","drain","chain","state","success","failure","reject","msg","promise","triggered","__NPO__","constructor","setImmediate","setTimeout","defineProperty","writable","configurable","next","unshift","exec","cwd","normalize","isAbsolute","relative","substr","Math","min","sep","delimiter","basename","extname","_process","file","http","https","importScripts","getBase","buffer","end","method","toLowerCase","prepareRequest","superagent","run","clearTimeout","fun","nextTick","browser","env","argv","version","versions","addListener","binding","chdir","umask","hasOwnProperty","maxKeys","decodeURIComponent","isFinite","encodeURIComponent","decode","encode","test","req","xhr","responseType","responseText","statusText","setStatusProperties","status","header","headers","getAllResponseHeaders","getResponseHeader","setHeaderProperties","body","parseBody","response","_query","url","_header","original","rawResponse","statusCode","callback","bind","getXHR","XMLHttpRequest","location","protocol","ActiveXObject","trim","serializeObject","parseString","types","html","json","xml","urlencoded","get","statusType","info","ok","clientError","serverError","toError","accepted","noContent","badRequest","unauthorized","notAcceptable","notFound","forbidden","Response","abort","aborted","set","_responseType","accept","auth","btoa","username","password","attach","_getFormData","append","_formData","FormData","send","_data","console","warn","_parser","_callback","crossDomainError","crossDomain","timeoutError","_timeout","timeout","withCredentials","_withCredentials","onreadystatechange","readyState","timedout","total","percent","loaded","direction","onprogress","upload","_timer","open","setRequestHeader","Request","head","del","patch","post","put","emitter","reduce","use","getHeader","unset","field","RangeError","charCodeAt","lastIndexOf","overflow","floor","String","fromCharCode","ucs2","toASCII","toUnicode","COMPILED","SCHEMES","domainHost","host","port","scheme","toUpperCase","pctDecChars","callee","setInterval","IRI_SUPPORT","VALIDATE_SUPPORT","RegExp","mailto","to","subject","unescapeComponent","unicodeSupport","pctEncChar","iri","urn","tolerant","URI_REF","NOT_SCHEME","NOT_USERINFO","NOT_HOST","NOT_PATH","NOT_PATH_NOSCHEME","NOT_QUERY","NOT_FRAGMENT","ESCAPE","UNRESERVED","OTHER_CHARS","PCT_ENCODED","parseInt","userinfo","isNaN","absolutePath","_recomposeAuthority","removeDotSegments","resolveComponents","equal","escapeComponent","merge","asyncTemplates","formItems","formItemRest","idx","stdForm","idxRest","defaultFormLookup","formKeys","obj","element","undefined","isInside","strid","attr","tabs","tab","template","templateUrl","jsonref","callBack","res","catch","err","numRe","projection","valueToSet","parts","tmp","traverseSchema","ignoreArrays","traverse","schemaObject","processorFunction","pathArray","currentPath","traverseForm","validate","valid","wrap","propName","valueWrap","tv4","validateResult"],"mappings":"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","file":"json-schema-form-core.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 13);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e8f18493d2f2aec0ee09","export { parse } from 'objectpath';\r\nexport { stringify } from 'objectpath';\r\nexport { normalize } from 'objectpath';\r\n\r\n/**\r\n * I am a name formatter function for processing keys into names for classes or Id.\r\n *\r\n * @param {Array} key I am the key array of a processed schema key\r\n * @param {string} separator I am the separator between the key items and optional form name\r\n * @param {string} formName I am an optional form name\r\n * @param {boolean} omitNumbers I determine if numeric values should be included in the output or withheld\r\n *\r\n * @return {string} I am the formatted key\r\n */\r\nexport function name (key: Array, separator?: string, formName = '', omitNumbers = false) {\r\n if (key) {\r\n let fieldKey = key.slice();\r\n let fieldSeparator = separator || '-';\r\n\r\n if (omitNumbers) {\r\n fieldKey = fieldKey.filter(function(currentKey: any) {\r\n return typeof currentKey !== 'number';\r\n });\r\n };\r\n\r\n return ((formName.length !== 0)\r\n ? formName + fieldSeparator\r\n : ''\r\n ) + fieldKey.join(fieldSeparator);\r\n };\r\n\r\n return '';\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/sf-path.js","// Takes a titleMap in either object or list format and returns one\r\n// in the list format.\r\nexport default function(titleMap: Array, originalEnum?: any) {\r\n if (!Array.isArray(titleMap)) {\r\n const canonical = [];\r\n if (originalEnum) {\r\n originalEnum.forEach((value) => {\r\n canonical.push({ name: titleMap[value], value });\r\n });\r\n }\r\n else {\r\n Object.keys(titleMap).forEach((value) => {\r\n canonical.push({ name: titleMap[value], value });\r\n });\r\n }\r\n return canonical;\r\n }\r\n return titleMap;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/canonical-title-map.js","module.exports = require('./lib/ObjectPath.js').ObjectPath;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/objectpath/index.js\n// module id = 2\n// module chunks = 0","import { stringify } from './sf-path';\r\nimport canonicalTitleMap from './canonical-title-map';\r\n\r\n/* Utils */\r\nconst stripNullType = (type) => {\r\n if (Array.isArray(type) && type.length === 2) {\r\n if (type[0] === 'null') {\r\n return type[1];\r\n };\r\n if (type[1] === 'null') {\r\n return type[0];\r\n };\r\n };\r\n return type;\r\n};\r\n\r\n// Creates an default titleMap list from an enum, i.e. a list of strings.\r\nconst enumToTitleMap = (enm) => {\r\n const titleMap = []; // canonical titleMap format is a list.\r\n enm.forEach((name) => {\r\n titleMap.push({ name, value: name });\r\n });\r\n return titleMap;\r\n};\r\n\r\n/**\r\n * Creates a default form definition from a schema.\r\n */\r\nexport function defaultFormDefinition(schemaTypes, name, schema, options) {\r\n const rules = schemaTypes[stripNullType(schema.type)];\r\n if (rules) {\r\n let def;\r\n // We give each rule a possibility to recurse it's children.\r\n const innerDefaultFormDefinition = (childName, childSchema , childOptions) =>\r\n defaultFormDefinition(schemaTypes, childName, childSchema, childOptions);\r\n for (let i = 0; i < rules.length; i++) {\r\n def = rules[i](name, schema, options, innerDefaultFormDefinition);\r\n\r\n // first handler in list that actually returns something is our handler!\r\n if (def) {\r\n\r\n // Do we have form defaults in the schema under the x-schema-form-attribute?\r\n if (def.schema['x-schema-form']) {\r\n Object.assign(def, def.schema['x-schema-form']);\r\n }\r\n\r\n return def;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates a form object with all common properties\r\n */\r\nexport function stdFormObj(name, schema, options) {\r\n options = options || {};\r\n\r\n // The Object.assign used to be a angular.copy. Should work though.\r\n const f = options.global && options.global.formDefaults ?\r\n Object.assign({}, options.global.formDefaults) : {};\r\n if (options.global && options.global.supressPropertyTitles === true) {\r\n f.title = schema.title;\r\n }\r\n else {\r\n f.title = schema.title || name;\r\n }\r\n\r\n if (schema.description) { f.description = schema.description; }\r\n if (options.required === true || schema.required === true) { f.required = true; }\r\n if (schema.maxLength) { f.maxlength = schema.maxLength; }\r\n if (schema.minLength) { f.minlength = schema.minLength; }\r\n if (schema.readOnly || schema.readonly) { f.readonly = true; }\r\n if (schema.minimum) { f.minimum = schema.minimum + (schema.exclusiveMinimum ? 1 : 0); }\r\n if (schema.maximum) { f.maximum = schema.maximum - (schema.exclusiveMaximum ? 1 : 0); }\r\n\r\n // Non standard attributes (DONT USE DEPRECATED)\r\n // If you must set stuff like this in the schema use the x-schema-form attribute\r\n if (schema.validationMessage) { f.validationMessage = schema.validationMessage; }\r\n if (schema.enumNames) { f.titleMap = canonicalTitleMap(schema.enumNames, schema['enum']); }\r\n f.schema = schema;\r\n\r\n // Ng model options doesn't play nice with undefined, might be defined\r\n // globally though\r\n f.ngModelOptions = f.ngModelOptions || {};\r\n\r\n return f;\r\n};\r\n\r\n/*** Schema types to form type mappings, with defaults ***/\r\nexport function text(name, schema, options) {\r\n if (stripNullType(schema.type) === 'string' && !schema['enum']) {\r\n const f = stdFormObj(name, schema, options);\r\n f.key = options.path;\r\n f.type = 'text';\r\n options.lookup[stringify(options.path)] = f;\r\n return f;\r\n }\r\n}\r\n\r\n// default in json form for number and integer is a text field\r\n// input type=\"number\" would be more suitable don't ya think?\r\nexport function number(name, schema, options) {\r\n if (stripNullType(schema.type) === 'number') {\r\n const f = stdFormObj(name, schema, options);\r\n f.key = options.path;\r\n f.type = 'number';\r\n options.lookup[stringify(options.path)] = f;\r\n return f;\r\n }\r\n}\r\n\r\nexport function integer(name, schema, options) {\r\n if (stripNullType(schema.type) === 'integer') {\r\n const f = stdFormObj(name, schema, options);\r\n f.key = options.path;\r\n f.type = 'number';\r\n options.lookup[stringify(options.path)] = f;\r\n return f;\r\n }\r\n}\r\n\r\nexport function checkbox(name, schema, options) {\r\n if (stripNullType(schema.type) === 'boolean') {\r\n const f = stdFormObj(name, schema, options);\r\n f.key = options.path;\r\n f.type = 'checkbox';\r\n options.lookup[stringify(options.path)] = f;\r\n return f;\r\n }\r\n}\r\n\r\nexport function select(name, schema, options) {\r\n if (stripNullType(schema.type) === 'string' && schema['enum']) {\r\n const f = stdFormObj(name, schema, options);\r\n f.key = options.path;\r\n f.type = 'select';\r\n if (!f.titleMap) {\r\n f.titleMap = enumToTitleMap(schema['enum']);\r\n }\r\n options.lookup[stringify(options.path)] = f;\r\n return f;\r\n }\r\n}\r\n\r\nexport function checkboxes(name, schema, options) {\r\n if (stripNullType(schema.type) === 'array' && schema.items && schema.items['enum']) {\r\n const f = stdFormObj(name, schema, options);\r\n f.key = options.path;\r\n f.type = 'checkboxes';\r\n if (!f.titleMap) {\r\n f.titleMap = enumToTitleMap(schema.items['enum']);\r\n }\r\n options.lookup[stringify(options.path)] = f;\r\n return f;\r\n }\r\n}\r\n\r\nexport function fieldset(name, schema, options, defaultFormDef) {\r\n if (stripNullType(schema.type) === 'object') {\r\n const f = stdFormObj(name, schema, options);\r\n f.type = 'fieldset';\r\n f.key = options.path;\r\n f.items = [];\r\n options.lookup[stringify(options.path)] = f;\r\n\r\n // recurse down into properties\r\n if (schema.properties) {\r\n Object.keys(schema.properties).forEach((key) => {\r\n const value = schema.properties[key];\r\n const path = options.path.slice();\r\n path.push(key);\r\n if (options.ignore[stringify(path)] !== true) {\r\n const required = schema.required && schema.required.indexOf(key) !== -1;\r\n\r\n const def = defaultFormDef(key, value, {\r\n path,\r\n required: required || false,\r\n lookup: options.lookup,\r\n ignore: options.ignore,\r\n global: options.global\r\n });\r\n if (def) {\r\n f.items.push(def);\r\n }\r\n }\r\n });\r\n }\r\n return f;\r\n }\r\n}\r\n\r\nexport function array(name, schema, options, defaultFormDef) {\r\n if (stripNullType(schema.type) === 'array') {\r\n const f = stdFormObj(name, schema, options);\r\n f.type = 'array';\r\n f.key = options.path;\r\n options.lookup[stringify(options.path)] = f;\r\n\r\n const required = schema.required &&\r\n schema.required.indexOf(options.path[options.path.length - 1]) !== -1;\r\n\r\n // The default is to always just create one child. This works since if the\r\n // schemas items declaration is of type: \"object\" then we get a fieldset.\r\n // We also follow json form notatation, adding empty brackets \"[]\" to\r\n // signify arrays.\r\n\r\n const arrPath = options.path.slice();\r\n arrPath.push('');\r\n\r\n f.items = [\r\n defaultFormDef(name, schema.items, {\r\n path: arrPath,\r\n required: required || false,\r\n lookup: options.lookup,\r\n ignore: options.ignore,\r\n global: options.global\r\n })\r\n ];\r\n\r\n return f;\r\n }\r\n}\r\n\r\nexport function createDefaults() {\r\n // First sorted by schema type then a list.\r\n // Order has importance. First handler returning an form snippet will be used.\r\n return {\r\n string: [ select, text ],\r\n object: [ fieldset ],\r\n number: [ number ],\r\n integer: [ integer ],\r\n boolean: [ checkbox ],\r\n array: [ checkboxes, array ]\r\n };\r\n};\r\n\r\n/**\r\n * Create form defaults from schema\r\n */\r\nexport function defaultForm(schema: any, defaultSchemaTypes: any, ignore?: any, globalOptions?: any) {\r\n const form = [];\r\n const lookup = {}; // Map path => form obj for fast lookup in merging\r\n ignore = ignore || {};\r\n globalOptions = globalOptions || {};\r\n defaultSchemaTypes = defaultSchemaTypes || createDefaults();\r\n\r\n if (schema.properties) {\r\n Object.keys(schema.properties).forEach((key) => {\r\n if (ignore[key] !== true) {\r\n const required = schema.required && schema.required.indexOf(key) !== -1;\r\n const def = defaultFormDefinition(defaultSchemaTypes, key, schema.properties[key], {\r\n path: [ key ], // Path to this property in bracket notation.\r\n lookup: lookup, // Extra map to register with. Optimization for merger.\r\n ignore: ignore, // The ignore list of paths (sans root level name)\r\n required: required, // Is it required? (v4 json schema style)\r\n global: globalOptions // Global options, including form defaults\r\n });\r\n if (def) {\r\n form.push(def);\r\n }\r\n }\r\n });\r\n }\r\n else {\r\n throw new Error('Not implemented. Only type \"object\" allowed at root level of schema.');\r\n }\r\n return { form: form, lookup: lookup };\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/schema-defaults.js","import * as schemaDefaultsImp from './lib/schema-defaults';\r\nimport * as sfPathImp from './lib/sf-path';\r\nimport canonicalTitleMapImp from './lib/canonical-title-map';\r\n\r\nexport { merge } from './lib/merge';\r\nexport { select } from './lib/select';\r\nexport { jsonref } from './lib/resolve';\r\nexport { traverseSchema, traverseForm } from './lib/traverse';\r\nexport { validate } from './lib/validate';\r\n\r\nexport const sfPath = sfPathImp;\r\nexport const schemaDefaults = schemaDefaultsImp;\r\nexport const canonicalTitleMap = canonicalTitleMapImp;\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/module.js","!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{var t;t=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,t.JsonRefs=e()}}(function(){var e;return function t(e,r,n){function o(s,a){if(!r[s]){if(!e[s]){var u=\"function\"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error(\"Cannot find module '\"+s+\"'\");throw c.code=\"MODULE_NOT_FOUND\",c}var f=r[s]={exports:{}};e[s][0].call(f.exports,function(t){var r=e[s][1][t];return o(r?r:t)},f,f.exports,t,e,r,n)}return r[s].exports}for(var i=\"function\"==typeof require&&require,s=0;s-1?n=i:(r=d(e,\"Undefined\")?void 0:m(e),d(r,\"Undefined\")?n=i:(n=r,n.path=F(U.join(r.path,i.path)),n.query=o(r.query,i.query))),n.fragment=void 0,(-1===M.indexOf(n.reference)&&0===n.path.indexOf(\"../\")?\"../\":\"\")+q.serialize(n)}function s(e,t){var r,n=[];return t.length>0&&(r=e,t.slice(0,t.length-1).forEach(function(e){e in r&&(r=r[e],n.push(r))})),n}function a(e,t,r,o,i,s,a,f,p){var h,l;if(r.length>0)try{h=c(t,r)}catch(y){\"remote\"===e&&(o.error=y.message,o.missing=!0)}else h=t;return d(h,\"Undefined\")||(o.value=h),d(h,\"Array\")||d(h,\"Object\")?(l=n(i),\"local\"===e?(delete l.subDocPath,t=h):(l.relativeBase=U.dirname(s[s.length-1]),0===r.length?delete l.subDocPath:l.subDocPath=r),u(t,l,s,a,f,p)):void 0}function u(e,t,r,n,o,s){var u=Promise.resolve(),c=n.length?j(n[n.length-1]):[],f=O(e,t),p=t.subDocPath||[],l=S(p),y=[\"#\"];return r.forEach(function(e,t){\"#\"!==e.charAt(0)&&y.push(n[t])}),y.reverse(),\"#\"!==(r[r.length-1]||\"\").charAt(0)&&(o.documents[S(c)]=e),Object.keys(f).forEach(function(v){var m,g,b,E,w=f[v];b=0===r.length?c.concat(j(v)):c.concat(j(v).slice(0===r.length?0:p.length)),E=S(b),d(o[E],\"Undefined\")&&(o.refs[E]=f[v],d(w.error,\"Undefined\")&&\"invalid\"!==w.type&&(L.indexOf(w.type)>-1?(m=i(t.relativeBase,w.uri),g=r.indexOf(m)):(m=w.uri,g=n.indexOf(m)),w.ancestorPtrs=y,w.indirect=s,-1===g?L.indexOf(w.type)>-1?u=u.then(function(){return h(m,t).then(function(e){return a(\"remote\",e,d(w.uriDetails.fragment,\"Undefined\")?[]:j(decodeURI(w.uriDetails.fragment)),w,t,r.concat(m),n.concat(E),o,s)})[\"catch\"](function(e){w.error=e.message,w.missing=!0})}):0!==E.indexOf(m+\"/\")&&E!==m&&0!==l.indexOf(m+\"/\")&&l!==m?0!==m.indexOf(l+\"/\")&&(u=u.then(function(){return a(\"local\",e,j(m),w,t,r.concat(m),n.concat(E),o,s||-1===m.indexOf(l+\"/\")&&m!==l)})):w.circular=!0:(n.slice(g).forEach(function(e){o.refs[e].circular=!0}),w.circular=!0)))}),u=u.then(function(){function e(i,s,a,u){Object.keys(o.refs).forEach(function(c){var f=o.refs[c];-1===n.indexOf(u)&&-1===r.indexOf(a)&&-1===t.indexOf(u)&&c!==a&&0===c.indexOf(u+\"/\")&&(s.indexOf(u)>-1?s.forEach(function(e){-1===t.indexOf(u)&&t.push(e)}):e(i.concat(a),s.concat(u),c,f.uri),r.push(a),n.push(u))})}var t=[],r=[],n=[];Object.keys(o.refs).forEach(function(r){var n=o.refs[r];\"local\"!==n.type||n.circular||-1!==t.indexOf(n.uri)||e([],[],r,n.uri)}),Object.keys(o.refs).forEach(function(e){var r=o.refs[e];t.indexOf(r.uri)>-1&&(r.circular=!0)})}).then(function(){return o})}function c(e,t){var r=e;return t.forEach(function(e){if(e=decodeURI(e),!(e in r))throw Error(\"JSON Pointer points to missing location: \"+S(t));r=r[e]}),r}function f(e){return Object.keys(e).filter(function(e){return\"$ref\"!==e})}function p(e){var t;switch(e.uriDetails.reference){case\"absolute\":case\"uri\":t=\"remote\";break;case\"same-document\":t=\"local\";break;default:t=e.uriDetails.reference}return t}function h(e,t){var r=k[e],o=Promise.resolve(),i=n(t.loaderOptions||{});return d(r,\"Undefined\")?(d(i.processContent,\"Undefined\")&&(i.processContent=function(e,t){t(void 0,JSON.parse(e.text))}),o=I.load(decodeURI(e),i),o=o.then(function(t){return k[e]={value:t},t})[\"catch\"](function(t){throw k[e]={error:t},t})):o=o.then(function(){return r.value}),o=o.then(function(e){return n(e)})}function l(e,t){var r=!0;try{if(!d(e,\"Object\"))throw new Error(\"obj is not an Object\");if(!d(e.$ref,\"String\"))throw new Error(\"obj.$ref is not a String\")}catch(n){if(t)throw n;r=!1}return r}function d(e,t){return\"Undefined\"===t?\"undefined\"==typeof e:Object.prototype.toString.call(e)===\"[object \"+t+\"]\"}function y(e){var t,r;return d(e.filter,\"Array\")||d(e.filter,\"String\")?(r=d(e.filter,\"String\")?[e.filter]:e.filter,t=function(e){return r.indexOf(e.type)>-1||r.indexOf(p(e))>-1}):d(e.filter,\"Function\")?t=e.filter:d(e.filter,\"Undefined\")&&(t=function(){return!0}),function(r,n){return(\"invalid\"!==r.type||e.includeInvalid===!0)&&t(r,n)}}function v(e){var t;return d(e.subDocPath,\"Array\")?t=e.subDocPath:d(e.subDocPath,\"String\")?t=j(e.subDocPath):d(e.subDocPath,\"Undefined\")&&(t=[]),t}function m(e){return q.parse(encodeURI(decodeURI(e)))}function g(e,t,r){c(e,t.slice(0,t.length-1))[decodeURI(t[t.length-1])]=r}function b(e,t,r,n){function o(t,o){r.push(o),b(e,t,r,n),r.pop()}var i=!0;d(n,\"Function\")&&(i=n(e,t,r)),-1===e.indexOf(t)&&(e.push(t),i!==!1&&(d(t,\"Array\")?t.forEach(function(e,t){o(e,t.toString())}):d(t,\"Object\")&&Object.keys(t).forEach(function(e){o(t[e],e)}))),e.pop()}function E(e,t){if(e=d(e,\"Undefined\")?{}:n(e),!d(e,\"Object\"))throw new TypeError(\"options must be an Object\");if(!(d(e.filter,\"Undefined\")||d(e.filter,\"Array\")||d(e.filter,\"Function\")||d(e.filter,\"String\")))throw new TypeError(\"options.filter must be an Array, a Function of a String\");if(!d(e.includeInvalid,\"Undefined\")&&!d(e.includeInvalid,\"Boolean\"))throw new TypeError(\"options.includeInvalid must be a Boolean\");if(!d(e.refPreProcessor,\"Undefined\")&&!d(e.refPreProcessor,\"Function\"))throw new TypeError(\"options.refPreProcessor must be a Function\");if(!d(e.refPostProcessor,\"Undefined\")&&!d(e.refPostProcessor,\"Function\"))throw new TypeError(\"options.refPostProcessor must be a Function\");if(!d(e.subDocPath,\"Undefined\")&&!d(e.subDocPath,\"Array\")&&!_(e.subDocPath))throw new TypeError(\"options.subDocPath must be an Array of path segments or a valid JSON Pointer\");if(e.filter=y(e),e.subDocPath=v(e),!d(t,\"Undefined\"))try{c(t,e.subDocPath)}catch(r){throw r.message=r.message.replace(\"JSON Pointer\",\"options.subDocPath\"),r}return e}function w(){k={}}function x(e){if(!d(e,\"Array\"))throw new TypeError(\"path must be an array\");return e.map(function(e){return d(e,\"String\")||(e=JSON.stringify(e)),decodeURI(e.replace(/~1/g,\"/\").replace(/~0/g,\"~\"))})}function C(e){if(!d(e,\"Array\"))throw new TypeError(\"path must be an array\");return e.map(function(e){return d(e,\"String\")||(e=JSON.stringify(e)),e.replace(/~/g,\"~0\").replace(/\\//g,\"~1\")})}function O(e,t){var r={};if(!d(e,\"Array\")&&!d(e,\"Object\"))throw new TypeError(\"obj must be an Array or an Object\");return t=E(t,e),b(s(e,t.subDocPath),c(e,t.subDocPath),n(t.subDocPath),function(e,o,i){var s,a=!0;return l(o)&&(d(t.refPreProcessor,\"Undefined\")||(o=t.refPreProcessor(n(o),i)),s=T(o),d(t.refPostProcessor,\"Undefined\")||(s=t.refPostProcessor(s,i)),t.filter(s,i)&&(r[S(i)]=s),f(o).length>0&&(a=!1)),a}),r}function P(e,t){var r=Promise.resolve();return r=r.then(function(){if(!d(e,\"String\"))throw new TypeError(\"location must be a string\");return t=E(t),e=i(t.relativeBase,e),h(e,t)}).then(function(r){var o=n(k[e]),i=n(t),s=m(e);return d(o.refs,\"Undefined\")&&(delete i.filter,delete i.subDocPath,i.includeInvalid=!0,k[e].refs=O(r,i)),d(t.filter,\"Undefined\")||(i.filter=t.filter),d(s.fragment,\"Undefined\")?d(s.subDocPath,\"Undefined\")||(i.subDocPath=t.subDocPath):i.subDocPath=j(decodeURI(s.fragment)),{refs:O(r,i),value:r}})}function T(e){var t,r,n,o={def:e};try{l(e,!0)?(t=e.$ref,n=$[t],d(n,\"Undefined\")&&(n=$[t]=m(t)),o.uri=t,o.uriDetails=n,d(n.error,\"Undefined\")?o.type=p(o):(o.error=o.uriDetails.error,o.type=\"invalid\"),r=f(e),r.length>0&&(o.warning=\"Extra JSON Reference properties will be ignored: \"+r.join(\", \"))):o.type=\"invalid\"}catch(i){o.error=i.message,o.type=\"invalid\"}return o}function _(e,t){var r,n=!0;try{if(!d(e,\"String\"))throw new Error(\"ptr is not a String\");if(\"\"!==e){if(r=e.charAt(0),-1===[\"#\",\"/\"].indexOf(r))throw new Error(\"ptr must start with a / or #/\");if(\"#\"===r&&\"#\"!==e&&\"/\"!==e.charAt(1))throw new Error(\"ptr must start with a / or #/\");if(e.match(H))throw new Error(\"ptr has invalid token(s)\")}}catch(o){if(t===!0)throw o;n=!1}return n}function A(e,t){return l(e,t)&&\"invalid\"!==T(e,t).type}function j(e){if(!_(e))throw new Error(\"ptr must be a JSON Pointer\");var t=e.split(\"/\");return t.shift(),x(t)}function S(e,t){if(!d(e,\"Array\"))throw new Error(\"path must be an Array\");return(t!==!1?\"#\":\"\")+(e.length>0?\"/\":\"\")+C(e).join(\"/\")}function D(e,t){var r=Promise.resolve();return r=r.then(function(){if(!d(e,\"Array\")&&!d(e,\"Object\"))throw new TypeError(\"obj must be an Array or an Object\");t=E(t,e),e=n(e)}).then(function(){return u(e,t,[],[],{documents:{},refs:{}})}).then(function(t){function r(e,t){return j(e).length-j(t).length}var n={},o={};return Object.keys(t.refs).sort(r).forEach(function(r){var i=t.refs[r];i.indirect||(o[r]=i),delete i.indirect,d(i.error,\"Undefined\")&&\"invalid\"!==i.type?(d(i.value,\"Undefined\")&&i.circular&&(i.value=i.def),d(i.value,\"Undefined\")?n[r]=i:(\"#\"===r?e=i.value:g(e,j(r),i.value),delete i.ancestorPtrs)):delete i.ancestorPtrs}),Object.keys(n).forEach(function(r){var o=n[r];o.ancestorPtrs.forEach(function(n,i){if(d(o.value,\"Undefined\"))try{o.value=c(t.documents[n],j(o.uri)),delete o.ancestorPtrs,g(e,j(r),o.value)}catch(s){i===o.ancestorPtrs.length-1&&(o.error=s.message,o.missing=!0,delete o.ancestorPtrs)}})}),{refs:o,resolved:e}})}function R(e,t){var r=Promise.resolve();return r=r.then(function(){if(!d(e,\"String\"))throw new TypeError(\"location must be a string\");return t=E(t),e=i(t.relativeBase,e),h(e,t)}).then(function(r){var o=n(t),i=m(e);return d(i.fragment,\"Undefined\")||(o.subDocPath=j(decodeURI(i.fragment))),o.relativeBase=U.dirname(e),D(r,o).then(function(e){return{refs:e.refs,resolved:e.resolved,value:r}})})}var U=e(\"path\"),I=e(\"path-loader\"),N=e(\"querystring\"),F=e(\"slash\"),q=e(\"uri-js\"),H=/~(?:[^01]|$)/g,k={},L=[\"relative\",\"remote\"],M=[\"absolute\",\"uri\"],$={};\"undefined\"==typeof Promise&&e(\"native-promise-only\"),t.exports.clearCache=w,t.exports.decodePath=x,t.exports.encodePath=C,t.exports.findRefs=O,t.exports.findRefsAt=P,t.exports.getRefDetails=T,t.exports.isPtr=_,t.exports.isRef=A,t.exports.pathFromPtr=j,t.exports.pathToPtr=S,t.exports.resolveRefs=D,t.exports.resolveRefsAt=R},{\"native-promise-only\":3,path:4,\"path-loader\":5,querystring:11,slash:13,\"uri-js\":23}],2:[function(e,t,r){function n(e){return e?o(e):void 0}function o(e){for(var t in n.prototype)e[t]=n.prototype[t];return e}t.exports=n,n.prototype.on=n.prototype.addEventListener=function(e,t){return this._callbacks=this._callbacks||{},(this._callbacks[\"$\"+e]=this._callbacks[\"$\"+e]||[]).push(t),this},n.prototype.once=function(e,t){function r(){this.off(e,r),t.apply(this,arguments)}return r.fn=t,this.on(e,r),this},n.prototype.off=n.prototype.removeListener=n.prototype.removeAllListeners=n.prototype.removeEventListener=function(e,t){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var r=this._callbacks[\"$\"+e];if(!r)return this;if(1==arguments.length)return delete this._callbacks[\"$\"+e],this;for(var n,o=0;on;++n)r[n].apply(this,t)}return this},n.prototype.listeners=function(e){return this._callbacks=this._callbacks||{},this._callbacks[\"$\"+e]||[]},n.prototype.hasListeners=function(e){return!!this.listeners(e).length}},{}],3:[function(t,r,n){(function(t){!function(t,n,o){n[t]=n[t]||o(),\"undefined\"!=typeof r&&r.exports?r.exports=n[t]:\"function\"==typeof e&&e.amd&&e(function(){return n[t]})}(\"Promise\",\"undefined\"!=typeof t?t:this,function(){\"use strict\";function e(e,t){h.add(e,t),p||(p=d(h.drain))}function t(e){var t,r=typeof e;return null==e||\"object\"!=r&&\"function\"!=r||(t=e.then),\"function\"==typeof t?t:!1}function r(){for(var e=0;e0&&e(r,u))}catch(c){i.call(new a(u),c)}}}function i(t){var n=this;n.triggered||(n.triggered=!0,n.def&&(n=n.def),n.msg=t,n.state=2,n.chain.length>0&&e(r,n))}function s(e,t,r,n){for(var o=0;o=0;n--){var o=e[n];\".\"===o?e.splice(n,1):\"..\"===o?(e.splice(n,1),r++):r&&(e.splice(n,1),r--)}if(t)for(;r--;r)e.unshift(\"..\");return e}function n(e,t){if(e.filter)return e.filter(t);for(var r=[],n=0;n=-1&&!o;i--){var s=i>=0?arguments[i]:e.cwd();if(\"string\"!=typeof s)throw new TypeError(\"Arguments to path.resolve must be strings\");s&&(r=s+\"/\"+r,o=\"/\"===s.charAt(0))}return r=t(n(r.split(\"/\"),function(e){return!!e}),!o).join(\"/\"),(o?\"/\":\"\")+r||\".\"},r.normalize=function(e){var o=r.isAbsolute(e),i=\"/\"===s(e,-1);return e=t(n(e.split(\"/\"),function(e){return!!e}),!o).join(\"/\"),e||o||(e=\".\"),e&&i&&(e+=\"/\"),(o?\"/\":\"\")+e},r.isAbsolute=function(e){return\"/\"===e.charAt(0)},r.join=function(){var e=Array.prototype.slice.call(arguments,0);return r.normalize(n(e,function(e,t){if(\"string\"!=typeof e)throw new TypeError(\"Arguments to path.join must be strings\");return e}).join(\"/\"))},r.relative=function(e,t){function n(e){for(var t=0;t=0&&\"\"===e[r];r--);return t>r?[]:e.slice(t,r-t+1)}e=r.resolve(e).substr(1),t=r.resolve(t).substr(1);for(var o=n(e.split(\"/\")),i=n(t.split(\"/\")),s=Math.min(o.length,i.length),a=s,u=0;s>u;u++)if(o[u]!==i[u]){a=u;break}for(var c=[],u=a;ut&&(t=e.length+t),e.substr(t,r)}}).call(this,e(\"_process\"))},{_process:8}],5:[function(e,t,r){\"use strict\";function n(e){return\"undefined\"!=typeof e&&(e=-1===e.indexOf(\"://\")?\"\":e.split(\"://\")[0]),e}function o(e){var t=n(e),r=i[t];if(\"undefined\"==typeof r){if(\"\"!==t)throw new Error(\"Unsupported scheme: \"+t);r=s}return r}var i={file:e(\"./lib/loaders/file\"),http:e(\"./lib/loaders/http\"),https:e(\"./lib/loaders/http\")},s=\"object\"==typeof window||\"function\"==typeof importScripts?i.http:i.file;\"undefined\"==typeof Promise&&e(\"native-promise-only\"),t.exports.load=function(e,t){var r=Promise.resolve();return\"undefined\"==typeof t&&(t={}),r=r.then(function(){if(\"undefined\"==typeof e)throw new TypeError(\"location is required\");if(\"string\"!=typeof e)throw new TypeError(\"location must be a string\");if(\"undefined\"!=typeof t){if(\"object\"!=typeof t)throw new TypeError(\"options must be an object\");if(\"undefined\"!=typeof t.processContent&&\"function\"!=typeof t.processContent)throw new TypeError(\"options.processContent must be a function\")}}),r=r.then(function(){return new Promise(function(r,n){var i=o(e);i.load(e,t||{},function(e,t){e?n(e):r(t)})})}).then(function(e){return t.processContent?new Promise(function(r,n){t.processContent(\"object\"==typeof e?e:{text:e},function(e,t){e?n(e):r(t)})}):\"object\"==typeof e?e.text:e})}},{\"./lib/loaders/file\":6,\"./lib/loaders/http\":7,\"native-promise-only\":3}],6:[function(e,t,r){\"use strict\";var n=new TypeError(\"The 'file' scheme is not supported in the browser\");t.exports.getBase=function(){throw n},t.exports.load=function(){var e=arguments[arguments.length-1];if(\"function\"!=typeof e)throw n;e(n)}},{}],7:[function(e,t,r){\"use strict\";var n=e(\"superagent\"),o=[\"delete\",\"get\",\"head\",\"patch\",\"post\",\"put\"];t.exports.load=function(e,t,r){function i(e,t){e?r(e):(\"function\"==typeof t.buffer&&t.buffer(!0),t.end(function(e,t){e?r(e):r(void 0,t)}))}var s,a,u=t.method?t.method.toLowerCase():\"get\";if(\"undefined\"!=typeof t.method?\"string\"!=typeof t.method?s=new TypeError(\"options.method must be a string\"):-1===o.indexOf(t.method)&&(s=new TypeError(\"options.method must be one of the following: \"+o.slice(0,o.length-1).join(\", \")+\" or \"+o[o.length-1])):\"undefined\"!=typeof t.prepareRequest&&\"function\"!=typeof t.prepareRequest&&(s=new TypeError(\"options.prepareRequest must be a function\")),s)r(s);else if(a=n[\"delete\"===u?\"del\":u](e),t.prepareRequest)try{t.prepareRequest(a,i)}catch(c){r(c)}else i(void 0,a)}},{superagent:14}],8:[function(e,t,r){function n(){f=!1,a.length?c=a.concat(c):p=-1,c.length&&o()}function o(){if(!f){var e=setTimeout(n);f=!0;for(var t=c.length;t;){for(a=c,c=[];++p1)for(var r=1;r0&&c>u&&(c=u);for(var f=0;c>f;++f){var p,h,l,d,y=e[f].replace(a,\"%20\"),v=y.indexOf(r);v>=0?(p=y.substr(0,v),h=y.substr(v+1)):(p=y,h=\"\"),l=decodeURIComponent(p),d=decodeURIComponent(h),n(s,l)?o(s[l])?s[l].push(d):s[l]=[s[l],d]:s[l]=d}return s};var o=Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)}},{}],10:[function(e,t,r){\"use strict\";function n(e,t){if(e.map)return e.map(t);for(var r=[],n=0;nn;)i=t.call(null,i,e[n],++n,e);return i}},{}],13:[function(e,t,r){\"use strict\";t.exports=function(e){var t=/^\\\\\\\\\\?\\\\/.test(e),r=/[^\\x00-\\x80]+/.test(e);return t||r?e:e.replace(/\\\\/g,\"/\")}},{}],14:[function(e,t,r){function n(){}function o(e){var t={}.toString.call(e);switch(t){case\"[object File]\":case\"[object Blob]\":case\"[object FormData]\":return!0;default:return!1}}function i(e){if(!b(e))return e;var t=[];for(var r in e)null!=e[r]&&s(t,r,e[r]);return t.join(\"&\")}function s(e,t,r){return Array.isArray(r)?r.forEach(function(r){s(e,t,r)}):void e.push(encodeURIComponent(t)+\"=\"+encodeURIComponent(r))}function a(e){for(var t,r,n={},o=e.split(\"&\"),i=0,s=o.length;s>i;++i)r=o[i],t=r.split(\"=\"),n[decodeURIComponent(t[0])]=decodeURIComponent(t[1]);return n}function u(e){var t,r,n,o,i=e.split(/\\r?\\n/),s={};i.pop();for(var a=0,u=i.length;u>a;++a)r=i[a],t=r.indexOf(\":\"),n=r.slice(0,t).toLowerCase(),o=w(r.slice(t+1)),s[n]=o;return s}function c(e){return/[\\/+]json\\b/.test(e)}function f(e){return e.split(/ *; */).shift()}function p(e){return m(e.split(/ *; */),function(e,t){var r=t.split(/ *= */),n=r.shift(),o=r.shift();return n&&o&&(e[n]=o),e},{})}function h(e,t){t=t||{},this.req=e,this.xhr=this.req.xhr,this.text=\"HEAD\"!=this.req.method&&(\"\"===this.xhr.responseType||\"text\"===this.xhr.responseType)||\"undefined\"==typeof this.xhr.responseType?this.xhr.responseText:null,this.statusText=this.req.xhr.statusText,this.setStatusProperties(this.xhr.status),this.header=this.headers=u(this.xhr.getAllResponseHeaders()),this.header[\"content-type\"]=this.xhr.getResponseHeader(\"content-type\"),this.setHeaderProperties(this.header),this.body=\"HEAD\"!=this.req.method?this.parseBody(this.text?this.text:this.xhr.response):null}function l(e,t){var r=this;this._query=this._query||[],this.method=e,this.url=t,this.header={},this._header={},this.on(\"end\",function(){var e=null,t=null;try{t=new h(r)}catch(n){return e=new Error(\"Parser is unable to parse the response\"),e.parse=!0,e.original=n,e.rawResponse=r.xhr&&r.xhr.responseText?r.xhr.responseText:null,e.statusCode=r.xhr&&r.xhr.status?r.xhr.status:null,r.callback(e)}if(r.emit(\"response\",t),e)return r.callback(e,t);if(t.status>=200&&t.status<300)return r.callback(e,t);var o=new Error(t.statusText||\"Unsuccessful HTTP response\");o.original=e,o.response=t,o.status=t.status,r.callback(o,t)})}function d(e,t){var r=E(\"DELETE\",e);return t&&r.end(t),r}var y,v=e(\"emitter\"),m=e(\"reduce\"),g=e(\"./request-base\"),b=e(\"./is-object\");y=\"undefined\"!=typeof window?window:\"undefined\"!=typeof self?self:this;var E=t.exports=e(\"./request\").bind(null,l);E.getXHR=function(){if(!(!y.XMLHttpRequest||y.location&&\"file:\"==y.location.protocol&&y.ActiveXObject))return new XMLHttpRequest;try{return new ActiveXObject(\"Microsoft.XMLHTTP\")}catch(e){}try{return new ActiveXObject(\"Msxml2.XMLHTTP.6.0\")}catch(e){}try{return new ActiveXObject(\"Msxml2.XMLHTTP.3.0\")}catch(e){}try{return new ActiveXObject(\"Msxml2.XMLHTTP\")}catch(e){}return!1};var w=\"\".trim?function(e){return e.trim()}:function(e){return e.replace(/(^\\s*|\\s*$)/g,\"\")};E.serializeObject=i,E.parseString=a,E.types={html:\"text/html\",json:\"application/json\",xml:\"application/xml\",urlencoded:\"application/x-www-form-urlencoded\",form:\"application/x-www-form-urlencoded\",\"form-data\":\"application/x-www-form-urlencoded\"},E.serialize={\"application/x-www-form-urlencoded\":i,\"application/json\":JSON.stringify},E.parse={\"application/x-www-form-urlencoded\":a,\"application/json\":JSON.parse},h.prototype.get=function(e){return this.header[e.toLowerCase()]},h.prototype.setHeaderProperties=function(e){var t=this.header[\"content-type\"]||\"\";this.type=f(t);var r=p(t);for(var n in r)this[n]=r[n]},h.prototype.parseBody=function(e){var t=E.parse[this.type];return!t&&c(this.type)&&(t=E.parse[\"application/json\"]),t&&e&&(e.length||e instanceof Object)?t(e):null},h.prototype.setStatusProperties=function(e){1223===e&&(e=204);var t=e/100|0;this.status=this.statusCode=e,this.statusType=t,this.info=1==t,this.ok=2==t,this.clientError=4==t,this.serverError=5==t,this.error=4==t||5==t?this.toError():!1,this.accepted=202==e,this.noContent=204==e,this.badRequest=400==e,this.unauthorized=401==e,this.notAcceptable=406==e,this.notFound=404==e,this.forbidden=403==e},h.prototype.toError=function(){var e=this.req,t=e.method,r=e.url,n=\"cannot \"+t+\" \"+r+\" (\"+this.status+\")\",o=new Error(n);return o.status=this.status,o.method=t,o.url=r,o},E.Response=h,v(l.prototype);for(var x in g)l.prototype[x]=g[x];l.prototype.abort=function(){return this.aborted?void 0:(this.aborted=!0,this.xhr.abort(),this.clearTimeout(),this.emit(\"abort\"),this)},l.prototype.type=function(e){return this.set(\"Content-Type\",E.types[e]||e),this},l.prototype.responseType=function(e){return this._responseType=e,this},l.prototype.accept=function(e){return this.set(\"Accept\",E.types[e]||e),this},l.prototype.auth=function(e,t,r){switch(r||(r={type:\"basic\"}),r.type){case\"basic\":var n=btoa(e+\":\"+t);this.set(\"Authorization\",\"Basic \"+n);break;case\"auto\":this.username=e,this.password=t}return this},l.prototype.query=function(e){return\"string\"!=typeof e&&(e=i(e)),e&&this._query.push(e),this},l.prototype.attach=function(e,t,r){return this._getFormData().append(e,t,r||t.name),this},l.prototype._getFormData=function(){return this._formData||(this._formData=new y.FormData),this._formData},l.prototype.send=function(e){var t=b(e),r=this._header[\"content-type\"];if(t&&b(this._data))for(var n in e)this._data[n]=e[n];else\"string\"==typeof e?(r||this.type(\"form\"),r=this._header[\"content-type\"],\"application/x-www-form-urlencoded\"==r?this._data=this._data?this._data+\"&\"+e:e:this._data=(this._data||\"\")+e):this._data=e;return!t||o(e)?this:(r||this.type(\"json\"),this)},h.prototype.parse=function(e){return y.console&&console.warn(\"Client-side parse() method has been renamed to serialize(). This method is not compatible with superagent v2.0\"),this.serialize(e),this},h.prototype.serialize=function(e){return this._parser=e,this},l.prototype.callback=function(e,t){var r=this._callback;this.clearTimeout(),r(e,t)},l.prototype.crossDomainError=function(){var e=new Error(\"Request has been terminated\\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.\");e.crossDomain=!0,e.status=this.status,e.method=this.method,e.url=this.url,this.callback(e)},l.prototype.timeoutError=function(){var e=this._timeout,t=new Error(\"timeout of \"+e+\"ms exceeded\");t.timeout=e,this.callback(t)},l.prototype.withCredentials=function(){return this._withCredentials=!0,this},l.prototype.end=function(e){var t=this,r=this.xhr=E.getXHR(),i=this._query.join(\"&\"),s=this._timeout,a=this._formData||this._data;this._callback=e||n,r.onreadystatechange=function(){if(4==r.readyState){var e;try{e=r.status}catch(n){e=0}if(0==e){if(t.timedout)return t.timeoutError();if(t.aborted)return;return t.crossDomainError()}t.emit(\"end\")}};var u=function(e){e.total>0&&(e.percent=e.loaded/e.total*100),e.direction=\"download\",t.emit(\"progress\",e)};this.hasListeners(\"progress\")&&(r.onprogress=u);try{r.upload&&this.hasListeners(\"progress\")&&(r.upload.onprogress=u)}catch(f){}if(s&&!this._timer&&(this._timer=setTimeout(function(){t.timedout=!0,t.abort()},s)),i&&(i=E.serializeObject(i),this.url+=~this.url.indexOf(\"?\")?\"&\"+i:\"?\"+i),this.username&&this.password?r.open(this.method,this.url,!0,this.username,this.password):r.open(this.method,this.url,!0),this._withCredentials&&(r.withCredentials=!0),\"GET\"!=this.method&&\"HEAD\"!=this.method&&\"string\"!=typeof a&&!o(a)){var p=this._header[\"content-type\"],h=this._parser||E.serialize[p?p.split(\";\")[0]:\"\"];!h&&c(p)&&(h=E.serialize[\"application/json\"]),h&&(a=h(a))}for(var l in this.header)null!=this.header[l]&&r.setRequestHeader(l,this.header[l]);return this._responseType&&(r.responseType=this._responseType),this.emit(\"request\",this),r.send(\"undefined\"!=typeof a?a:null),this},E.Request=l,E.get=function(e,t,r){var n=E(\"GET\",e);return\"function\"==typeof t&&(r=t,t=null),t&&n.query(t),r&&n.end(r),n},E.head=function(e,t,r){var n=E(\"HEAD\",e);return\"function\"==typeof t&&(r=t,t=null),t&&n.send(t),r&&n.end(r),n},E.del=d,E[\"delete\"]=d,E.patch=function(e,t,r){var n=E(\"PATCH\",e);return\"function\"==typeof t&&(r=t,t=null),t&&n.send(t),r&&n.end(r),n},E.post=function(e,t,r){var n=E(\"POST\",e);return\"function\"==typeof t&&(r=t,t=null),t&&n.send(t),r&&n.end(r),n},E.put=function(e,t,r){var n=E(\"PUT\",e);return\"function\"==typeof t&&(r=t,t=null),t&&n.send(t),r&&n.end(r),n}},{\"./is-object\":15,\"./request\":17,\"./request-base\":16,emitter:2,reduce:12}],15:[function(e,t,r){function n(e){return null!=e&&\"object\"==typeof e}t.exports=n},{}],16:[function(e,t,r){var n=e(\"./is-object\");r.clearTimeout=function(){return this._timeout=0,clearTimeout(this._timer),this},r.parse=function(e){return this._parser=e,this},r.timeout=function(e){return this._timeout=e,this},r.then=function(e,t){return this.end(function(r,n){r?t(r):e(n)})},r.use=function(e){return e(this),this},r.get=function(e){return this._header[e.toLowerCase()]},r.getHeader=r.get,r.set=function(e,t){if(n(e)){for(var r in e)this.set(r,e[r]);return this}return this._header[e.toLowerCase()]=t,this.header[e]=t,this},r.unset=function(e){return delete this._header[e.toLowerCase()],\ndelete this.header[e],this},r.field=function(e,t){return this._getFormData().append(e,t),this}},{\"./is-object\":15}],17:[function(e,t,r){function n(e,t,r){return\"function\"==typeof r?new e(\"GET\",t).end(r):2==arguments.length?new e(\"GET\",t):new e(t,r)}t.exports=n},{}],18:[function(e,t,r){var n=function(){function e(e){throw new RangeError(P[e])}function t(e,t){for(var r=e.length,n=[];r--;)n[r]=t(e[r]);return n}function r(e,r){var n=e.split(\"@\"),o=\"\";n.length>1&&(o=n[0]+\"@\",e=n[1]),e=e.replace(O,\".\");var i=e.split(\".\"),s=t(i,r).join(\".\");return o+s}function n(e){for(var t,r,n=[],o=0,i=e.length;i>o;)t=e.charCodeAt(o++),t>=55296&&56319>=t&&i>o?(r=e.charCodeAt(o++),56320==(64512&r)?n.push(((1023&t)<<10)+(1023&r)+65536):(n.push(t),o--)):n.push(t);return n}function o(e){return t(e,function(e){var t=\"\";return e>65535&&(e-=65536,t+=A(e>>>10&1023|55296),e=56320|1023&e),t+=A(e)}).join(\"\")}function i(e){return 10>e-48?e-22:26>e-65?e-65:26>e-97?e-97:d}function s(e,t){return e+22+75*(26>e)-((0!=t)<<5)}function a(e,t,r){var n=0;for(e=r?_(e/g):e>>1,e+=_(e/t);e>T*v>>1;n+=d)e=_(e/T);return _(n+(T+1)*e/(e+m))}function u(t){var r,n,s,u,c,f,p,h,m,g,x=[],C=t.length,O=0,P=E,T=b;for(n=t.lastIndexOf(w),0>n&&(n=0),s=0;n>s;++s)t.charCodeAt(s)>=128&&e(\"not-basic\"),x.push(t.charCodeAt(s));for(u=n>0?n+1:0;C>u;){for(c=O,f=1,p=d;u>=C&&e(\"invalid-input\"),h=i(t.charCodeAt(u++)),(h>=d||h>_((l-O)/f))&&e(\"overflow\"),O+=h*f,m=T>=p?y:p>=T+v?v:p-T,!(m>h);p+=d)g=d-m,f>_(l/g)&&e(\"overflow\"),f*=g;r=x.length+1,T=a(O-c,r,0==c),_(O/r)>l-P&&e(\"overflow\"),P+=_(O/r),O%=r,x.splice(O++,0,P)}return o(x)}function c(t){var r,o,i,u,c,f,p,h,m,g,x,C,O,P,T,j=[];for(t=n(t),C=t.length,r=E,o=0,c=b,f=0;C>f;++f)x=t[f],128>x&&j.push(A(x));for(i=u=j.length,u&&j.push(w);C>i;){for(p=l,f=0;C>f;++f)x=t[f],x>=r&&p>x&&(p=x);for(O=i+1,p-r>_((l-o)/O)&&e(\"overflow\"),o+=(p-r)*O,r=p,f=0;C>f;++f)if(x=t[f],r>x&&++o>l&&e(\"overflow\"),x==r){for(h=o,m=d;g=c>=m?y:m>=c+v?v:m-c,!(g>h);m+=d)T=h-g,P=d-g,j.push(A(s(g+T%P,0))),h=_(T/P);j.push(A(s(h,0))),c=a(o,O,i==u),o=0,++i}++o,++r}return j.join(\"\")}function f(e){return r(e,function(e){return x.test(e)?u(e.slice(4).toLowerCase()):e})}function p(e){return r(e,function(e){return C.test(e)?\"xn--\"+c(e):e})}var h,l=2147483647,d=36,y=1,v=26,m=38,g=700,b=72,E=128,w=\"-\",x=/^xn--/,C=/[^\\x20-\\x7E]/,O=/[\\x2E\\u3002\\uFF0E\\uFF61]/g,P={overflow:\"Overflow: input needs wider integers to process\",\"not-basic\":\"Illegal input >= 0x80 (not a basic code point)\",\"invalid-input\":\"Invalid input\"},T=d-y,_=Math.floor,A=String.fromCharCode;return h={version:\"1.3.2\",ucs2:{decode:n,encode:o},decode:u,encode:c,toASCII:p,toUnicode:f}}();\"undefined\"==typeof COMPILED&&\"undefined\"!=typeof t&&(t.exports=n)},{}],19:[function(e,t,r){e(\"./schemes/http\"),e(\"./schemes/urn\"),e(\"./schemes/mailto\")},{\"./schemes/http\":20,\"./schemes/mailto\":21,\"./schemes/urn\":22}],20:[function(e,t,r){if(\"undefined\"==typeof COMPILED&&\"undefined\"==typeof n&&\"function\"==typeof e)var n=e(\"../uri\");n.SCHEMES.http=n.SCHEMES.https={domainHost:!0,parse:function(e,t){return e.host||(e.error=e.error||\"HTTP URIs must have a host.\"),e},serialize:function(e,t){return e.port!==(\"https\"!==String(e.scheme).toLowerCase()?80:443)&&\"\"!==e.port||(e.port=void 0),e.path||(e.path=\"/\"),e}}},{\"../uri\":23}],21:[function(e,t,r){if(\"undefined\"==typeof COMPILED&&\"undefined\"==typeof n&&\"function\"==typeof e)var n=e(\"../uri\"),o=e(\"../punycode\");!function(){function e(){for(var e=[],t=0;t1){e[0]=e[0].slice(0,-1);for(var r=e.length-1,n=1;r>n;++n)e[n]=e[n].slice(1,-1);return e[r]=e[r].slice(1),e.join(\"\")}return e[0]}function t(e){return\"(?:\"+e+\")\"}function r(e){return e.toUpperCase()}function i(e){var t=n.pctDecChars(e);return t.match(D)?t:e}function s(e){return void 0!==e&&null!==e?e instanceof Array&&!e.callee?e:\"number\"!=typeof e.length||e.split||e.setInterval||e.call?[e]:Array.prototype.slice.call(e):[]}var a={},u=n.IRI_SUPPORT,c=\"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\"+(u?\"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\":\"\")+\"]\",f=\"[0-9A-Fa-f]\",p=t(t(\"%[EFef]\"+f+\"%\"+f+f+\"%\"+f+f)+\"|\"+t(\"%[89A-Fa-f]\"+f+\"%\"+f+f)+\"|\"+t(\"%\"+f+f)),h=\"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\",l=\"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\",d=e(l,'[\\\\\"\\\\\\\\]'),y=t(h+\"+\"+t(\"\\\\.\"+h+\"+\")+\"*\"),v=t(\"\\\\\\\\\"+d),m=t(l+\"|\"+v),g=t('\\\\\"'+m+'*\\\\\"'),b=\"[\\\\x21-\\\\x5A\\\\x5E-\\\\x7E]\",E=\"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\",w=t(c+\"|\"+p+\"|\"+E),x=t(y+\"|\\\\[\"+b+\"*\\\\]\"),C=t(y+\"|\"+g),O=t(C+\"\\\\@\"+x),P=t(O+t(\"\\\\,\"+O)+\"*\"),T=t(w+\"*\"),_=T,A=t(T+\"\\\\=\"+_),j=t(A+t(\"\\\\&\"+A)+\"*\"),S=t(\"\\\\?\"+j),D=(n.VALIDATE_SUPPORT&&new RegExp(\"^mailto\\\\:\"+P+\"?\"+S+\"?$\"),new RegExp(c,\"g\")),R=new RegExp(p,\"g\"),U=new RegExp(e(\"[^]\",h,\"[\\\\.]\",'[\\\\\"]',d),\"g\"),I=new RegExp(e(\"[^]\",h,\"[\\\\.]\",\"[\\\\[]\",b,\"[\\\\]]\"),\"g\"),N=new RegExp(e(\"[^]\",c,E),\"g\"),F=N,q=n.VALIDATE_SUPPORT&&new RegExp(\"^\"+P+\"$\"),H=n.VALIDATE_SUPPORT&&new RegExp(\"^\"+j+\"$\");n.SCHEMES.mailto={parse:function(e,t){n.VALIDATE_SUPPORT&&!e.error&&(e.path&&!q.test(e.path)?e.error=\"Email address is not valid\":e.query&&!H.test(e.query)&&(e.error=\"Header fields are invalid\"));var r=e.to=e.path?e.path.split(\",\"):[];if(e.path=void 0,e.query){for(var i=!1,s={},a=e.query.split(\"&\"),u=0,c=a.length;c>u;++u){var f=a[u].split(\"=\");switch(f[0]){case\"to\":for(var p=f[1].split(\",\"),h=0,l=p.length;l>h;++h)r.push(p[h]);break;case\"subject\":e.subject=n.unescapeComponent(f[1],t);break;case\"body\":e.body=n.unescapeComponent(f[1],t);break;default:i=!0,s[n.unescapeComponent(f[0],t)]=n.unescapeComponent(f[1],t)}}i&&(e.headers=s)}e.query=void 0;for(var u=0,c=r.length;c>u;++u){var d=r[u].split(\"@\");if(d[0]=n.unescapeComponent(d[0]),\"undefined\"==typeof o||t.unicodeSupport)d[1]=n.unescapeComponent(d[1],t).toLowerCase();else try{d[1]=o.toASCII(n.unescapeComponent(d[1],t).toLowerCase())}catch(y){e.error=e.error||\"Email address's domain name can not be converted to ASCII via punycode: \"+y}r[u]=d.join(\"@\")}return e},serialize:function(e,t){var u=s(e.to);if(u){for(var c=0,f=u.length;f>c;++c){var p=String(u[c]),h=p.lastIndexOf(\"@\"),l=p.slice(0,h),d=p.slice(h+1);if(l=l.replace(R,i).replace(R,r).replace(U,n.pctEncChar),\"undefined\"!=typeof o)try{d=t.iri?o.toUnicode(d):o.toASCII(n.unescapeComponent(d,t).toLowerCase())}catch(y){e.error=e.error||\"Email address's domain name can not be converted to \"+(t.iri?\"Unicode\":\"ASCII\")+\" via punycode: \"+y}else d=d.replace(R,i).toLowerCase().replace(R,r).replace(I,n.pctEncChar);u[c]=l+\"@\"+d}e.path=u.join(\",\")}var v=e.headers=e.headers||{};e.subject&&(v.subject=e.subject),e.body&&(v.body=e.body);var m=[];for(var g in v)v[g]!==a[g]&&m.push(g.replace(R,i).replace(R,r).replace(N,n.pctEncChar)+\"=\"+v[g].replace(R,i).replace(R,r).replace(F,n.pctEncChar));return m.length&&(e.query=m.join(\"&\")),e}}}()},{\"../punycode\":18,\"../uri\":23}],22:[function(e,t,r){if(\"undefined\"==typeof COMPILED&&\"undefined\"==typeof n&&\"function\"==typeof e)var n=e(\"../uri\");!function(){var e=n.pctEncChar,t=\"(?:[0-9A-Za-z][0-9A-Za-z\\\\-]{1,31})\",r=\"(?:\\\\%[0-9A-Fa-f]{2})\",o=\"[0-9A-Za-z\\\\(\\\\)\\\\+\\\\,\\\\-\\\\.\\\\:\\\\=\\\\@\\\\;\\\\$\\\\_\\\\!\\\\*\\\\'\\\\/\\\\?\\\\#]\",i=\"(?:(?:\"+r+\"|\"+o+\")+)\",s=new RegExp(\"^urn\\\\:(\"+t+\")$\"),a=new RegExp(\"^(\"+t+\")\\\\:(\"+i+\")$\"),u=/^([^\\:]+)\\:(.*)/,c=/[\\x00-\\x20\\\\\\\"\\&\\<\\>\\[\\]\\^\\`\\{\\|\\}\\~\\x7F-\\xFF]/g,f=/^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;n.SCHEMES.urn={parse:function(e,t){var r,o,i=e.path.match(a);return i||(t.tolerant||(e.error=e.error||\"URN is not strictly valid.\"),i=e.path.match(u)),i?(r=\"urn:\"+i[1].toLowerCase(),o=n.SCHEMES[r],o||(o=n.SCHEMES[r]={parse:function(e,t){return e},serialize:n.SCHEMES.urn.serialize}),e.scheme=r,e.path=i[2],e=o.parse(e,t)):e.error=e.error||\"URN can not be parsed.\",e},serialize:function(t,r){var n,o=t.scheme||r.scheme;if(o&&\"urn\"!==o){var n=o.match(s);n||(n=[\"urn:\"+o,o]),t.scheme=\"urn\",t.path=n[1]+\":\"+(t.path?t.path.replace(c,e):\"\")}return t}},n.SCHEMES[\"urn:uuid\"]={parse:function(e,t){return t.tolerant||e.path&&e.path.match(f)||(e.error=e.error||\"UUID is not valid.\"),e},serialize:function(e,t){return t.tolerant||e.path&&e.path.match(f)?e.path=(e.path||\"\").toLowerCase():e.scheme=void 0,n.SCHEMES.urn.serialize(e,t)}}}()},{\"../uri\":23}],23:[function(e,t,r){var n=!1,o=!0,i=!0,s=function(){function e(){for(var e=[],t=0;t1){e[0]=e[0].slice(0,-1);for(var r=e.length-1,n=1;r>n;++n)e[n]=e[n].slice(1,-1);return e[r]=e[r].slice(1),e.join(\"\")}return e[0]}function t(e){return\"(?:\"+e+\")\"}function r(r){var n=\"[A-Za-z]\",o=\"[0-9]\",s=e(o,\"[A-Fa-f]\"),a=t(t(\"%[EFef]\"+s+\"%\"+s+s+\"%\"+s+s)+\"|\"+t(\"%[89A-Fa-f]\"+s+\"%\"+s+s)+\"|\"+t(\"%\"+s+s)),u=\"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\",c=\"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",f=e(u,c),p=r?\"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\":\"[]\",h=r?\"[\\\\uE000-\\\\uF8FF]\":\"[]\",l=e(n,o,\"[\\\\-\\\\.\\\\_\\\\~]\",p),d=t(n+e(n,o,\"[\\\\+\\\\-\\\\.]\")+\"*\"),y=t(t(a+\"|\"+e(l,c,\"[\\\\:]\"))+\"*\"),v=t(t(\"25[0-5]\")+\"|\"+t(\"2[0-4]\"+o)+\"|\"+t(\"1\"+o+o)+\"|\"+t(\"[1-9]\"+o)+\"|\"+o),m=t(v+\"\\\\.\"+v+\"\\\\.\"+v+\"\\\\.\"+v),g=t(s+\"{1,4}\"),b=(t(t(g+\"\\\\:\"+g)+\"|\"+m),t(e(l,c,\"[\\\\:]\")+\"+\")),E=t(\"v\"+s+\"+\\\\.\"+e(l,c,\"[\\\\:]\")+\"+\"),w=t(\"\\\\[\"+t(b+\"|\"+E)+\"\\\\]\"),x=t(t(a+\"|\"+e(l,c))+\"*\"),C=t(w+\"|\"+m+\"(?!\"+x+\")|\"+x),O=t(o+\"*\"),P=t(t(y+\"@\")+\"?\"+C+t(\"\\\\:\"+O)+\"?\"),T=t(a+\"|\"+e(l,c,\"[\\\\:\\\\@]\")),_=t(T+\"*\"),A=t(T+\"+\"),j=t(t(a+\"|\"+e(l,c,\"[\\\\@]\"))+\"+\"),S=t(t(\"\\\\/\"+_)+\"*\"),D=t(\"\\\\/\"+t(A+S)+\"?\"),R=t(j+S),U=t(A+S),I=\"(?!\"+T+\")\",N=(t(S+\"|\"+D+\"|\"+R+\"|\"+U+\"|\"+I),t(t(T+\"|\"+e(\"[\\\\/\\\\?]\",h))+\"*\")),F=t(t(T+\"|[\\\\/\\\\?]\")+\"*\"),q=t(t(\"\\\\/\\\\/\"+P+S)+\"|\"+D+\"|\"+U+\"|\"+I),H=t(d+\"\\\\:\"+q+t(\"\\\\?\"+N)+\"?\"+t(\"\\\\#\"+F)+\"?\"),k=t(t(\"\\\\/\\\\/\"+P+S)+\"|\"+D+\"|\"+R+\"|\"+I),L=t(k+t(\"\\\\?\"+N)+\"?\"+t(\"\\\\#\"+F)+\"?\"),M=(t(H+\"|\"+L),t(d+\"\\\\:\"+q+t(\"\\\\?\"+N)+\"?\"),\"^(\"+d+\")\\\\:\"+t(t(\"\\\\/\\\\/(\"+t(\"(\"+y+\")@\")+\"?(\"+C+\")\"+t(\"\\\\:(\"+O+\")\")+\"?)\")+\"?(\"+S+\"|\"+D+\"|\"+U+\"|\"+I+\")\")+t(\"\\\\?(\"+N+\")\")+\"?\"+t(\"\\\\#(\"+F+\")\")+\"?$\"),$=\"^(){0}\"+t(t(\"\\\\/\\\\/(\"+t(\"(\"+y+\")@\")+\"?(\"+C+\")\"+t(\"\\\\:(\"+O+\")\")+\"?)\")+\"?(\"+S+\"|\"+D+\"|\"+R+\"|\"+I+\")\")+t(\"\\\\?(\"+N+\")\")+\"?\"+t(\"\\\\#(\"+F+\")\")+\"?$\";\"^(\"+d+\")\\\\:\"+t(t(\"\\\\/\\\\/(\"+t(\"(\"+y+\")@\")+\"?(\"+C+\")\"+t(\"\\\\:(\"+O+\")\")+\"?)\")+\"?(\"+S+\"|\"+D+\"|\"+U+\"|\"+I+\")\")+t(\"\\\\?(\"+N+\")\")+\"?$\",\"^\"+t(\"\\\\#(\"+F+\")\")+\"?$\",\"^\"+t(\"(\"+y+\")@\")+\"?(\"+C+\")\"+t(\"\\\\:(\"+O+\")\")+\"?$\";return{URI_REF:i&&new RegExp(\"(\"+M+\")|(\"+$+\")\"),NOT_SCHEME:new RegExp(e(\"[^]\",n,o,\"[\\\\+\\\\-\\\\.]\"),\"g\"),NOT_USERINFO:new RegExp(e(\"[^\\\\%\\\\:]\",l,c),\"g\"),NOT_HOST:new RegExp(e(\"[^\\\\%]\",l,c),\"g\"),NOT_PATH:new RegExp(e(\"[^\\\\%\\\\/\\\\:\\\\@]\",l,c),\"g\"),NOT_PATH_NOSCHEME:new RegExp(e(\"[^\\\\%\\\\/\\\\@]\",l,c),\"g\"),NOT_QUERY:new RegExp(e(\"[^\\\\%]\",l,c,\"[\\\\:\\\\@\\\\/\\\\?]\",h),\"g\"),NOT_FRAGMENT:new RegExp(e(\"[^\\\\%]\",l,c,\"[\\\\:\\\\@\\\\/\\\\?]\"),\"g\"),ESCAPE:new RegExp(e(\"[^]\",l,c),\"g\"),UNRESERVED:new RegExp(l,\"g\"),OTHER_CHARS:new RegExp(e(\"[^\\\\%]\",l,f),\"g\"),PCT_ENCODED:new RegExp(a,\"g\")}}function n(e){var t,r=e.charCodeAt(0);return t=16>r?\"%0\"+r.toString(16).toUpperCase():128>r?\"%\"+r.toString(16).toUpperCase():2048>r?\"%\"+(r>>6|192).toString(16).toUpperCase()+\"%\"+(63&r|128).toString(16).toUpperCase():\"%\"+(r>>12|224).toString(16).toUpperCase()+\"%\"+(r>>6&63|128).toString(16).toUpperCase()+\"%\"+(63&r|128).toString(16).toUpperCase()}function s(e){for(var t,r,n,o=\"\",i=0,s=e.length;s>i;)t=parseInt(e.substr(i+1,2),16),128>t?(o+=String.fromCharCode(t),i+=3):t>=194&&224>t?(s-i>=6?(r=parseInt(e.substr(i+4,2),16),o+=String.fromCharCode((31&t)<<6|63&r)):o+=e.substr(i,6),i+=6):t>=224?(s-i>=9?(r=parseInt(e.substr(i+4,2),16),n=parseInt(e.substr(i+7,2),16),o+=String.fromCharCode((15&t)<<12|(63&r)<<6|63&n)):o+=e.substr(i,9),i+=9):(o+=e.substr(i,3),i+=3);return o}function u(e){return void 0===e?\"undefined\":null===e?\"null\":Object.prototype.toString.call(e).split(\" \").pop().split(\"]\").shift().toLowerCase()}function c(e){return e.toUpperCase()}function f(e,t){function r(e){var r=s(e);return r.match(t.UNRESERVED)?r:e}return e.scheme&&(e.scheme=String(e.scheme).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_SCHEME,\"\")),void 0!==e.userinfo&&(e.userinfo=String(e.userinfo).replace(t.PCT_ENCODED,r).replace(t.NOT_USERINFO,n).replace(t.PCT_ENCODED,c)),void 0!==e.host&&(e.host=String(e.host).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_HOST,n).replace(t.PCT_ENCODED,c)),void 0!==e.path&&(e.path=String(e.path).replace(t.PCT_ENCODED,r).replace(e.scheme?t.NOT_PATH:t.NOT_PATH_NOSCHEME,n).replace(t.PCT_ENCODED,c)),void 0!==e.query&&(e.query=String(e.query).replace(t.PCT_ENCODED,r).replace(t.NOT_QUERY,n).replace(t.PCT_ENCODED,c)),void 0!==e.fragment&&(e.fragment=String(e.fragment).replace(t.PCT_ENCODED,r).replace(t.NOT_FRAGMENT,n).replace(t.PCT_ENCODED,c)),e}function p(e,t){void 0===t&&(t={});var r,n,u=o&&t.iri!==!1?x:w,c=!1,p={};if(\"suffix\"===t.reference&&(e=(t.scheme?t.scheme+\":\":\"\")+\"//\"+e),i?(r=e.match(u.URI_REF),r&&(r=r[1]?r.slice(1,10):r.slice(10,19)),r||(c=!0,t.tolerant||(p.error=p.error||\"URI is not strictly valid.\"),r=e.match(C))):r=e.match(C),r){if(A?(p.scheme=r[1],p.userinfo=r[3],p.host=r[4],p.port=parseInt(r[5],10),p.path=r[6]||\"\",p.query=r[7],p.fragment=r[8],isNaN(p.port)&&(p.port=r[5])):(p.scheme=r[1]||void 0,p.userinfo=-1!==e.indexOf(\"@\")?r[3]:void 0,p.host=-1!==e.indexOf(\"//\")?r[4]:void 0,p.port=parseInt(r[5],10),p.path=r[6]||\"\",p.query=-1!==e.indexOf(\"?\")?r[7]:void 0,p.fragment=-1!==e.indexOf(\"#\")?r[8]:void 0,isNaN(p.port)&&(p.port=e.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/)?r[4]:void 0)),void 0!==p.scheme||void 0!==p.userinfo||void 0!==p.host||void 0!==p.port||p.path||void 0!==p.query?void 0===p.scheme?p.reference=\"relative\":void 0===p.fragment?p.reference=\"absolute\":p.reference=\"uri\":p.reference=\"same-document\",t.reference&&\"suffix\"!==t.reference&&t.reference!==p.reference&&(p.error=p.error||\"URI is not a \"+t.reference+\" reference.\"),n=j[(t.scheme||p.scheme||\"\").toLowerCase()],!o||\"undefined\"==typeof a||t.unicodeSupport||n&&n.unicodeSupport)f(p,u);else{if(p.host&&(t.domainHost||n&&n.domainHost))try{p.host=a.toASCII(p.host.replace(u.PCT_ENCODED,s).toLowerCase())}catch(h){p.error=p.error||\"Host's domain name can not be converted to ASCII via punycode: \"+h}f(p,w)}n&&n.parse&&n.parse(p,t)}else c=!0,p.error=p.error||\"URI can not be parsed.\";return p}function h(e,t){var r=[];return void 0!==e.userinfo&&(r.push(e.userinfo),r.push(\"@\")),void 0!==e.host&&r.push(e.host),\"number\"==typeof e.port&&(r.push(\":\"),r.push(e.port.toString(10))),r.length?r.join(\"\"):void 0}function l(e){for(var t,r=[];e.length;)e.match(O)?e=e.replace(O,\"\"):e.match(P)?e=e.replace(P,\"/\"):e.match(T)?(e=e.replace(T,\"/\"),r.pop()):\".\"===e||\"..\"===e?e=\"\":(t=e.match(_)[0],e=e.slice(t.length),r.push(t));return r.join(\"\")}function d(e,t){void 0===t&&(t={});var r,n,i,u=o&&t.iri?x:w,c=[];if(r=j[(t.scheme||e.scheme||\"\").toLowerCase()],r&&r.serialize&&r.serialize(e,t),o&&\"undefined\"!=typeof a&&e.host&&(t.domainHost||r&&r.domainHost))try{e.host=t.iri?a.toUnicode(e.host):a.toASCII(e.host.replace(u.PCT_ENCODED,s).toLowerCase())}catch(p){e.error=e.error||\"Host's domain name can not be converted to \"+(t.iri?\"Unicode\":\"ASCII\")+\" via punycode: \"+p}return f(e,u),\"suffix\"!==t.reference&&e.scheme&&(c.push(e.scheme),c.push(\":\")),n=h(e,t),void 0!==n&&(\"suffix\"!==t.reference&&c.push(\"//\"),c.push(n),e.path&&\"/\"!==e.path.charAt(0)&&c.push(\"/\")),void 0!==e.path&&(i=e.path,t.absolutePath||r&&r.absolutePath||(i=l(i)),void 0===n&&(i=i.replace(/^\\/\\//,\"/%2F\")),c.push(i)),void 0!==e.query&&(c.push(\"?\"),c.push(e.query)),void 0!==e.fragment&&(c.push(\"#\"),c.push(e.fragment)),c.join(\"\")}function y(e,t,r,n){void 0===r&&(r={});var o={};return n||(e=p(d(e,r),r),t=p(d(t,r),r)),r=r||{},!r.tolerant&&t.scheme?(o.scheme=t.scheme,o.userinfo=t.userinfo,o.host=t.host,o.port=t.port,o.path=l(t.path),o.query=t.query):(void 0!==t.userinfo||void 0!==t.host||void 0!==t.port?(o.userinfo=t.userinfo,o.host=t.host,o.port=t.port,o.path=l(t.path),o.query=t.query):(t.path?(\"/\"===t.path.charAt(0)?o.path=l(t.path):(void 0===e.userinfo&&void 0===e.host&&void 0===e.port||e.path?e.path?o.path=e.path.slice(0,e.path.lastIndexOf(\"/\")+1)+t.path:o.path=t.path:o.path=\"/\"+t.path,o.path=l(o.path)),o.query=t.query):(o.path=e.path,void 0!==t.query?o.query=t.query:o.query=e.query),o.userinfo=e.userinfo,o.host=e.host,o.port=e.port),o.scheme=e.scheme),o.fragment=t.fragment,o}function v(e,t,r){return d(y(p(e,r),p(t,r),r,!0),r)}function m(e,t){return\"string\"==typeof e?e=d(p(e,t),t):\"object\"===u(e)&&(e=p(d(e,t),t)),e}function g(e,t,r){return\"string\"==typeof e?e=d(p(e,r),r):\"object\"===u(e)&&(e=d(e,r)),\"string\"==typeof t?t=d(p(t,r),r):\"object\"===u(t)&&(t=d(t,r)),e===t}function b(e,t){return e&&e.toString().replace(o&&t&&t.iri?x.ESCAPE:w.ESCAPE,n)}function E(e,t){return e&&e.toString().replace(o&&t&&t.iri?x.PCT_ENCODED:w.PCT_ENCODED,s)}var w=r(!1),x=o?r(!0):void 0,C=/^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?([^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n)*))?/i,O=/^\\.\\.?\\//,P=/^\\/\\.(\\/|$)/,T=/^\\/\\.\\.(\\/|$)/,_=/^\\/?(?:.|\\n)*?(?=\\/|$)/,A=void 0===\"\".match(/(){0}/)[1],j={};return{IRI_SUPPORT:o,VALIDATE_SUPPORT:i,pctEncChar:n,pctDecChars:s,SCHEMES:j,parse:p,_recomposeAuthority:h,removeDotSegments:l,serialize:d,resolveComponents:y,resolve:v,normalize:m,equal:g,escapeComponent:b,unescapeComponent:E}}();if(!n&&\"undefined\"!=typeof t&&\"function\"==typeof e){var a=e(\"./punycode\");t.exports=s,e(\"./schemes\")}},{\"./punycode\":18,\"./schemes\":19}]},{},[1])(1)});\n\n\n// WEBPACK FOOTER //\n// ./lib/json-refs-standalone-min.js","import {stringify, parse} from './sf-path';\r\nimport { defaultForm, createDefaults } from './schema-defaults';\r\nimport canonicalTitleMap from './canonical-title-map';\r\n\r\n// export function merge(schema, form, schemaDefaultTypes, ignore, options, readonly, asyncTemplates) {\r\nexport function merge(lookup, form, ignore, options, readonly, asyncTemplates) {\r\n let formItems = [];\r\n let formItemRest = [];\r\n form = form || [];\r\n let idx = form.indexOf('*');\r\n options = options || {};\r\n let stdForm = {};\r\n\r\n let idxRest = form.indexOf('...');\r\n if(typeof lookup === 'object' && lookup.hasOwnProperty('properties')) {\r\n readonly = readonly || lookup.readonly || lookup.readOnly;\r\n stdForm = defaultForm(lookup, createDefaults(), ignore, options);\r\n\r\n let defaultFormLookup = stdForm.lookup;\r\n\r\n lookup = defaultFormLookup || lookup;\r\n formItems = formItems.concat(stdForm.form);\r\n };\r\n\r\n if (idx !== -1) {\r\n form = form.slice(0, idx).concat(formItems).concat(form.slice(idx + 1));\r\n }\r\n\r\n //simple case, we have a \"...\", just put the formItemRest there\r\n if (stdForm.form && idxRest !== -1) {\r\n let formKeys = form.map(function(obj) {\r\n if (typeof obj === 'string'){\r\n return obj;\r\n }\r\n else if (obj.key) {\r\n return obj.key;\r\n };\r\n }).filter(function(element) {\r\n return element !== undefined;\r\n });\r\n\r\n formItemRest = formItemRest.concat(\r\n stdForm.form.map(function(obj) {\r\n let isInside = formKeys.indexOf(obj.key[0]) !== -1;\r\n if (!isInside) {\r\n return obj;\r\n };\r\n })\r\n .filter(function(element) {\r\n return element !== undefined;\r\n })\r\n );\r\n };\r\n\r\n if (idxRest !== -1) {\r\n form = form.slice(0, idxRest).concat(formItemRest).concat(form.slice(idxRest + 1));\r\n };\r\n\r\n // ok let's merge!\r\n // We look at the supplied form and extend it with schema standards\r\n return form.map((obj) => {\r\n // handle the shortcut with just a name\r\n if (typeof obj === 'string') {\r\n obj = { key: obj };\r\n }\r\n\r\n if (obj.key) {\r\n if (typeof obj.key === 'string') {\r\n obj.key = parse(obj.key);\r\n }\r\n }\r\n\r\n // If it has a titleMap make sure it's a list\r\n if (obj.titleMap) {\r\n obj.titleMap = canonicalTitleMap(obj.titleMap);\r\n }\r\n\r\n // extend with std form from schema.\r\n if (obj.key) {\r\n const strid = stringify(obj.key);\r\n if (lookup[strid]) {\r\n const schemaDefaults = lookup[strid];\r\n if (schemaDefaults) {\r\n Object.keys(schemaDefaults).forEach((attr) => {\r\n if (obj[attr] === undefined) {\r\n obj[attr] = schemaDefaults[attr];\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Are we inheriting readonly?\r\n if (readonly === true) { // Inheriting false is not cool.\r\n obj.readonly = true;\r\n }\r\n\r\n // if it's a type with items, merge 'em!\r\n if (obj.items) {\r\n obj.items = merge(lookup, obj.items, ignore, options, obj.readonly, asyncTemplates);\r\n }\r\n\r\n // if its has tabs, merge them also!\r\n if (obj.tabs) {\r\n obj.tabs.forEach((tab) => {\r\n if (tab.items) {\r\n tab.items = merge(lookup, tab.items, ignore, options, obj.readonly, asyncTemplates);\r\n }\r\n });\r\n }\r\n\r\n // Special case: checkbox\r\n // Since have to ternary state we need a default\r\n if (obj.type === 'checkbox' && obj.schema['default'] === undefined) {\r\n obj.schema['default'] = false;\r\n };\r\n\r\n // Special case: template type with tempplateUrl that's needs to be loaded before rendering\r\n // TODO: this is not a clean solution. Maybe something cleaner can be made when $ref support\r\n // is introduced since we need to go async then anyway\r\n if (asyncTemplates && obj.type === 'template' && !obj.template && obj.templateUrl) {\r\n asyncTemplates.push(obj);\r\n }\r\n\r\n return obj;\r\n });\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/merge.js","import * as JsonRefs from './../../lib/json-refs-standalone-min';\r\n\r\nexport function jsonref(schema, callBack) {\r\n let promise = new Promise(\r\n function(resolve, reject) {\r\n JsonRefs.resolveRefs(schema, {\r\n \"filter\": [ 'relative', 'local' ]\r\n })\r\n .then(function(res) { resolve(res.resolved); })\r\n .catch(function(err) { reject(new Error(err)); });\r\n }\r\n );\r\n\r\n if(typeof(callBack) === 'function') {\r\n promise\r\n .then((resolved) => { callBack(null, resolved); })\r\n .catch((error) => { callBack(error); });\r\n }\r\n else {\r\n return promise;\r\n }\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/resolve.js","import * as sfPath from './sf-path';\r\n\r\nconst numRe = /^\\d+$/;\r\n\r\n/**\r\n * @description\r\n * Utility method to access deep properties without\r\n * throwing errors when things are not defined.\r\n * Can also set a value in a deep structure, creating objects when missing\r\n * ex.\r\n * var foo = Select('address.contact.name',obj)\r\n * Select('address.contact.name',obj,'Leeroy')\r\n *\r\n * @param {string} projection A dot path to the property you want to get/set\r\n * @param {object} obj (optional) The object to project on, defaults to 'this'\r\n * @param {Any} valueToSet (opional) The value to set, if parts of the path of\r\n * the projection is missing empty objects will be created.\r\n * @returns {Any|undefined} returns the value at the end of the projection path\r\n * or undefined if there is none.\r\n */\r\nexport function select(projection, obj, valueToSet) {\r\n if (!obj) {\r\n obj = this;\r\n };\r\n\r\n // Support [] array syntax\r\n let parts = typeof projection === 'string' ? sfPath.parse(projection) : projection;\r\n\r\n if (typeof valueToSet !== 'undefined' && parts.length === 1) {\r\n // special case, just setting one variable\r\n obj[parts[0]] = valueToSet;\r\n\r\n return obj;\r\n };\r\n\r\n if (typeof valueToSet !== 'undefined' &&\r\n typeof obj[parts[0]] === 'undefined') {\r\n // We need to look ahead to check if array is appropriate\r\n obj[parts[0]] = parts.length > 2 && numRe.test(parts[1]) ? [] : {};\r\n };\r\n\r\n let value = obj[parts[0]];\r\n\r\n for (let i = 1; i < parts.length; i++) {\r\n // Special case: We allow JSON Form syntax for arrays using empty brackets\r\n // These will of course not work here so we exit if they are found.\r\n if (parts[i] === '') {\r\n return undefined;\r\n };\r\n\r\n if (typeof valueToSet !== 'undefined') {\r\n if (i === parts.length - 1) {\r\n // last step. Let's set the value\r\n value[parts[i]] = valueToSet;\r\n return valueToSet;\r\n }\r\n else {\r\n // Make sure to create new objects on the way if they are not there.\r\n // We need to look ahead to check if array is appropriate\r\n let tmp = value[parts[i]];\r\n\r\n if (typeof tmp === 'undefined' || tmp === null) {\r\n tmp = numRe.test(parts[i + 1]) ? [] : {};\r\n value[parts[i]] = tmp;\r\n };\r\n\r\n value = tmp;\r\n };\r\n }\r\n else if (value) {\r\n // Just get nex value.\r\n value = value[parts[i]];\r\n };\r\n };\r\n\r\n return value;\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/select.js","/**\r\n * Traverse a schema, applying a function(schema,path) on every sub schema\r\n * i.e. every property of an object.\r\n */\r\nexport function traverseSchema(schema, fn, path, ignoreArrays) {\r\n ignoreArrays = ignoreArrays === undefined ? true : ignoreArrays;\r\n\r\n path = path || [];\r\n\r\n const traverse = function(schemaObject: any, processorFunction: Function, pathArray: Array) {\r\n processorFunction(schemaObject, pathArray);\r\n if (schemaObject.properties) {\r\n Object.keys(schemaObject.properties).forEach((name) => {\r\n const currentPath = pathArray.slice();\r\n currentPath.push(name);\r\n traverse(schemaObject.properties[name], processorFunction, currentPath);\r\n });\r\n }\r\n\r\n // Only support type \"array\" which have a schemaObject as \"items\".\r\n if (!ignoreArrays && schemaObject.items) {\r\n const arrPath = pathArray.slice(); arrPath.push('');\r\n traverse(schemaObject.items, processorFunction, arrPath);\r\n }\r\n };\r\n\r\n traverse(schema, fn, path || []);\r\n}\r\n\r\nexport function traverseForm(form, fn) {\r\n fn(form);\r\n if (form.items) {\r\n form.items.forEach((f) => {\r\n traverseForm(f, fn);\r\n });\r\n }\r\n\r\n if (form.tabs) {\r\n form.tabs.forEach((tab) => {\r\n if (tab.items) {\r\n tab.items.forEach((f) => {\r\n traverseForm(f, fn);\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/traverse.js","/* Common code for validating a value against its form and schema definition */\r\nimport tv4 from 'tv4';\r\n\r\n/**\r\n * Validate a value against its form definition and schema.\r\n * The value should either be of proper type or a string, some type\r\n * coercion is applied.\r\n *\r\n * @param {Object} form A merged form definition, i.e. one with a schema.\r\n * @param {Any} value the value to validate.\r\n * @return {Object} a tv4js result object.\r\n */\r\nexport function validate(form, value) {\r\n if (!form) {\r\n return { valid: true };\r\n };\r\n\r\n let schema = form.schema;\r\n if (!schema) {\r\n return { valid: true };\r\n };\r\n\r\n // Input of type text and textareas will give us a viewValue of ''\r\n // when empty, this is a valid value in a schema and does not count as something\r\n // that breaks validation of 'required'. But for our own sanity an empty field should\r\n // not validate if it's required.\r\n if (value === '') {\r\n value = undefined;\r\n };\r\n\r\n // Numbers fields will give a null value, which also means empty field\r\n if (form.type === 'number' && value === null) {\r\n value = undefined;\r\n };\r\n\r\n // Version 4 of JSON Schema has the required property not on the\r\n // property itself but on the wrapping object. Since we like to test\r\n // only this property we wrap it in a fake object.\r\n let wrap = { type: 'object', 'properties': {}, required: undefined};\r\n let propName = form.key[form.key.length - 1];\r\n wrap.properties[propName] = schema;\r\n\r\n if (form.required) {\r\n wrap.required = [ propName ];\r\n };\r\n\r\n let valueWrap = {};\r\n if (!!value) {\r\n valueWrap[propName] = value;\r\n };\r\n\r\n return tv4.validateResult(valueWrap, wrap);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/validate.js","'use strict';\n\n;!function(undefined) {\n\n\tvar ObjectPath = {\n\t\tparse: function(str){\n\t\t\tif(typeof str !== 'string'){\n\t\t\t\tthrow new TypeError('ObjectPath.parse must be passed a string');\n\t\t\t}\n\n\t\t\tvar i = 0;\n\t\t\tvar parts = [];\n\t\t\tvar d, b, q, c;\n\t\t\twhile (i < str.length){\n\t\t\t\td = str.indexOf('.', i);\n\t\t\t\tb = str.indexOf('[', i);\n\n\t\t\t\t// we've reached the end\n\t\t\t\tif (d === -1 && b === -1){\n\t\t\t\t\tparts.push(str.slice(i, str.length));\n\t\t\t\t\ti = str.length;\n\t\t\t\t}\n\n\t\t\t\t// dots\n\t\t\t\telse if (b === -1 || (d !== -1 && d < b)) {\n\t\t\t\t\tparts.push(str.slice(i, d));\n\t\t\t\t\ti = d + 1;\n\t\t\t\t}\n\n\t\t\t\t// brackets\n\t\t\t\telse {\n\t\t\t\t\tif (b > i){\n\t\t\t\t\t\tparts.push(str.slice(i, b));\n\t\t\t\t\t\ti = b;\n\t\t\t\t\t}\n\t\t\t\t\tq = str.slice(b+1, b+2);\n\t\t\t\t\tif (q !== '\"' && q !=='\\'') {\n\t\t\t\t\t\tc = str.indexOf(']', b);\n\t\t\t\t\t\tif (c === -1) c = str.length;\n\t\t\t\t\t\tparts.push(str.slice(i + 1, c));\n\t\t\t\t\t\ti = (str.slice(c + 1, c + 2) === '.') ? c + 2 : c + 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc = str.indexOf(q+']', b);\n\t\t\t\t\t\tif (c === -1) c = str.length;\n\t\t\t\t\t\twhile (str.slice(c - 1, c) === '\\\\' && b < str.length){\n\t\t\t\t\t\t\tb++;\n\t\t\t\t\t\t\tc = str.indexOf(q+']', b);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparts.push(str.slice(i + 2, c).replace(new RegExp('\\\\'+q,'g'), q));\n\t\t\t\t\t\ti = (str.slice(c + 2, c + 3) === '.') ? c + 3 : c + 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn parts;\n\t\t},\n\n\t\t// root === true : auto calculate root; must be dot-notation friendly\n\t\t// root String : the string to use as root\n\t\tstringify: function(arr, quote){\n\n\t\t\tif(!Array.isArray(arr))\n\t\t\t\tarr = [arr.toString()];\n\n\t\t\tquote = quote === '\"' ? '\"' : '\\'';\n\n\t\t\treturn arr.map(function(n){ return '[' + quote + (n.toString()).replace(new RegExp(quote, 'g'), '\\\\' + quote) + quote + ']'; }).join('');\n\t\t},\n\n\t\tnormalize: function(data, quote){\n\t\t\treturn ObjectPath.stringify(Array.isArray(data) ? data : ObjectPath.parse(data), quote);\n\t\t},\n\n\t\t// Angular\n\t\tregisterModule: function(angular) {\n\t\t\tangular.module('ObjectPath', []).provider('ObjectPath', function(){\n\t\t\t\tthis.parse = ObjectPath.parse;\n\t\t\t\tthis.stringify = ObjectPath.stringify;\n\t\t\t\tthis.normalize = ObjectPath.normalize;\n\t\t\t\tthis.$get = function(){\n\t\t\t\t\treturn ObjectPath;\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\t};\n\n\t// AMD\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(function() {\n\t\t\treturn {ObjectPath: ObjectPath};\n\t\t});\n\t}\n\n\t// CommonJS\n\telse if (typeof exports === 'object') {\n\t\texports.ObjectPath = ObjectPath;\n\t}\n\n\t// Browser global\n\telse {\n\t\twindow.ObjectPath = ObjectPath;\n\t}\n\t\n}();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/objectpath/lib/ObjectPath.js\n// module id = 11\n// module chunks = 0","module.exports = tv4;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"tv4\"\n// module id = 12\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap f9caa5536d030fc29e16","webpack:///./src/lib/sf-path.js","webpack:///./src/lib/canonical-title-map.js","webpack:///./~/objectpath/index.js","webpack:///./src/lib/schema-defaults.js","webpack:///./src/module.js","webpack:///node_modules/browser-pack/_prelude.js","webpack:///index.js","webpack:///node_modules/component-emitter/index.js","webpack:///node_modules/native-promise-only/lib/npo.src.js","webpack:///node_modules/path-browserify/index.js","webpack:///node_modules/path-loader/index.js","webpack:///node_modules/path-loader/lib/loaders/file-browser.js","webpack:///node_modules/path-loader/lib/loaders/http.js","webpack:///node_modules/process/browser.js","webpack:///node_modules/querystring-es3/decode.js","webpack:///node_modules/querystring-es3/encode.js","webpack:///node_modules/querystring-es3/index.js","webpack:///node_modules/reduce-component/index.js","webpack:///node_modules/slash/index.js","webpack:///node_modules/superagent/lib/client.js","webpack:///node_modules/superagent/lib/is-object.js","webpack:///node_modules/superagent/lib/request-base.js","webpack:///node_modules/superagent/lib/request.js","webpack:///node_modules/uri-js/build/punycode.js","webpack:///node_modules/uri-js/build/schemes.js","webpack:///node_modules/uri-js/build/schemes/http.js","webpack:///node_modules/uri-js/build/schemes/mailto.js","webpack:///node_modules/uri-js/build/schemes/urn.js","webpack:///node_modules/uri-js/build/uri.js","webpack:///./src/lib/merge.js","webpack:///./src/lib/resolve.js","webpack:///./src/lib/select.js","webpack:///./src/lib/traverse.js","webpack:///./src/lib/validate.js","webpack:///./~/objectpath/lib/ObjectPath.js","webpack:///external \"tv4\""],"names":["name","key","separator","formName","omitNumbers","fieldKey","slice","fieldSeparator","filter","currentKey","length","join","titleMap","originalEnum","Array","isArray","canonical","forEach","value","push","Object","keys","stripNullType","type","enumToTitleMap","enm","defaultFormDefinition","schemaTypes","schema","options","rules","def","innerDefaultFormDefinition","childName","childSchema","childOptions","i","assign","stdFormObj","f","global","formDefaults","supressPropertyTitles","title","description","required","maxLength","maxlength","minLength","minlength","readOnly","readonly","minimum","exclusiveMinimum","maximum","exclusiveMaximum","validationMessage","enumNames","canonicalTitleMap","ngModelOptions","text","path","lookup","stringify","number","integer","checkbox","select","checkboxes","items","fieldset","defaultFormDef","properties","ignore","indexOf","array","arrPath","createDefaults","string","object","boolean","defaultForm","defaultSchemaTypes","globalOptions","form","Error","sfPath","schemaDefaults","merge","asyncTemplates","formItems","formItemRest","idx","stdForm","idxRest","hasOwnProperty","defaultFormLookup","concat","formKeys","map","obj","element","undefined","isInside","parse","strid","attr","tabs","tab","template","templateUrl","jsonref","callBack","promise","Promise","resolve","reject","JsonRefs","then","res","resolved","catch","err","error","numRe","projection","valueToSet","parts","test","tmp","traverseSchema","fn","ignoreArrays","traverse","schemaObject","processorFunction","pathArray","currentPath","traverseForm","validate","valid","wrap","propName","valueWrap","tv4","validateResult"],"mappings":"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CA,qCACA,mBACA,sCACA,sCACA,oBACA,GACA;AACA,wBACA,gCACA,SACA,uBACA,CAEA,wBACA;AACA;AACA;AACA,mBACA,IAEA,+BACA,QAEA,oCACA,qBACA,OACA,iCACA,QAEA,yCACA,uBACA,MACA,QACA,QACA,IAEA,OACA,QACA,CACA,oCACA,cAEA,iCACA,uCACA,mBACA,KACA,GAEA,gCACA,oCAEA,oEACA,UACA,CACA,2BACA,CACA;uBACA,UACA,IAEA,wBACA,UACA,IAEA,kDACA,OACA,cAEA,mEACA,iBACA,eACA,qDAEA,sCACA,iBAEA,UACA;8DAEA,OACA;mEACA,YACA,iBACA,UACA,CAEA,CACA;yBAEA,UACA;4DACA,mEACA,iBACA,CACA,gCACA,eACA,MAEA,uBACA,MAEA,qDACA,gBACA,WAEA,oBACA,MACA,CACA,GAEA,OACA,WACA,CACA,uGACA,IACA,aAEA,iCACA,IACA,wBACA,uBACA,CACA;mBACA,sBACA,2BACA,KACA,CACA,MACA,UACA,IAEA,kCACA,kBACA,SAEA,wDACA,gBAEA,2BACA,iBAEA,WACA;IACA,cACA,2DAEA,6BACA,iBACA,gBACA,qBACA,WACA,CAEA,kEACA,UACA,CACA,CACA;AACA,2EACA,sBACA,wFACA,yBACA,4CACA,2BACA,8BAEA,2CACA,2BACA,8BACA,QACA,CAEA,GACA;aAEA,6DACA,0CACA,IAEA,2CACA,qBACA,WACA,aACA,gBACA,gBAEA,YACA;AACA;sBACA,2CACA,cACA,yFACA,SAEA,sBAEA,aACA;AACA;4CACA,CACA,OAEA,CACA;8BAEA,QACA;qEACA,4CACA,sDACA,iCACA,eACA,qBACA,mCACA,UAEA,CACA;wBAEA,aACA;oBAEA,SACA;oBACA,4CACA,UACA,wBACA,mCACA,2BACA,2BACA,SACA,0CACA,aACA,+CACA,WACA,WACA,uBACA,4BACA,YACA,QACA,UACA,sBACA,sBACA,2BACA,KACA,GACA,QACA,uDACA,oEACA,wCACA,UACA,wBACA,2BACA,QACA,gBACA,UACA,WACA,uBACA,4BACA,YACA,mEACA,WACA,GACA,MACA,qBACA,KACA,CACA,MACA,CACA;yDACA,kCACA,KAEA,uBACA,KACA,CACA,CAEA,YACA,wBACA,CACA;cACA,wBACA,qBAEA,sDACA,oDACA,8BAEA,SACA;wEACA,+EACA,+BACA,uCACA,gCACA,gBACA,WACA,CACA,QACA,+EACA,KAEA,uBACA,2BACA,KACA,CACA,GAEA,mDACA,6BAEA,QACA;2FACA,kCACA,KACA,CAEA,qDACA,6BAEA,gDACA,qBACA,KACA,CACA,GACA,kBACA,OACA,SAEA,SACA,UACA,CACA,4BACA,WAEA,8BACA,eAEA,qBACA,aACA,UACA,mEACA,OACA,CAEA,SACA,OACA,CACA,6BACA,6CACA,cACA,OACA,GACA,CACA,+BACA,IAEA,MACA;6BACA,eACA,eACA,WACA,SACA,UACA,qBACA,QACA,MACA,mCAGA,iBACA,MACA,CACA,uCACA,4BACA,0BACA,yDAEA,sCACA,CACA;oDACA,oDACA,mCACA,OACA,EAEA,CACA;wCAEA,eACA;SACA,2BACA,kBACA,OAGA,WACA,KACA,sBACA,kBACA,OAGA,UACA,KACA,QACA,CACA;iCACA,mBACA,MACA,GAEA,CACA;oCACA,cACA,KAEA,SACA,UACA,CACA,wCACA,aAEA,QACA,0BACA,iBACA,4DACA,iBACA,4BACA,YACA,qBACA,MACA,KAEA,SACA,MAEA,OACA,SACA,CACA,yBACA,CACA;AACA;sBACA,qBACA,iBACA,8DACA,IACA,CACA,CACA,+BACA,IACA,cAEA,+EACA,qEACA,+CACA,CACA;2FACA,EACA,6CACA,mBACA,mDACA,+BACA,OACA,MACA,EAEA,iCACA,0FACA,MACA,EACA,CACA,gCACA,IAEA,kDACA,oBACA,wDACA,gCACA,4DACA,YACA,GAEA,OACA,YACA,CACA,sBACA,CACA;qCACA,OACA,CACA,oCACA,wFACA,MACA,CACA,qCACA,qBAEA,oCACA,WACA,kCACA,SACA,MAEA,CACA;yBACA,mCACA,MAEA,CACA;gCACA,gBAEA,iCACA,yBACA,oCACA,uBACA,YACA,kCACA,wCACA,oBACA,KACA,GACA,CACA,CAEA,WACA,MACA,CACA,qCACA,gCACA,CACA;QACA,QACA,CACA;cACA,SAEA,8BACA,qBACA,6DACA,qCACA,iCACA,8CACA,qBACA,mGACA,wDACA,qBACA,qFACA,0DACA,qBACA,wFACA,2DACA,qBACA,mFACA,yCACA,qCACA,CACA;oBACA,gFAEA,8BAEA,SACA;kCAEA,qCACA,IACA,uBACA,uBACA,gDAEA,2BACA,KACA,CAEA,OACA,SACA,CAEA,oBAOA;;;;;GA4BA;;;;;;;;;;;;;;;;;;;;;;;;;;GAWA;;;;;;;;;GAWA;;;;;;;;;GAWA;;;;;;;;;GAYA;;;;;;;;;;GAUA;;;;;;;;GAQA;;;;;;GAaA;;;;;;;;;;;GAiBA;;;;;;;;;;;;;;;GAKA;;;;GACA,qBACA,aACA,GACA,CAaA;;;;;;;;;;;;GACA,yBACA,0BACA,qBACA,yBAEA,8BACA,0BACA,oBACA,KAEA,uDACA,MACA,GACA,CAaA;;;;;;;;;;;;GACA,yBACA,0BACA,qBACA,yBAEA,8BACA,0BACA,oBACA,KAEA,6CACA,MACA,GACA,CAqBA;;;;;;;;;;;;;;;;;;;;GACA,8BACA,UAEA,GACA;+CACA,qBACA,qCAEA,CACA;gCAEA,KACA;+BACA,kCACA,0BACA,yCACA,qBACA,QAEA,+BACA,CACA;gDACA,0CACA,MAEA,0BAEA,MACA;iDACA,gDACA,MAEA,oCACA,uBACA,WAEA,CACA;AACA;kCACA,iBACA,MACA,CAEA,OACA,iBAEA,SACA,MACA,CA8BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GACA,qCACA,sBAEA,2CAEA,CACA;8BACA,qBACA,6BAEA,CACA;wBAEA,SACA;0CAEA,4CACA,SACA,qBACA,kCACA,8BACA,iCAEA,iDACA,CACA;gBACA,uBAEA,mCAEA,6CACA,UAEA,CACA;uCACA,yBACA,OAEA,6CACA,sDACA,+DACA,6BACA,WAEA,CACA;MACA,mBACA,gBAEA,KAEA,CA/CA,QAgDA,UACA,CASA;;;;;;;;GACA,2BACA,aACA,KAEA,QACA,aACA,cAEA,eACA,wBACA,cACA,gCAEA,4CACA,+CACA,UAEA,aACA,4BAEA,mDACA,yBACA,cACA,kCACA,mBACA,UAEA,CACA;0BAEA,2BACA,oFACA,MACA,MACA,cACA,UACA,YACA,mBACA,qBACA,UAEA,OACA,SACA,CAiCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GACA,oCACA,WACA,QAEA,cACA,yBACA,aACA,sBAEA,wCACA,iBACA,0FACA,iBACA,sEACA,iBACA,4BACA,CACA,MACA,iBACA,uBACA,YACA,4BACA,MACA,KAEA,OACA,MAEA,OACA,OACA,CAmCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GACA,oCACA,oFACA,UACA,CAWA;;;;;;;;;;GACA,yBACA,gBACA,iBACA,8BAEA,wBAEA,KACA;SAEA,0BACA,UACA,CAcA;;;;;;;;;;;;;GACA,mCACA,0BACA,iBACA,yBAEA,CACA;+EACA,KACA,CA0BA;;;;;;;;;;;;;;;;;;;;;;;;;GACA,iCACA,sBAEA,2CAEA,CACA;+CACA,qBACA,qCAEA,CACA;gCAEA,KACA;UACA,KACA,CAZA,iBAaA,4CACA,WACA,QAEA,KACA,yBACA,kBACA,YAEA,6BACA,+CACA,OAEA,CACA;mEACA,6BAEA,QACA;wBACA,cACA,WAEA,CACA;kBAEA,8EACA,8DACA,6BACA,IAEA,CACA;wCACA,sBACA,gBACA,iBACA,gBACA,WACA,6CACA,OAEA,CACA;kBACA,aACA,MACA,CACA;kBACA,aACA,CAEA,GACA;kDACA,6BAEA,QACA;2DACA,yCACA,IACA,kFAEA,MACA;kBAEA,yDACA,kBACA,6CACA,sBACA,2BAEA,KACA;kBACA,aACA,CACA,CACA,CACA,GAEA,SACA,MACA,cAEA,KAEA,SACA,UACA,CA6BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GACA,wCACA,sBAEA,mBACA,wBACA,CACA;8BACA,qBACA,6BAEA,CACA;wBAEA,SACA;0CAEA,4CACA,SACA,qBACA,oBACA,iCAEA,UACA;4CACA,sDACA,WAEA,CACA;mCAEA,iCACA,6BACA,OACA,WACA,mBACA,eAEA,KACA,GAEA,SACA,UACA,CACA,+BACA,qCACA,qCACA,qCACA,iCACA,qCACA,2CACA,2BACA,2BACA,uCACA,mCACA,uCACA,6BACA,+ICr2CA,CAIA;;GACA,eACA,QAMA;;;;GACA,qBACA,qBACA,KACA,EAQA;;;;;;GACA,mBACA,kCACA,4BACA,KACA,OACA,KACA,CASA;;;;;;;GACA,qBACA,qDACA,kCACA,2DACA,SACA,UACA,MACA,EAUA;;;;;;;;GACA,yCACA,cACA,gBACA,kBACA,WAEA,OACA,iBACA,UACA,MACA,EAUA;;;;;;;;GACA,sBACA,iCACA,qCACA,wDACA,kCAEA,GACA;uBACA,iBACA,SACA,MAEA,CACA;kCACA,2BAEA,MACA;uBACA,4BACA,aACA,MAEA,CACA;GACA,uCACA,cACA,0BACA,oBACA,GACA,MACA,CACA,OACA,MACA,EAQA;;;;;;GACA,sCACA,kCACA,oCACA,iCAEA,oBACA,2BACA,8CACA,yBACA,MACA,CAEA,OACA,MACA,EAQA;;;;;;GACA,2CACA,kCACA,sCACA,GACA,EAQA;;;;;;GACA,8CACA,+BACA,OACA,8DC7JA;;;EACA,sCACA,CACA;6BACA,yFACA,gGACA,mEACA,CACA,0BAEA,mCACA,2CACA,oCACA,uDACA,EAGA,WACA;GACA,8BACA,yDACA,uCACA,OACA,aACA,2BAEA,QACA,EACA,WACA,+CACA,WACA,UACA,KACA,EAEA,CACA;iCACA,gBAEA,2BACA,SACA,aACA,mBACA,GAEA,OACA,0BACA,kBACA,cACA,WACA,KACA,KACA,OACA,KACA,MACA,cACA,GACA,wBACA,OACA,2BAEA,WACA,aACA,UACA,KACA,CAEA,GAEA,8BACA,yBACA,gBACA,8BACA,OACA,CAEA,CACA;sBACA,wBAEA,8CAEA,iCAEA,YACA,SACA,KACA,uCACA,MAEA,kBACA,qCACA,CACA,eACA,wDACA,mBAEA,IACA,mBACA,EAEA,CACA;AACA;AACA;sCACA,SACA,SACA,eACA,mBACA,KACA,KACA,cACA,UACA,IACA,KACA,yBACA,KAEA,wBACA,wBACA,wBACA,+BACA,oCACA,QACA,KACA,eACA,KACA,CACA,CACA,WACA,cACA,KACA,CAEA,sBACA,gBAEA,KACA;0BAEA,gBAEA,KACA;YACA,WACA,IAEA,IACA,0BACA,oBACA,oCACA,SACA,YACA,8DACA,0DAEA,GACA,WACA,yBACA,KACA,CACA,GACA,KACA,UACA,eACA,yBACA,iBACA,MACA,CACA,CACA,WACA,sCACA,KACA,CAEA,qBACA,UAEA,KACA;0BAEA,gBAEA,KACA;YACA,WACA,IAEA,UACA,eACA,yBACA,iBACA,MACA,CAEA,4DACA,oCACA,oBACA,yBACA,MACA,6BACA,cACA,KACA,EAEA,aACA,KACA,CAEA,8BACA,UACA,oBACA,MAEA,uBACA,cACA,gBACA,iBACA,iBACA,gBACA,GAEA,2BACA,gCACA,iBACA,kBAEA,qBACA,iBACA,iBAEA,CACA;AACA;aAEA,sBAEA,iDACA,OACA,4CACA,gDAEA,OACA;AACA;AACA;oEACA,0DACA,iBACA,kBAEA,WACA,iBACA,OACA,kBAEA,oBACA,iBACA,KAEA,UACA,QACA,yCACA,yBACA,SAEA,KACA,UACA,SACA,8BACA,kBACA,KACA,4BACA,iBACA,KAEA,GACA,WACA,iBACA,KACA,CAEA,mDACA,yBAGA,OACA;kBAEA,iBACA;uCACA,mBAGA,kEACA,iBAEA,KACA;AACA;uFACA,OACA,KAEA,yDACA,0DACA,iBACA,kBAEA,SACA,KACA,GAEA,4DACA,kDACA,0DACA,iBACA,kBAEA,QACA,KACA,GAEA,sDACA,iBAEA,KACA;wCACA,qCACA,iBACA,mBACA,4BACA,IAEA,yDACA,0DACA,iBACA,kBAEA,0CAEA,4DACA,WACA,qBACA,SACA,MACA,GACA,QACA,GAEA,wDACA,iBAEA,KACA;wCACA,qCACA,iBAEA,yDACA,0DACA,iBACA,kBAEA,2DACA,SACA,OACA,QACA,GAEA,SACA,SACA,sLCrXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA,6CACA,CACA;OACA,oCACA,gBACA,iBACA,gBACA,wBACA,gBACA,GACA,iBACA,gBACA,GACA,KACA,CAEA,CACA;kBACA,cACA,eACA,MACA,CAEA,OACA,OACA,CACA;AACA;AACA,GACA,6EACA,0CACA,yCACA,GACA,EACA;AACA;AACA,0BACA,kBACA,oBAEA,gEACA,oCAEA,MACA;0BACA,qBACA,4DACA,CACA,SAEA,uBACA,+CACA,IAEA,CACA;AAEA;AACA;sEACA,SACA,6BAEA,mDACA,IACA,EACA;AACA;AACA,gCACA,mCACA,sCAEA,IACA;sDACA,SACA,uBAEA,2BACA,MACA,IACA,wBACA,OACA,IAEA,2BACA,KACA,EACA;AACA,iCACA,yBACA,IACA,EACA;AACA,uBACA,gDACA,0DACA,wBACA,qBACA,0CACA,OACA,WACA,MAEA,EACA;AACA;AACA,kCACA,mCACA,iCAEA,qBACA,WACA,gCACA,oBACA,MAEA,oBACA,oBACA,kBACA,MAEA,oBACA,oCACA,GAEA,+BACA,gCAEA,mDACA,4BACA,gCACA,8BACA,iBACA,EACA,MACA,CAEA,iBACA,oDACA,kBACA,MAEA,8CAEA,0CACA,KACA,EACA,gBACA,kBACA,kCAEA,sBACA,kBACA,cAEA,kBACA,CACA;MACA,IAEA,QACA,CACA;4BACA,GAEA,aACA,IAEA,CAlBA,CAmBA,mCACA,uBACA,GACA;sCACA,2BACA,QACA,OACA,GAEA,EACA,8BACA,wBACA,GACA,EACA,qBACA,+BACA,WACA,+BACA,8BACA,IACA,OACA,KACA,CACA;AACA,6BACA,yDACA,yBACA,6BACA,8BACA,KAEA,0FCzMA;;;;;;;;;;;;;;;;;;;;;;GAEA,aAMA;;;;GACA,qBACA,cACA,mCACA,oCACA,uBACA,+GACA,4BACA,sBACA,KACA;AACA,wBACA,gCACA,SACA,uBACA,CACA,4BACA,kCACA,gEACA,GAEA,OACA,UACA,CAaA;;;;;;;;;;GAcA;;;;;;;;;;;;;IACA,4BACA,sBACA,sCAEA,uCACA,gBACA,QACA,mBACA,wCACA,QACA,CAEA,OACA,QACA,CAsEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GACA,8CACA,sBAEA,UACA;gCACA,SACA,GAEA,CACA;iCACA,kCACA,qBACA,4DACA,qBACA,6BAEA,iCACA,2EACA,qBACA,8HACA,qBACA,6CACA,CACA,CAEA,GACA;SACA,wBACA,4CACA,sBAEA,iEACA,QACA,QACA,UACA,SACA,UACA,CACA,GACA,GACA,qBACA,2BACA,4CACA,CACA;AACA;4HACA,QACA,QACA,UACA,SACA,WACA,CACA,GACA,QACA,CACA;AACA;8EACA,IACA,CAEA,SACA,UACA,iHC9MA;;;;;;;;;;;;;;;;;;;;;;GAEA,aACA,mCACA,uDAKA;;;;GACA,iCACA,MACA,kBACA,EAGA;;GACA,8BACA,mCAEA,6BACA,IACA,uBACA,MACA,kBACA,CACA,4CChDA,8BAwBA;;;;;;;;;;;;;;;;;;;;;;GAEA,aACA,oBACA,cACA,+DACA,OAWA;;;;;;;;;;GACA,uDACA,4DACA,SACA,QAEA,0CACA,QACA,UACA,UACA,CACA;kCACA,YACA,MAEA,CACA,0BACA,SACA,UACA,WACA,oBACA,KACA,CACA,GACA,CAEA,wCACA,qCACA,mBACA,8FACA,mBACA,uHACA,wDACA,IACA,kGACA,mBACA,6CAEA,SACA,6DAEA,oCACA,IACA,oCACA,yBACA,UACA,MACA,MACA,uBACA,aACA,MACA,UACA,KACA,CACA,2DC/FA;AACA,8BACA,aACA,mBACA,iBACA,gBACA,EACA,0BACA,UACA,6BACA,2BACA,YACA,aACA,EACA,iBACA,CACA,aACA,CACA,CACA,qBACA,aACA,CACA,OACA,wBACA,0BAEA,mBACA,iBACA,cACA,YACA,0BACA,iBACA,0BACA,MACA,CACA,aACA,YACA,OACA,cACA,cACA,mBACA,SACA,CACA,8BACA,qCACA,yBACA,oCACA,qBACA,GACA,CACA,yBACA,sCACA,uBACA,GACA,CACA,EACA;AACA,wBACA,UACA,eACA,OACA,6BACA,0BACA,SACA,wBACA,qBACA,eACA,gBACA;AACA,iBACA,GACA,gBACA,CACA,gBACA,yBACA,kBACA,iBACA,4BACA,gCACA,aACA,KACA,8BACA,iBACA,oCACA,EACA,mCACA,2BACA,iBACA,oCACA,kCACA,4CC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA,aACA;AACA;AACA;AACA,iCACA,iDACA,MACA,CACA,0CACA,UACA,WACA,YAEA,0CACA,OACA,KAEA,YACA,kBAEA,iBACA,mDACA,iBACA,QAEA,YACA,OACA;0BACA,KACA,QAEA,uBACA,4BACA,qBACA,gBAEA,YACA,iBACA,uBACA,QACA,MACA,OACA,GAEA,sBACA,2BAEA,gCACA,QACA,2BACA,aACA,QACA,gBACA,GACA,CAEA,OACA,KACA,EACA,uCACA,6CACA,iBACA,6CCpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA,aACA,qDACA,cACA,6CACA,eAEA,OACA,0BAEA,YACA,8BAEA,GACA,cAEA,IACA,EACA,wCACA,UACA,WACA,kBACA,KACA,UAEA,mEACA,uCACA,kDACA,sBACA,8BACA,iDACA,YACA,UACA,qDACA,KACA,SAEA,KAEA,gBACA,uDACA,yCACA,MACA,EACA,uCACA,6CACA,iBACA,EACA,kBACA,yBACA,WACA,+BACA,kBACA,IACA,OACA,KACA,CACA,yCACA,SACA,sBACA,2DACA,KACA,OACA,KACA,6CCpFA,aACA,iDACA,yCACA,gFCJA,CAUA;;;;;;;;GACA,uCACA,SACA,cACA,kCACA,EACA,YAEA,qBACA,uCACA,KAEA,OACA,mDCvBA,aACA,4BACA,2CACA,0CAEA,0CACA,OACA,KAEA,0BACA,KACA,6CCRA;;GACA,+BACA,6BACA,0CACA,qBACA,eAIA;;GACA,SACA,gCACA;KACA,2CACA;KACA,WACA;KACA,KACA,CAIA;;GACA,gBACA,EAWA;;;;;;;;;GACA,oBACA,0BAEA,YACA,SACA,oBACA,oBACA,0BACA,MACA,cAEA,QACA,CAIA;;GACA,0DACA,SAIA;;GACA,yBACA,SACA,wDACA,+BACA,WACA,uBACA,6DACA,8DACA,8DACA,0DACA,CACA,OACA,OACA,EAQA;;;;;;GACA,YACA,iCACA,kDACA,EAQA;;;;;;GACA,uBACA,yBACA,eACA,sBACA,mBACA,uCACA,MACA,CACA,mBACA,KACA,CASA;;;;;;;GACA,+CACA,uBACA,+BACA,mCACA,GACA,GACA,+BACA,4BACA,MACA,CAKA;;2BAEA,UAOA;;;;;;IACA,yBACA,SACA,uBACA,QACA,UAEA,6CACA,YACA,oBACA,gEACA,IAEA,OACA,KACA,CAIA;;GACA,oBACA,YAOA;;;;;GACA,cACA,MACA,iBACA,uBACA,6BACA,2CACA,gDAEA,qCAUA;;;;;;;qBACA,qCACA,kCAGA,WAQA;;;;;;;IACA,cACA,qCACA,oCAEA,OASA;;;;;;;GACA,yBACA,qBACA,oBACA,MACA,UACA,SACA,UAEA,iBAEA;uCACA,YACA,sBACA,+BACA,wCACA,kBACA,IAEA,OACA,QACA,CAQA;;;;;;GACA,qBACA,2BACA,MACA,CAQA;;;;;;GACA,kBACA,2BACA,QACA,EAQA;;;;;;GACA,oBACA,mDACA,qBACA,mBACA,kBAEA,6BACA,UACA,OACA,IACA,EA8CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GACA,8BACA,kBACA,YACA,sBACA,IACA;gIACA,qBACA,aACA,kCACA,6CACA,sDACA,yBACA;AACA;AACA;uDACA,8CACA,mCACA,mDACA,UACA,KACA,CAQA;;;;;;GACA,sCACA,0BACA,eACA,EAYA;;;;;;;;;;GACA,uDACA,CACA;oCACA,kBAEA,IACA;eACA,sCACA,MACA,EAWA;;;;;;;;;GACA,0CACA,8BACA,mCACA,qBACA,oBACA,+CACA,eACA,KACA,KACA,EAqBA;;;;;;;;;;;;;;;;;;;GACA,uDACA,CACA;iBACA,QACA,IAEA,qBAEA,EACA;4BACA,uBAEA,KACA;aACA,gBACA,yBACA,yBACA,4BACA,UACA,UAEA,MACA;mBACA,2BACA,4BACA,8BACA,+BACA,0BACA,2BACA,OACA,EAOA;;;;;GACA,qCACA,cACA,mBACA,mBAEA,sDACA,sBACA,qBACA,kBACA,eAEA,UACA,KACA,EAIA;;GACA,iBACA,SAQA;;;;;;GACA,4BACA,UACA,8BACA,eACA,gBACA,mBACA;gBACA;wBACA,SACA,aAEA,QACA,kBACA,eACA,eACA,oDACA,kBACA,EACA;sEACA,KACA;yDACA,0BACA,KAEA,sBAEA,YACA,0BACA,KAEA,oCACA,0BACA,KAEA,uCACA,+CACA,qBACA,uBAEA,6BACA,KACA,GACA,CAIA;;GACA,2BACA,2BACA,oCACA,KACA,CAOA;;;;;GACA,kCACA,iBACA,oBACA,cACA,aACA,yBACA,eACA,MACA,EAsBA;;;;;;;;;;;;;;;;;;;;GACA,qCACA,8CACA,YACA,MACA,EAeA;;;;;;;;;;;;;GACA,4CACA,oBACA,UACA,MACA,EAoBA;;;;;;;;;;;;;;;;;;GACA,uCACA,wCACA,YACA,MACA,EAUA;;;;;;;;GACA,kDACA,aACA,SACA,MAEA,SAEA,gBACA,UACA,8BACA,wCACA,KAEA,UACA,qBACA,mBACA,KAEA,aACA,MACA,EAcA;;;;;;;;;;;;EACA,qCACA,uCACA,6BACA,WACA,MACA,EAiBA;;;;;;;;;;;;;;;GACA,sDACA,sDACA,YACA,MACA,EACA,yCACA,oBACA,yBACA,WACA,aACA,UACA,EAwCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GACA,qCACA,kBACA,4BAEA,gBACA;6BACA,qBACA,sBACA,KACA,gCACA,oBACA,0BACA,6DACA,iBACA,qBACA,KACA,UACA,6BACA,KACA,MACA,YACA,KAEA,6BACA,yBACA,cACA,MACA,EAGA;;GACA,+CACA,iBACA,cACA,kHACA,gBACA,UACA,MACA,EACA,mDACA,cACA,SACA,MACA,EASA;;;;;;;GACA,4CACA,aACA,eACA,sBACA,KACA,EAMA;;;;GACA,6CACA,mBACA,gLAEA,qBACA,uBACA,oBAEA,kBACA,KACA,EAMA;;;;GACA,yCACA,kBACA,iDACA,2BACA,sBACA,KACA,EAWA;;;;;;;;;GACA,4CACA,uBACA,WACA,MACA,EASA;;;;;;;GACA,kCACA,UACA,8BACA,oCACA,sBACA,uCAEA,MACA;mBAEA,KACA;iCACA,sBAEA,OACA;AACA;GACA,iDAEA,cACA,8BACA,+BACA,mBACA,mBACA,WACA,OAEA,EACA;6CACA,cACA,4BACA,IACA,aACA,gCACA,GACA,mCACA,gBACA,eACA,IACA,8CACA,uBACA,eACA,UACA,CAKA,CAJA;AACA;AACA;AAGA;yBACA,kCACA,eACA,UACA,UACA,SAEA,CACA;SACA,+BACA,mCACA,SACA,UACA,MAEA,CACA;gCACA,uDACA,eACA,+BACA,MAEA,CACA;6CAEA,KACA;iFACA,CACA;6BACA,oGACA,mEACA,gDACA,MAEA,CACA;6BACA,6BACA,gDACA,QAEA,uBACA,uBACA,cAEA,CACA;oBAEA,MACA;AACA;wCACA,YACA,MAEA,EAIA;;GACA,gBACA,QAUA;;;;;;;;GACA,iCACA,uBACA,6CACA,uBACA,oBACA,UACA,KACA,EAUA;;;;;;;;GACA,kCACA,wBACA,6CACA,sBACA,oBACA,UACA,KACA,EASA;;;;;;;GACA,oBACA,0BACA,mBACA,UACA,KACA,EACA,mBACA,kBACA,IAUA;;;;;;;;GACA,mCACA,yBACA,6CACA,sBACA,oBACA,UACA,KACA,EAUA;;;;;;;;GACA,kCACA,wBACA,6CACA,sBACA,oBACA,UACA,KACA,EAUA;;;;;;;;GACA,iCACA,uBACA,6CACA,sBACA,oBACA,UACA,KACA,wHC9iCA;;;;;;GACA,sBACA,oCACA,6CACA,CACA,eACA,oDCXA;;GACA,qBACA,eAOA;;;;;GACA,6CACA,eACA,oBACA,cACA,MACA,EASA;;;;;;;GACA,gCACA,cACA,SACA,MACA,EAQA;;;;;;GACA,oCACA,eACA,SACA,MACA,EAQA;;;;;;GACA,0CACA,kCACA,yBACA,KACA,GACA,EAIA;;GACA,4BACA,IACA,YACA,MAEA,EASA;;;;;;;GACA,2BACA,2BACA,eACA,EAYA;;;;;;;;;;GACA,0BACA,IAqBA;;;;;;;;;;;;;;;;;;;GACA,+BACA,oBACA,sBACA,oBACA,MACA,OACA,MACA,mCACA,uBACA,UACA,MACA,EAYA;;;;;;;;;;;GACA,6BACA,2BACA,kCACA,aACA,MACA,EAeA;;;;;;;;;;;;;;GACA,gCACA,iCACA,WACA,MACA,6DCtKA;AACA;AAeA;;;;;;;;;;;;;GACA,+CACA,CACA;0BACA,iDACA,KAEA,CACA;uBACA,qCACA,QAEA,sCACA,KACA,CACA,eACA,mDC/BA,8FAGA,CAKA;;;;OAEA,UACA,mEAEA;AACA,iCACA,QACA,OACA,QACA,QACA,gBACA,gBACA;cAEA;AACA,wCACA,qCACA;4CAEA;AACA,4BACA,YACA,8DACA,iEAGA,iBACA,+CACA,gBACA,gCAEA,aACA,yBAEA,IAEA,8EAMA;;;;;wBACA,6BACA,OAEA,CAQA;;;;;;;0BACA,kBACA,kBACA,kBACA,yBACA,SACA,OACA,QAEA,CAUA;;;;;;;;;iCACA,wBACA,gBACA,qBACA,CACA;AACA;gBACA,iBACA,GACA,CACA;sCACA,gCACA,qCACA,mBACA,QAEA,CAaA;;;;;;;;;;;;+BACA,YACA,WACA,gBACA,OACA,MACA,2BACA,yBACA,2DACA,CACA;wBACA,sCACA;8CACA,cACA,CACA;AACA;YACA,OACA,UACA,MACA,aACA,OACA,CACA,OACA,QAEA,CAQA;;;;;;;8BACA,iCACA,YACA,mBACA,QACA,oDACA,2BACA,MACA,4BACA,aACA,gBACA,IAEA,CASA;;;;;;;;oCACA,oBACA,kBACA,GACA,oBACA,kBACA,GACA,oBACA,kBACA,GACA,OACA,MAEA,CAWA;;;;;;;;;;qCACA,CACA;AACA;0CACA,GAEA,CAKA;;;;6CACA,OACA,2CACA,qBACA,2EACA,mBACA,eACA,+CACA,OAEA,CAOA;;;;;;0BACA,CACA;WACA,qBACA,OACA,MACA,IACA,cACA,YACA,MACA,EACA,MACA,KACA,EACA,EACA,MACA,EACA,iCAEA,WACA;AACA;AAEA;wBACA,sBACA,OACA,EAEA,qBACA,CACA;6BACA,OACA,aACA,8BACA,IAEA,CACA;AAEA;wEAEA,CACA;AACA;AACA;AACA;AACA;iDAEA,uBACA,OACA,iBAEA,qCAEA,oDACA,OACA,YAEA,UACA,qCAEA,gBACA,CACA,MAEA,iBACA,gCACA,OACA,YAEA,IAEA,WAEA,mBACA,8BAEA,GACA;AACA;yBACA,OACA,YAEA,YACA,QAEA,IACA;oBAEA,GAEA,mBACA,QAEA,CAOA;;;;;;0BACA,IACA,GACA,MACA,eACA,YACA,KACA,EACA,EACA,EACA,EACA,EACA,oBACA,GACA,oEACA,YACA,iCACA,sBACA,WAEA,QACA;iBAEA,OACA;kBAEA,OACA;EACA,eACA,OAEA,YACA;0BACA,oBACA,wBACA,gCACA,eACA,CAEA,mCAEA,OACA;AAEA;AACA;eACA,aACA,WAEA,CACA;iCAEA,CACA;AACA;mCACA,oBACA,sCACA,GACA,aACA,CAEA,CACA;AACA;qCACA,qDACA,OACA,YAEA,cACA,wBAEA,4BACA,oBAEA,qCACA,OACA,YAEA,oBACA,CACA;8CACA,oCACA,YACA,CACA,MACA,WACA,kBACA,SACA,0DAEA,qBACA,YAEA,+CACA,4DACA,mBACA,IACA,eACA,CAEA,GACA,QAEA,EACA,oBACA,IAEA,CAWA;;;;;;;;;;6BACA,wCACA,2BACA,+BACA,eACA,OACA,GAEA,CAWA;;;;;;;;;;2BACA,wCACA,2BACA,sBACA,QACA,OACA,GAEA,CAEA,8EACA,sCAMA;;;;aACA,OANA,CAaA;;;;;;UACA,QACA,kBAEA,mBACA,cACA,eACA,kBAGA,iBACA,UACA,GA7eA,CA8eA,iIChfA;AACA,0BACA,yBACA,QACA,2HCJA;AACA,6EACA,0FAGA,6CACA,CACA;oBACA,oCACA,8BACA,OACA,YACA,kDACA,CACA;sGACA,iBACA,UACA,CACA;oBACA,iBACA,IACA,CACA;AACA;AACA;MACA,YAEA,CAvBA,CADA,uDCHA;AACA,wFACA,4CACA,gBACA,WACA,iBACA,UACA,yCACA,sBACA,IACA,kBACA,0BACA,sBACA,uBACA,0BACA,GACA,yBACA,oBACA,IACA,KACA,aACA,GACA,CACA,qBACA,iBACA,IACA,oBACA,YACA;oUACA,WACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;mWACA,OACA;oiCACA,8BACA,YACA,cACA,+BACA,4BACA,yCACA,OACA,sBACA,mLACA,GACA,gEAEA,4CACA,+CACA,kBACA,6BACA,2DACA,kBACA,4BACA,CACA,iEACA,mBACA,8BACA,kCACA,sCACA,4CACA,6BACA,mBACA,QACA,iCACA,sDACA,iBACA,MACA,CACA,UACA,6DACA,SACA,UACA,uDACA,SACA,MACA,uBACA,uFACA,SAEA,OACA,IACA,kCACA,QACA,kBACA,4CACA,sBACA,wCACA,8DACA,CACA;GACA,iEACA,eACA,SACA,+GACA,EACA,CACA,KACA,gDACA,cACA,iBACA,KACA,OACA,YACA,CA1DA,iDA2DA,2BACA,UACA,mCACA,sBACA,iCACA,kCACA,qCACA,yHACA,6CACA,CACA;GACA,8GACA,QACA,SACA,8IACA,EACA,CACA,KACA,2HACA,YACA,qBACA,OACA,yBACA,KACA,oDACA,iBACA,sCACA,sBACA,gCACA,gBACA,6BACA,gCACA,kHACA,YACA,mHACA,aACA,CACA,kBACA,8BACA,KACA,OACA,YAEA,GACA,4EC7JA;AACA,6EACA,gDAEA,qaACA,2DACA;mBACA,yCACA,oDACA,0BACA,sBACA,oCACA,6BACA,+BACA,WACA,YACA,0BACA,wCACA,QACA;AACA;kBACA,CACA;kCACA,yCACA,OACA,YACA,+BAEA,WACA,mBACA,+BACA,6CACA,SACA,KACA,oCACA,yBACA,OACA,YACA,kDACA,8CACA,kCACA,0BACA,wBACA,wBACA,QACA,mBACA,uGACA,IACA,OACA,YAEA,GACA;wBACA,yCACA,wEACA,oCACA,qBACA,OACA,YACA,kDACA,CACA;uEACA,CACA;kBACA,UACA,KACA,CACA;sCACA,cACA,gDACA,SAEA,GACA,IAtEA,uDCKA;;;;;;;;GA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;GACA;AACA;AAIA;;;GACA,mBAIA;;;GACA,0BAIA;;;GACA,+BACA,kBACA,iBACA,UACA,yCACA,sBACA,IACA,kBACA,0BACA,sBACA,uBACA,0BACA,GACA,yBACA,oBACA,IACA,KACA,aACA,GACA,CACA,qBACA,iBACA,IACA,0BACA,yoHACA,WACA,gFACA,sEACA,0EACA,mEACA,4EACA,kFACA,gGACA,wFACA,8DACA,wCACA,oEACA,yCAEA,MACA,uWACA,kCACA,yBACA,OACA,yBACA,wBACA,yBACA,wBACA,6EAEA,yIACA,oBACA,GACA,0BACA,sCACA,cACA,8BACA,aACA,6BACA,MACA,EACA,uBACA,YACA,+BACA,6CACA,IACA,KACA,sBACA,GACA,IACA,EACA,gBACA,YACA,+BACA,kCACA,yDACA,IACA,KACA,sBACA,GACA,IACA,EACA,KACA,sBACA,MACA,EACA,CACA,OACA,QACA,mBACA,wHACA,cACA,0BACA,YACA,cACA,aACA,4DACA,+BACA,wBACA,kDACA,OACA,eACA,4IACA,6BACA,gLACA,kCACA,kLACA,kCACA,iNACA,mCACA,uKACA,sCACA,gLACA,mBACA,YACA,CACA,kCACA,iCACA,qHACA,qCACA,+DACA,mCACA,kCACA,oBACA,eACA,CACA;wBACA,IACA,KACA,CACA;yBACA,IACA,CACA,aACA,YACA,iBACA,4CACA,qDACA,WACA,CACA,KACA,yBACA,WACA,YACA,0BACA,CACA;0BACA,GACA;4BACA,2BACA,uCACA,gCACA,4BACA,+BACA,GACA;0BACA,yBACA,GACA,CACA,KACA,CACA;8BACA,UACA;2DACA,kEACA,8CACA,gCACA,2DACA,qEACA,UACA;0BACA,6EACA,UACA,CACA,CACA;4KACA,sBACA,gBACA,uCACA,sBACA,WACA,yCACA,sBACA,WACA,KACA,sBACA,MACA,CACA;6FACA,sEACA,cACA,CACA;8DACA,eACA;6HACA,CACA;kFACA,CACA;GACA,4FACA,eACA,SACA,sGACA,EACA,CACA,CACA;uCACA,cACA,KACA,CACA;uCACA,UACA,CACA;sCACA,gCACA,SACA,CACA,KACA,YACA,wCACA,yBACA,OACA,YACA,CACA,iDACA,eACA,sCACA,2BACA,yBACA,KACA,gCACA,2BACA,MACA,sCACA,gBACA,6CACA,KACA,4CACA,UACA,CACA,kCACA,eACA,qBACA,sBACA,0BACA,IACA,2BACA,0BACA,KACA,2BACA,0BACA,YACA,MACA,mCACA,OACA,GACA,KACA,qBACA,uBACA,oBACA,GACA,CACA,oBACA,IACA,CACA,uCACA,iCACA,2GACA,EACA;8DACA,eACA;gCACA,6CACA,SACA;mIACA,CACA;GACA,sJACA,MACA,SACA,qIACA,EACA,CACA,CACA;uCACA,6DACA,2BACA,uBACA,KACA,0CACA,kCACA,iCACA,gBACA,MACA,gBACA,+DACA,gBACA,KACA,CACA,gCACA,cACA,6EACA,qBACA,GACA,0BACA,6BACA;AACA,gBACA,GACA,iCACA,gBACA,+BACA,OACA,oCACA,gBACA,+BACA,UACA,2BACA;AACA,CACA,oEACA,iCACA,YACA,yBACA,6CACA;oDACA;AACA,kBACA,yCACA,wBACA,OACA;yBACA,8BACA,0BACA,4CACA,4BACA,MACA,KACA,wFACA,CACA;yBACA,8BACA,0BACA,4CACA,4BACA,MACA,KACA,mBACA,kBACA,mCACA,uBACA,MACA,KACA,mBACA,MACA,CACA,KACA,kCACA,wCACA,MACA,KACA,0FACA,0BACA,KACA,oBACA,sBACA,KA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","file":"json-schema-form-core.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 13);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap f9caa5536d030fc29e16","export { parse } from 'objectpath';\r\nexport { stringify } from 'objectpath';\r\nexport { normalize } from 'objectpath';\r\n\r\n/**\r\n * I am a name formatter function for processing keys into names for classes or Id.\r\n *\r\n * @param {Array} key I am the key array of a processed schema key\r\n * @param {string} separator I am the separator between the key items and optional form name\r\n * @param {string} formName I am an optional form name\r\n * @param {boolean} omitNumbers I determine if numeric values should be included in the output or withheld\r\n *\r\n * @return {string} I am the formatted key\r\n */\r\nexport function name (key: Array, separator?: string, formName = '', omitNumbers = false) {\r\n if (key) {\r\n let fieldKey = key.slice();\r\n let fieldSeparator = separator || '-';\r\n\r\n if (omitNumbers) {\r\n fieldKey = fieldKey.filter(function(currentKey: any) {\r\n return typeof currentKey !== 'number';\r\n });\r\n };\r\n\r\n return ((formName.length !== 0)\r\n ? formName + fieldSeparator\r\n : ''\r\n ) + fieldKey.join(fieldSeparator);\r\n };\r\n\r\n return '';\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/sf-path.js","// Takes a titleMap in either object or list format and returns one\r\n// in the list format.\r\nexport default function(titleMap: Array, originalEnum?: any) {\r\n if (!Array.isArray(titleMap)) {\r\n const canonical = [];\r\n if (originalEnum) {\r\n originalEnum.forEach((value) => {\r\n canonical.push({ name: titleMap[value], value });\r\n });\r\n }\r\n else {\r\n Object.keys(titleMap).forEach((value) => {\r\n canonical.push({ name: titleMap[value], value });\r\n });\r\n }\r\n return canonical;\r\n }\r\n return titleMap;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/canonical-title-map.js","module.exports = require('./lib/ObjectPath.js').ObjectPath;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/objectpath/index.js\n// module id = 2\n// module chunks = 0","import { stringify } from './sf-path';\r\nimport canonicalTitleMap from './canonical-title-map';\r\n\r\n/* Utils */\r\nconst stripNullType = (type) => {\r\n if (Array.isArray(type) && type.length === 2) {\r\n if (type[0] === 'null') {\r\n return type[1];\r\n };\r\n if (type[1] === 'null') {\r\n return type[0];\r\n };\r\n };\r\n return type;\r\n};\r\n\r\n// Creates an default titleMap list from an enum, i.e. a list of strings.\r\nconst enumToTitleMap = (enm) => {\r\n const titleMap = []; // canonical titleMap format is a list.\r\n enm.forEach((name) => {\r\n titleMap.push({ name, value: name });\r\n });\r\n return titleMap;\r\n};\r\n\r\n/**\r\n * Creates a default form definition from a schema.\r\n */\r\nexport function defaultFormDefinition(schemaTypes, name, schema, options) {\r\n const rules = schemaTypes[stripNullType(schema.type)];\r\n if (rules) {\r\n let def;\r\n // We give each rule a possibility to recurse it's children.\r\n const innerDefaultFormDefinition = (childName, childSchema , childOptions) =>\r\n defaultFormDefinition(schemaTypes, childName, childSchema, childOptions);\r\n for (let i = 0; i < rules.length; i++) {\r\n def = rules[i](name, schema, options, innerDefaultFormDefinition);\r\n\r\n // first handler in list that actually returns something is our handler!\r\n if (def) {\r\n\r\n // Do we have form defaults in the schema under the x-schema-form-attribute?\r\n if (def.schema['x-schema-form']) {\r\n Object.assign(def, def.schema['x-schema-form']);\r\n }\r\n\r\n return def;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates a form object with all common properties\r\n */\r\nexport function stdFormObj(name, schema, options) {\r\n options = options || {};\r\n\r\n // The Object.assign used to be a angular.copy. Should work though.\r\n const f = options.global && options.global.formDefaults ?\r\n Object.assign({}, options.global.formDefaults) : {};\r\n if (options.global && options.global.supressPropertyTitles === true) {\r\n f.title = schema.title;\r\n }\r\n else {\r\n f.title = schema.title || name;\r\n }\r\n\r\n if (schema.description) { f.description = schema.description; }\r\n if (options.required === true || schema.required === true) { f.required = true; }\r\n if (schema.maxLength) { f.maxlength = schema.maxLength; }\r\n if (schema.minLength) { f.minlength = schema.minLength; }\r\n if (schema.readOnly || schema.readonly) { f.readonly = true; }\r\n if (schema.minimum) { f.minimum = schema.minimum + (schema.exclusiveMinimum ? 1 : 0); }\r\n if (schema.maximum) { f.maximum = schema.maximum - (schema.exclusiveMaximum ? 1 : 0); }\r\n\r\n // Non standard attributes (DONT USE DEPRECATED)\r\n // If you must set stuff like this in the schema use the x-schema-form attribute\r\n if (schema.validationMessage) { f.validationMessage = schema.validationMessage; }\r\n if (schema.enumNames) { f.titleMap = canonicalTitleMap(schema.enumNames, schema['enum']); }\r\n f.schema = schema;\r\n\r\n // Ng model options doesn't play nice with undefined, might be defined\r\n // globally though\r\n f.ngModelOptions = f.ngModelOptions || {};\r\n\r\n return f;\r\n};\r\n\r\n/*** Schema types to form type mappings, with defaults ***/\r\nexport function text(name, schema, options) {\r\n if (stripNullType(schema.type) === 'string' && !schema['enum']) {\r\n const f = stdFormObj(name, schema, options);\r\n f.key = options.path;\r\n f.type = 'text';\r\n options.lookup[stringify(options.path)] = f;\r\n return f;\r\n }\r\n}\r\n\r\n// default in json form for number and integer is a text field\r\n// input type=\"number\" would be more suitable don't ya think?\r\nexport function number(name, schema, options) {\r\n if (stripNullType(schema.type) === 'number') {\r\n const f = stdFormObj(name, schema, options);\r\n f.key = options.path;\r\n f.type = 'number';\r\n options.lookup[stringify(options.path)] = f;\r\n return f;\r\n }\r\n}\r\n\r\nexport function integer(name, schema, options) {\r\n if (stripNullType(schema.type) === 'integer') {\r\n const f = stdFormObj(name, schema, options);\r\n f.key = options.path;\r\n f.type = 'number';\r\n options.lookup[stringify(options.path)] = f;\r\n return f;\r\n }\r\n}\r\n\r\nexport function checkbox(name, schema, options) {\r\n if (stripNullType(schema.type) === 'boolean') {\r\n const f = stdFormObj(name, schema, options);\r\n f.key = options.path;\r\n f.type = 'checkbox';\r\n options.lookup[stringify(options.path)] = f;\r\n return f;\r\n }\r\n}\r\n\r\nexport function select(name, schema, options) {\r\n if (stripNullType(schema.type) === 'string' && schema['enum']) {\r\n const f = stdFormObj(name, schema, options);\r\n f.key = options.path;\r\n f.type = 'select';\r\n if (!f.titleMap) {\r\n f.titleMap = enumToTitleMap(schema['enum']);\r\n }\r\n options.lookup[stringify(options.path)] = f;\r\n return f;\r\n }\r\n}\r\n\r\nexport function checkboxes(name, schema, options) {\r\n if (stripNullType(schema.type) === 'array' && schema.items && schema.items['enum']) {\r\n const f = stdFormObj(name, schema, options);\r\n f.key = options.path;\r\n f.type = 'checkboxes';\r\n if (!f.titleMap) {\r\n f.titleMap = enumToTitleMap(schema.items['enum']);\r\n }\r\n options.lookup[stringify(options.path)] = f;\r\n return f;\r\n }\r\n}\r\n\r\nexport function fieldset(name, schema, options, defaultFormDef) {\r\n if (stripNullType(schema.type) === 'object') {\r\n const f = stdFormObj(name, schema, options);\r\n f.type = 'fieldset';\r\n f.key = options.path;\r\n f.items = [];\r\n options.lookup[stringify(options.path)] = f;\r\n\r\n // recurse down into properties\r\n if (schema.properties) {\r\n Object.keys(schema.properties).forEach((key) => {\r\n const value = schema.properties[key];\r\n const path = options.path.slice();\r\n path.push(key);\r\n if (options.ignore[stringify(path)] !== true) {\r\n const required = schema.required && schema.required.indexOf(key) !== -1;\r\n\r\n const def = defaultFormDef(key, value, {\r\n path,\r\n required: required || false,\r\n lookup: options.lookup,\r\n ignore: options.ignore,\r\n global: options.global\r\n });\r\n if (def) {\r\n f.items.push(def);\r\n }\r\n }\r\n });\r\n }\r\n return f;\r\n }\r\n}\r\n\r\nexport function array(name, schema, options, defaultFormDef) {\r\n if (stripNullType(schema.type) === 'array') {\r\n const f = stdFormObj(name, schema, options);\r\n f.type = 'array';\r\n f.key = options.path;\r\n options.lookup[stringify(options.path)] = f;\r\n\r\n const required = schema.required &&\r\n schema.required.indexOf(options.path[options.path.length - 1]) !== -1;\r\n\r\n // The default is to always just create one child. This works since if the\r\n // schemas items declaration is of type: \"object\" then we get a fieldset.\r\n // We also follow json form notatation, adding empty brackets \"[]\" to\r\n // signify arrays.\r\n\r\n const arrPath = options.path.slice();\r\n arrPath.push('');\r\n\r\n f.items = [\r\n defaultFormDef(name, schema.items, {\r\n path: arrPath,\r\n required: required || false,\r\n lookup: options.lookup,\r\n ignore: options.ignore,\r\n global: options.global\r\n })\r\n ];\r\n\r\n return f;\r\n }\r\n}\r\n\r\nexport function createDefaults() {\r\n // First sorted by schema type then a list.\r\n // Order has importance. First handler returning an form snippet will be used.\r\n return {\r\n string: [ select, text ],\r\n object: [ fieldset ],\r\n number: [ number ],\r\n integer: [ integer ],\r\n boolean: [ checkbox ],\r\n array: [ checkboxes, array ]\r\n };\r\n};\r\n\r\n/**\r\n * Create form defaults from schema\r\n */\r\nexport function defaultForm(schema: any, defaultSchemaTypes: any, ignore?: any, globalOptions?: any) {\r\n const form = [];\r\n const lookup = {}; // Map path => form obj for fast lookup in merging\r\n ignore = ignore || {};\r\n globalOptions = globalOptions || {};\r\n defaultSchemaTypes = defaultSchemaTypes || createDefaults();\r\n\r\n if (schema.properties) {\r\n Object.keys(schema.properties).forEach((key) => {\r\n if (ignore[key] !== true) {\r\n const required = schema.required && schema.required.indexOf(key) !== -1;\r\n const def = defaultFormDefinition(defaultSchemaTypes, key, schema.properties[key], {\r\n path: [ key ], // Path to this property in bracket notation.\r\n lookup: lookup, // Extra map to register with. Optimization for merger.\r\n ignore: ignore, // The ignore list of paths (sans root level name)\r\n required: required, // Is it required? (v4 json schema style)\r\n global: globalOptions // Global options, including form defaults\r\n });\r\n if (def) {\r\n form.push(def);\r\n }\r\n }\r\n });\r\n }\r\n else {\r\n throw new Error('Not implemented. Only type \"object\" allowed at root level of schema.');\r\n }\r\n return { form: form, lookup: lookup };\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/schema-defaults.js","import * as schemaDefaultsImp from './lib/schema-defaults';\r\nimport * as sfPathImp from './lib/sf-path';\r\nimport canonicalTitleMapImp from './lib/canonical-title-map';\r\n\r\nexport { merge } from './lib/merge';\r\nexport { select } from './lib/select';\r\nexport { jsonref } from './lib/resolve';\r\nexport { traverseSchema, traverseForm } from './lib/traverse';\r\nexport { validate } from './lib/validate';\r\n\r\nexport const sfPath = sfPathImp;\r\nexport const schemaDefaults = schemaDefaultsImp;\r\nexport const canonicalTitleMap = canonicalTitleMapImp;\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/module.js","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o -1) {\n combinedDetails = u2Details;\n } else {\n u1Details = isType(u1, 'Undefined') ? undefined : parseURI(u1);\n\n if (!isType(u1Details, 'Undefined')) {\n combinedDetails = u1Details;\n\n // Join the paths\n combinedDetails.path = slash(path.join(u1Details.path, u2Details.path));\n\n // Join query parameters\n combinedDetails.query = combineQueryParams(u1Details.query, u2Details.query);\n } else {\n combinedDetails = u2Details;\n }\n }\n\n // Remove the fragment\n combinedDetails.fragment = undefined;\n\n // For relative URIs, add back the '..' since it was removed above\n return (remoteUriTypes.indexOf(combinedDetails.reference) === -1 &&\n combinedDetails.path.indexOf('../') === 0 ? '../' : '') + URI.serialize(combinedDetails);\n}\n\nfunction findAncestors (obj, path) {\n var ancestors = [];\n var node;\n\n if (path.length > 0) {\n node = obj;\n\n path.slice(0, path.length - 1).forEach(function (seg) {\n if (seg in node) {\n node = node[seg];\n\n ancestors.push(node);\n }\n });\n }\n\n return ancestors;\n}\n\nfunction processSubDocument (mode, doc, subDocPath, refDetails, options, parents, parentPtrs, allRefs, indirect) {\n var refValue;\n var rOptions;\n\n if (subDocPath.length > 0) {\n try {\n refValue = findValue(doc, subDocPath);\n } catch (err) {\n // We only mark missing remote references as missing because local references can have deferred values\n if (mode === 'remote') {\n refDetails.error = err.message;\n refDetails.missing = true;\n }\n }\n } else {\n refValue = doc;\n }\n\n if (!isType(refValue, 'Undefined')) {\n refDetails.value = refValue;\n }\n\n if (isType(refValue, 'Array') || isType(refValue, 'Object')) {\n rOptions = clone(options);\n\n if (mode === 'local') {\n delete rOptions.subDocPath;\n\n // Traverse the dereferenced value\n doc = refValue;\n } else {\n rOptions.relativeBase = path.dirname(parents[parents.length - 1]);\n\n if (subDocPath.length === 0) {\n delete rOptions.subDocPath;\n } else {\n rOptions.subDocPath = subDocPath;\n }\n }\n\n return findRefsRecursive(doc, rOptions, parents, parentPtrs, allRefs, indirect);\n }\n}\n\n// Should this be its own exported API?\nfunction findRefsRecursive (obj, options, parents, parentPtrs, allRefs, indirect) {\n var allTasks = Promise.resolve();\n var parentPath = parentPtrs.length ? pathFromPtr(parentPtrs[parentPtrs.length - 1]) : [];\n var refs = findRefs(obj, options);\n var subDocPath = options.subDocPath || [];\n var subDocPtr = pathToPtr(subDocPath);\n var ancestorPtrs = ['#'];\n\n parents.forEach(function (parent, index) {\n if (parent.charAt(0) !== '#') {\n ancestorPtrs.push(parentPtrs[index]);\n }\n });\n\n // Reverse the order so we search them in the proper order\n ancestorPtrs.reverse();\n\n if ((parents[parents.length - 1] || '').charAt(0) !== '#') {\n allRefs.documents[pathToPtr(parentPath)] = obj;\n }\n\n Object.keys(refs).forEach(function (refPtr) {\n var refDetails = refs[refPtr];\n var location;\n var parentIndex;\n var refFullPath;\n var refFullPtr;\n\n // If there are no parents, treat the reference pointer as-is. Otherwise, the reference is a reference within a\n // remote document and its sub document path prefix must be removed.\n if (parents.length === 0) {\n refFullPath = parentPath.concat(pathFromPtr(refPtr));\n } else {\n refFullPath = parentPath.concat(pathFromPtr(refPtr).slice(parents.length === 0 ? 0 : subDocPath.length));\n }\n\n refFullPtr = pathToPtr(refFullPath);\n\n // It is possible to process the same reference more than once in the event of hierarchical references so we avoid\n // processing a reference if we've already done so.\n if (!isType(allRefs[refFullPtr], 'Undefined')) {\n return;\n }\n\n // Record the reference metadata\n allRefs.refs[refFullPtr] = refs[refPtr];\n\n // Do not process invalid references\n if (isType(refDetails.error, 'Undefined') && refDetails.type !== 'invalid') {\n if (remoteTypes.indexOf(refDetails.type) > -1) {\n location = combineURIs(options.relativeBase, refDetails.uri);\n parentIndex = parents.indexOf(location);\n } else {\n location = refDetails.uri;\n parentIndex = parentPtrs.indexOf(location);\n }\n\n // Record ancestor paths\n refDetails.ancestorPtrs = ancestorPtrs;\n\n // Record if the reference is indirect based on its parent\n refDetails.indirect = indirect;\n\n // Only process non-circular references further\n if (parentIndex === -1) {\n if (remoteTypes.indexOf(refDetails.type) > -1) {\n allTasks = allTasks\n .then(function () {\n return getRemoteDocument(location, options)\n .then(function (doc) {\n return processSubDocument('remote',\n doc,\n isType(refDetails.uriDetails.fragment, 'Undefined') ?\n [] :\n pathFromPtr(decodeURI(refDetails.uriDetails.fragment)),\n refDetails,\n options,\n parents.concat(location),\n parentPtrs.concat(refFullPtr),\n allRefs,\n indirect);\n })\n .catch(function (err) {\n refDetails.error = err.message;\n refDetails.missing = true;\n });\n });\n } else {\n if (refFullPtr.indexOf(location + '/') !== 0 && refFullPtr !== location &&\n subDocPtr.indexOf(location + '/') !== 0 && subDocPtr !== location) {\n if (location.indexOf(subDocPtr + '/') !== 0) {\n allTasks = allTasks\n .then(function () {\n return processSubDocument('local',\n obj,\n pathFromPtr(location),\n refDetails,\n options,\n parents.concat(location),\n parentPtrs.concat(refFullPtr),\n allRefs,\n indirect || (location.indexOf(subDocPtr + '/') === -1 && location !== subDocPtr));\n });\n }\n } else {\n refDetails.circular = true;\n }\n }\n } else {\n // Mark seen ancestors as circular\n parentPtrs.slice(parentIndex).forEach(function (parentPtr) {\n allRefs.refs[parentPtr].circular = true;\n });\n\n refDetails.circular = true;\n }\n }\n });\n\n allTasks = allTasks\n .then(function () {\n // Identify indirect, local circular references (Issue 82)\n var circulars = [];\n var processedRefPtrs = [];\n var processedRefs = [];\n\n function walkRefs (parentPtrs, parentRefs, refPtr, ref) {\n Object.keys(allRefs.refs).forEach(function (dRefPtr) {\n var dRefDetails = allRefs.refs[dRefPtr];\n\n // Do not process already processed references or references that are not a nested references\n if (processedRefs.indexOf(ref) === -1 && processedRefPtrs.indexOf(refPtr) === -1 &&\n circulars.indexOf(ref) === -1 && dRefPtr !== refPtr && dRefPtr.indexOf(ref + '/') === 0) {\n if (parentRefs.indexOf(ref) > -1) {\n parentRefs.forEach(function (parentRef) {\n if (circulars.indexOf(ref) === -1) {\n circulars.push(parentRef);\n }\n });\n } else {\n walkRefs(parentPtrs.concat(refPtr), parentRefs.concat(ref), dRefPtr, dRefDetails.uri);\n }\n\n processedRefPtrs.push(refPtr);\n processedRefs.push(ref);\n }\n });\n }\n\n Object.keys(allRefs.refs).forEach(function (refPtr) {\n var refDetails = allRefs.refs[refPtr];\n\n // Only process local, non-circular references\n if (refDetails.type === 'local' && !refDetails.circular && circulars.indexOf(refDetails.uri) === -1) {\n walkRefs([], [], refPtr, refDetails.uri);\n }\n });\n\n Object.keys(allRefs.refs).forEach(function (refPtr) {\n var refDetails = allRefs.refs[refPtr];\n\n if (circulars.indexOf(refDetails.uri) > -1) {\n refDetails.circular = true;\n }\n });\n })\n .then(function () {\n return allRefs;\n });\n\n return allTasks;\n}\n\nfunction findValue (obj, path) {\n var value = obj;\n\n path.forEach(function (seg) {\n seg = decodeURI(seg);\n\n if (seg in value) {\n value = value[seg];\n } else {\n throw Error('JSON Pointer points to missing location: ' + pathToPtr(path));\n }\n });\n\n return value;\n}\n\nfunction getExtraRefKeys (ref) {\n return Object.keys(ref).filter(function (key) {\n return key !== '$ref';\n });\n}\n\nfunction getRefType (refDetails) {\n var type;\n\n // Convert the URI reference to one of our types\n switch (refDetails.uriDetails.reference) {\n case 'absolute':\n case 'uri':\n type = 'remote';\n break;\n case 'same-document':\n type = 'local';\n break;\n default:\n type = refDetails.uriDetails.reference;\n }\n\n return type;\n}\n\nfunction getRemoteDocument (url, options) {\n var cacheEntry = remoteCache[url];\n var allTasks = Promise.resolve();\n var loaderOptions = clone(options.loaderOptions || {});\n\n if (isType(cacheEntry, 'Undefined')) {\n // If there is no content processor, default to processing the raw response as JSON\n if (isType(loaderOptions.processContent, 'Undefined')) {\n loaderOptions.processContent = function (res, callback) {\n callback(undefined, JSON.parse(res.text));\n };\n }\n\n // Attempt to load the resource using path-loader\n allTasks = PathLoader.load(decodeURI(url), loaderOptions);\n\n // Update the cache\n allTasks = allTasks\n .then(function (res) {\n remoteCache[url] = {\n value: res\n };\n\n return res;\n })\n .catch(function (err) {\n remoteCache[url] = {\n error: err\n };\n\n throw err;\n });\n } else {\n // Return the cached version\n allTasks = allTasks.then(function () {\n return cacheEntry.value;\n });\n }\n\n // Return a cloned version to avoid updating the cache\n allTasks = allTasks.then(function (res) {\n return clone(res);\n });\n\n return allTasks;\n}\n\nfunction isRefLike (obj, throwWithDetails) {\n var refLike = true;\n\n try {\n if (!isType(obj, 'Object')) {\n throw new Error('obj is not an Object');\n } else if (!isType(obj.$ref, 'String')) {\n throw new Error('obj.$ref is not a String');\n }\n } catch (err) {\n if (throwWithDetails) {\n throw err;\n }\n\n refLike = false;\n }\n\n return refLike;\n}\n\nfunction isType (obj, type) {\n // A PhantomJS bug (https://github.com/ariya/phantomjs/issues/11722) prohibits us from using the same approach for\n // undefined checking that we use for other types.\n if (type === 'Undefined') {\n return typeof obj === 'undefined';\n } else {\n return Object.prototype.toString.call(obj) === '[object ' + type + ']';\n }\n}\n\nfunction makeRefFilter (options) {\n var refFilter;\n var validTypes;\n\n if (isType(options.filter, 'Array') || isType(options.filter, 'String')) {\n validTypes = isType(options.filter, 'String') ? [options.filter] : options.filter;\n refFilter = function (refDetails) {\n // Check the exact type or for invalid URIs, check its original type\n return validTypes.indexOf(refDetails.type) > -1 || validTypes.indexOf(getRefType(refDetails)) > -1;\n };\n } else if (isType(options.filter, 'Function')) {\n refFilter = options.filter;\n } else if (isType(options.filter, 'Undefined')) {\n refFilter = function () {\n return true;\n };\n }\n\n return function (refDetails, path) {\n return (refDetails.type !== 'invalid' || options.includeInvalid === true) && refFilter(refDetails, path);\n };\n}\n\nfunction makeSubDocPath (options) {\n var subDocPath;\n\n if (isType(options.subDocPath, 'Array')) {\n subDocPath = options.subDocPath;\n } else if (isType(options.subDocPath, 'String')) {\n subDocPath = pathFromPtr(options.subDocPath);\n } else if (isType(options.subDocPath, 'Undefined')) {\n subDocPath = [];\n }\n\n return subDocPath;\n}\n\nfunction parseURI (uri) {\n // We decode first to avoid doubly encoding\n return URI.parse(encodeURI(decodeURI(uri)));\n}\n\nfunction setValue (obj, refPath, value) {\n findValue(obj, refPath.slice(0, refPath.length - 1))[decodeURI(refPath[refPath.length - 1])] = value;\n}\n\nfunction walk (ancestors, node, path, fn) {\n var processChildren = true;\n\n function walkItem (item, segment) {\n path.push(segment);\n walk(ancestors, item, path, fn);\n path.pop();\n }\n\n // Call the iteratee\n if (isType(fn, 'Function')) {\n processChildren = fn(ancestors, node, path);\n }\n\n // We do not process circular objects again\n if (ancestors.indexOf(node) === -1) {\n ancestors.push(node);\n\n if (processChildren !== false) {\n if (isType(node, 'Array')) {\n node.forEach(function (member, index) {\n walkItem(member, index.toString());\n });\n } else if (isType(node, 'Object')) {\n Object.keys(node).forEach(function (key) {\n walkItem(node[key], key);\n });\n }\n }\n }\n\n ancestors.pop();\n}\n\nfunction validateOptions (options, obj) {\n if (isType(options, 'Undefined')) {\n // Default to an empty options object\n options = {};\n } else {\n // Clone the options so we do not alter the ones passed in\n options = clone(options);\n }\n\n if (!isType(options, 'Object')) {\n throw new TypeError('options must be an Object');\n } else if (!isType(options.filter, 'Undefined') &&\n !isType(options.filter, 'Array') &&\n !isType(options.filter, 'Function') &&\n !isType(options.filter, 'String')) {\n throw new TypeError('options.filter must be an Array, a Function of a String');\n } else if (!isType(options.includeInvalid, 'Undefined') &&\n !isType(options.includeInvalid, 'Boolean')) {\n throw new TypeError('options.includeInvalid must be a Boolean');\n } else if (!isType(options.refPreProcessor, 'Undefined') &&\n !isType(options.refPreProcessor, 'Function')) {\n throw new TypeError('options.refPreProcessor must be a Function');\n } else if (!isType(options.refPostProcessor, 'Undefined') &&\n !isType(options.refPostProcessor, 'Function')) {\n throw new TypeError('options.refPostProcessor must be a Function');\n } else if (!isType(options.subDocPath, 'Undefined') &&\n !isType(options.subDocPath, 'Array') &&\n !isPtr(options.subDocPath)) {\n // If a pointer is provided, throw an error if it's not the proper type\n throw new TypeError('options.subDocPath must be an Array of path segments or a valid JSON Pointer');\n }\n\n options.filter = makeRefFilter(options);\n\n // Set the subDocPath to avoid everyone else having to compute it\n options.subDocPath = makeSubDocPath(options);\n\n if (!isType(obj, 'Undefined')) {\n try {\n findValue(obj, options.subDocPath);\n } catch (err) {\n err.message = err.message.replace('JSON Pointer', 'options.subDocPath');\n\n throw err;\n }\n }\n\n return options;\n}\n\n/* Module Members */\n\n/*\n * Each of the functions below are defined as function statements and *then* exported in two steps instead of one due\n * to a bug in jsdoc (https://github.com/jsdoc2md/jsdoc-parse/issues/18) that causes our documentation to be\n * generated improperly. The impact to the user is significant enough for us to warrant working around it until this\n * is fixed.\n */\n\n/**\n * The options used for various JsonRefs APIs.\n *\n * @typedef {object} JsonRefsOptions\n *\n * @param {string|string[]|function} [filter=function () {return true;}] - The filter to use when gathering JSON\n * References *(If this value is a single string or an array of strings, the value(s) are expected to be the `type(s)`\n * you are interested in collecting as described in {@link module:JsonRefs.getRefDetails}. If it is a function, it is\n * expected that the function behaves like {@link module:JsonRefs~RefDetailsFilter}.)*\n * @param {boolean} [includeInvalid=false] - Whether or not to include invalid JSON Reference details *(This will make\n * it so that objects that are like JSON Reference objects, as in they are an `Object` and the have a `$ref` property,\n * but fail validation will be included. This is very useful for when you want to know if you have invalid JSON\n * Reference definitions. This will not mean that APIs will process invalid JSON References but the reasons as to why\n * the JSON References are invalid will be included in the returned metadata.)*\n * @param {object} [loaderOptions] - The options to pass to\n * {@link https://github.com/whitlockjc/path-loader/blob/master/docs/API.md#module_PathLoader.load|PathLoader~load}\n * @param {module:JsonRefs~RefPreProcessor} [refPreProcessor] - The callback used to pre-process a JSON Reference like\n * object *(This is called prior to validating the JSON Reference like object and getting its details)*\n * @param {module:JsonRefs~RefPostProcessor} [refPostProcessor] - The callback used to post-process the JSON Reference\n * metadata *(This is called prior filtering the references)*\n * @param {string} [options.relativeBase] - The base location to use when resolving relative references *(Only useful\n * for APIs that do remote reference resolution. If this value is not defined,\n * {@link https://github.com/whitlockjc/path-loader|path-loader} will use `window.location.href` for the browser and\n * `process.cwd()` for Node.js.)*\n * @param {string|string[]} [options.subDocPath=[]] - The JSON Pointer or array of path segments to the sub document\n * location to search from\n */\n\n/**\n * Simple function used to filter out JSON References.\n *\n * @typedef {function} RefDetailsFilter\n *\n * @param {module:JsonRefs~UnresolvedRefDetails} refDetails - The JSON Reference details to test\n * @param {string[]} path - The path to the JSON Reference\n *\n * @returns {boolean} whether the JSON Reference should be filtered *(out)* or not\n */\n\n/**\n * Simple function used to pre-process a JSON Reference like object.\n *\n * @typedef {function} RefPreProcessor\n *\n * @param {object} obj - The JSON Reference like object\n * @param {string[]} path - The path to the JSON Reference like object\n *\n * @returns {object} the processed JSON Reference like object\n */\n\n/**\n * Simple function used to post-process a JSON Reference details.\n *\n * @typedef {function} RefPostProcessor\n *\n * @param {module:JsonRefs~UnresolvedRefDetails} refDetails - The JSON Reference details to test\n * @param {string[]} path - The path to the JSON Reference\n *\n * @returns {object} the processed JSON Reference details object\n */\n\n/**\n * Detailed information about resolved JSON References.\n *\n * @typedef {module:JsonRefs~UnresolvedRefDetails} ResolvedRefDetails\n *\n * @property {boolean} [circular] - Whether or not the JSON Reference is circular *(Will not be set if the JSON\n * Reference is not circular)*\n * @property {boolean} [missing] - Whether or not the referenced value was missing or not *(Will not be set if the\n * referenced value is not missing)*\n * @property {*} [value] - The referenced value *(Will not be set if the referenced value is missing)*\n */\n\n/**\n * The results of resolving the JSON References of an array/object.\n *\n * @typedef {object} ResolvedRefsResults\n *\n * @property {module:JsonRefs~ResolvedRefDetails} refs - An object whose keys are JSON Pointers *(fragment version)*\n * to where the JSON Reference is defined and whose values are {@link module:JsonRefs~ResolvedRefDetails}\n * @property {object} resolved - The array/object with its JSON References fully resolved\n */\n\n/**\n * An object containing the retrieved document and detailed information about its JSON References.\n *\n * @typedef {module:JsonRefs~ResolvedRefsResults} RetrievedRefsResults\n *\n * @property {object} value - The retrieved document\n */\n\n/**\n * An object containing the retrieved document, the document with its references resolved and detailed information\n * about its JSON References.\n *\n * @typedef {object} RetrievedResolvedRefsResults\n *\n * @property {module:JsonRefs~UnresolvedRefDetails} refs - An object whose keys are JSON Pointers *(fragment version)*\n * to where the JSON Reference is defined and whose values are {@link module:JsonRefs~UnresolvedRefDetails}\n * @property {ResolvedRefsResults} - An object whose keys are JSON Pointers *(fragment version)*\n * to where the JSON Reference is defined and whose values are {@link module:JsonRefs~ResolvedRefDetails}\n * @property {object} value - The retrieved document\n */\n\n/**\n * Detailed information about unresolved JSON References.\n *\n * @typedef {object} UnresolvedRefDetails\n *\n * @property {object} def - The JSON Reference definition\n * @property {string} [error] - The error information for invalid JSON Reference definition *(Only present when the\n * JSON Reference definition is invalid or there was a problem retrieving a remote reference during resolution)*\n * @property {string} uri - The URI portion of the JSON Reference\n * @property {object} uriDetails - Detailed information about the URI as provided by\n * {@link https://github.com/garycourt/uri-js|URI.parse}.\n * @property {string} type - The JSON Reference type *(This value can be one of the following: `invalid`, `local`,\n * `relative` or `remote`.)*\n * @property {string} [warning] - The warning information *(Only present when the JSON Reference definition produces a\n * warning)*\n */\n\n/**\n * Clears the internal cache of remote documents, reference details, etc.\n *\n * @alias module:JsonRefs.clearCache\n */\nfunction clearCache () {\n remoteCache = {};\n}\n\n/**\n * Takes an array of path segments and decodes the JSON Pointer tokens in them.\n *\n * @param {string[]} path - The array of path segments\n *\n * @returns {string} the array of path segments with their JSON Pointer tokens decoded\n *\n * @throws {Error} if the path is not an `Array`\n *\n * @see {@link https://tools.ietf.org/html/rfc6901#section-3}\n *\n * @alias module:JsonRefs.decodePath\n */\nfunction decodePath (path) {\n if (!isType(path, 'Array')) {\n throw new TypeError('path must be an array');\n }\n\n return path.map(function (seg) {\n if (!isType(seg, 'String')) {\n seg = JSON.stringify(seg);\n }\n\n return decodeURI(seg.replace(/~1/g, '/').replace(/~0/g, '~'));\n });\n}\n\n/**\n * Takes an array of path segments and encodes the special JSON Pointer characters in them.\n *\n * @param {string[]} path - The array of path segments\n *\n * @returns {string} the array of path segments with their JSON Pointer tokens encoded\n *\n * @throws {Error} if the path is not an `Array`\n *\n * @see {@link https://tools.ietf.org/html/rfc6901#section-3}\n *\n * @alias module:JsonRefs.encodePath\n */\nfunction encodePath (path) {\n if (!isType(path, 'Array')) {\n throw new TypeError('path must be an array');\n }\n\n return path.map(function (seg) {\n if (!isType(seg, 'String')) {\n seg = JSON.stringify(seg);\n }\n\n return seg.replace(/~/g, '~0').replace(/\\//g, '~1');\n });\n}\n\n/**\n * Finds JSON References defined within the provided array/object.\n *\n * @param {array|object} obj - The structure to find JSON References within\n * @param {module:JsonRefs~JsonRefsOptions} [options] - The JsonRefs options\n *\n * @returns {object} an object whose keys are JSON Pointers *(fragment version)* to where the JSON Reference is defined\n * and whose values are {@link module:JsonRefs~UnresolvedRefDetails}.\n *\n * @throws {Error} when the input arguments fail validation or if `options.subDocPath` points to an invalid location\n *\n * @alias module:JsonRefs.findRefs\n *\n * @example\n * // Finding all valid references\n * var allRefs = JsonRefs.findRefs(obj);\n * // Finding all remote references\n * var remoteRefs = JsonRefs.findRefs(obj, {filter: ['relative', 'remote']});\n * // Finding all invalid references\n * var invalidRefs = JsonRefs.findRefs(obj, {filter: 'invalid', includeInvalid: true});\n */\nfunction findRefs (obj, options) {\n var refs = {};\n\n // Validate the provided document\n if (!isType(obj, 'Array') && !isType(obj, 'Object')) {\n throw new TypeError('obj must be an Array or an Object');\n }\n\n // Validate options\n options = validateOptions(options, obj);\n\n // Walk the document (or sub document) and find all JSON References\n walk(findAncestors(obj, options.subDocPath),\n findValue(obj, options.subDocPath),\n clone(options.subDocPath),\n function (ancestors, node, path) {\n var processChildren = true;\n var refDetails;\n\n if (isRefLike(node)) {\n // Pre-process the node when necessary\n if (!isType(options.refPreProcessor, 'Undefined')) {\n node = options.refPreProcessor(clone(node), path);\n }\n\n refDetails = getRefDetails(node);\n\n // Post-process the reference details\n if (!isType(options.refPostProcessor, 'Undefined')) {\n refDetails = options.refPostProcessor(refDetails, path);\n }\n\n if (options.filter(refDetails, path)) {\n refs[pathToPtr(path)] = refDetails;\n }\n\n // Whenever a JSON Reference has extra children, its children should not be processed.\n // See: http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03#section-3\n if (getExtraRefKeys(node).length > 0) {\n processChildren = false;\n }\n }\n\n return processChildren;\n });\n\n return refs;\n}\n\n/**\n * Finds JSON References defined within the document at the provided location.\n *\n * This API is identical to {@link module:JsonRefs.findRefs} except this API will retrieve a remote document and then\n * return the result of {@link module:JsonRefs.findRefs} on the retrieved document.\n *\n * @param {string} location - The location to retrieve *(Can be relative or absolute, just make sure you look at the\n * {@link module:JsonRefs~JsonRefsOptions|options documentation} to see how relative references are handled.)*\n * @param {module:JsonRefs~JsonRefsOptions} [options] - The JsonRefs options\n *\n * @returns {Promise} a promise that resolves a {@link module:JsonRefs~RetrievedRefsResults} and rejects with an\n * `Error` when the input arguments fail validation, when `options.subDocPath` points to an invalid location or when\n * the location argument points to an unloadable resource\n *\n * @alias module:JsonRefs.findRefsAt\n *\n * @example\n * // Example that only resolves references within a sub document\n * JsonRefs.findRefsAt('http://petstore.swagger.io/v2/swagger.json', {\n * subDocPath: '#/definitions'\n * })\n * .then(function (res) {\n * // Do something with the response\n * //\n * // res.refs: JSON Reference locations and details\n * // res.value: The retrieved document\n * }, function (err) {\n * console.log(err.stack);\n * });\n */\nfunction findRefsAt (location, options) {\n var allTasks = Promise.resolve();\n\n allTasks = allTasks\n .then(function () {\n // Validate the provided location\n if (!isType(location, 'String')) {\n throw new TypeError('location must be a string');\n }\n\n // Validate options\n options = validateOptions(options);\n\n // Combine the location and the optional relative base\n location = combineURIs(options.relativeBase, location);\n\n return getRemoteDocument(location, options);\n })\n .then(function (res) {\n var cacheEntry = clone(remoteCache[location]);\n var cOptions = clone(options);\n var uriDetails = parseURI(location);\n\n if (isType(cacheEntry.refs, 'Undefined')) {\n // Do not filter any references so the cache is complete\n delete cOptions.filter;\n delete cOptions.subDocPath;\n\n cOptions.includeInvalid = true;\n\n remoteCache[location].refs = findRefs(res, cOptions);\n }\n\n // Add the filter options back\n if (!isType(options.filter, 'Undefined')) {\n cOptions.filter = options.filter;\n }\n\n if (!isType(uriDetails.fragment, 'Undefined')) {\n cOptions.subDocPath = pathFromPtr(decodeURI(uriDetails.fragment));\n } else if (!isType(uriDetails.subDocPath, 'Undefined')) {\n cOptions.subDocPath = options.subDocPath;\n }\n\n // This will use the cache so don't worry about calling it twice\n return {\n refs: findRefs(res, cOptions),\n value: res\n };\n });\n\n return allTasks;\n}\n\n/**\n * Returns detailed information about the JSON Reference.\n *\n * @param {object} obj - The JSON Reference definition\n *\n * @returns {module:JsonRefs~UnresolvedRefDetails} the detailed information\n *\n * @alias module:JsonRefs.getRefDetails\n */\nfunction getRefDetails (obj) {\n var details = {\n def: obj\n };\n var cacheKey;\n var extraKeys;\n var uriDetails;\n\n try {\n if (isRefLike(obj, true)) {\n cacheKey = obj.$ref;\n uriDetails = uriDetailsCache[cacheKey];\n\n if (isType(uriDetails, 'Undefined')) {\n uriDetails = uriDetailsCache[cacheKey] = parseURI(cacheKey);\n }\n\n details.uri = cacheKey;\n details.uriDetails = uriDetails;\n\n if (isType(uriDetails.error, 'Undefined')) {\n details.type = getRefType(details);\n } else {\n details.error = details.uriDetails.error;\n details.type = 'invalid';\n }\n\n // Identify warning\n extraKeys = getExtraRefKeys(obj);\n\n if (extraKeys.length > 0) {\n details.warning = 'Extra JSON Reference properties will be ignored: ' + extraKeys.join(', ');\n }\n } else {\n details.type = 'invalid';\n }\n } catch (err) {\n details.error = err.message;\n details.type = 'invalid';\n }\n\n return details;\n}\n\n/**\n * Returns whether the argument represents a JSON Pointer.\n *\n * A string is a JSON Pointer if the following are all true:\n *\n * * The string is of type `String`\n * * The string must be empty, `#` or start with a `/` or `#/`\n *\n * @param {string} ptr - The string to check\n * @param {boolean} [throwWithDetails=false] - Whether or not to throw an `Error` with the details as to why the value\n * provided is invalid\n *\n * @returns {boolean} the result of the check\n *\n * @throws {error} when the provided value is invalid and the `throwWithDetails` argument is `true`\n *\n * @alias module:JsonRefs.isPtr\n *\n * @see {@link https://tools.ietf.org/html/rfc6901#section-3}\n *\n * @example\n * // Separating the different ways to invoke isPtr for demonstration purposes\n * if (isPtr(str)) {\n * // Handle a valid JSON Pointer\n * } else {\n * // Get the reason as to why the value is not a JSON Pointer so you can fix/report it\n * try {\n * isPtr(str, true);\n * } catch (err) {\n * // The error message contains the details as to why the provided value is not a JSON Pointer\n * }\n * }\n */\nfunction isPtr (ptr, throwWithDetails) {\n var valid = true;\n var firstChar;\n\n try {\n if (isType(ptr, 'String')) {\n if (ptr !== '') {\n firstChar = ptr.charAt(0);\n\n if (['#', '/'].indexOf(firstChar) === -1) {\n throw new Error('ptr must start with a / or #/');\n } else if (firstChar === '#' && ptr !== '#' && ptr.charAt(1) !== '/') {\n throw new Error('ptr must start with a / or #/');\n } else if (ptr.match(badPtrTokenRegex)) {\n throw new Error('ptr has invalid token(s)');\n }\n }\n } else {\n throw new Error('ptr is not a String');\n }\n } catch (err) {\n if (throwWithDetails === true) {\n throw err;\n }\n\n valid = false;\n }\n\n return valid;\n}\n\n/**\n * Returns whether the argument represents a JSON Reference.\n *\n * An object is a JSON Reference only if the following are all true:\n *\n * * The object is of type `Object`\n * * The object has a `$ref` property\n * * The `$ref` property is a valid URI *(We do not require 100% strict URIs and will handle unescaped special\n * characters.)*\n *\n * @param {object} obj - The object to check\n * @param {boolean} [throwWithDetails=false] - Whether or not to throw an `Error` with the details as to why the value\n * provided is invalid\n *\n * @returns {boolean} the result of the check\n *\n * @throws {error} when the provided value is invalid and the `throwWithDetails` argument is `true`\n *\n * @alias module:JsonRefs.isRef\n *\n * @see {@link http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03#section-3}\n *\n * @example\n * // Separating the different ways to invoke isRef for demonstration purposes\n * if (isRef(obj)) {\n * // Handle a valid JSON Reference\n * } else {\n * // Get the reason as to why the value is not a JSON Reference so you can fix/report it\n * try {\n * isRef(str, true);\n * } catch (err) {\n * // The error message contains the details as to why the provided value is not a JSON Reference\n * }\n * }\n */\nfunction isRef (obj, throwWithDetails) {\n return isRefLike(obj, throwWithDetails) && getRefDetails(obj, throwWithDetails).type !== 'invalid';\n}\n\n/**\n * Returns an array of path segments for the provided JSON Pointer.\n *\n * @param {string} ptr - The JSON Pointer\n *\n * @returns {string[]} the path segments\n *\n * @throws {Error} if the provided `ptr` argument is not a JSON Pointer\n *\n * @alias module:JsonRefs.pathFromPtr\n */\nfunction pathFromPtr (ptr) {\n if (!isPtr(ptr)) {\n throw new Error('ptr must be a JSON Pointer');\n }\n\n var segments = ptr.split('/');\n\n // Remove the first segment\n segments.shift();\n\n return decodePath(segments);\n}\n\n/**\n * Returns a JSON Pointer for the provided array of path segments.\n *\n * **Note:** If a path segment in `path` is not a `String`, it will be converted to one using `JSON.stringify`.\n *\n * @param {string[]} path - The array of path segments\n * @param {boolean} [hashPrefix=true] - Whether or not create a hash-prefixed JSON Pointer\n *\n * @returns {string} the corresponding JSON Pointer\n *\n * @throws {Error} if the `path` argument is not an array\n *\n * @alias module:JsonRefs.pathToPtr\n */\nfunction pathToPtr (path, hashPrefix) {\n if (!isType(path, 'Array')) {\n throw new Error('path must be an Array');\n }\n\n // Encode each segment and return\n return (hashPrefix !== false ? '#' : '') + (path.length > 0 ? '/' : '') + encodePath(path).join('/');\n}\n\n/**\n * Finds JSON References defined within the provided array/object and resolves them.\n *\n * @param {array|object} obj - The structure to find JSON References within\n * @param {module:JsonRefs~JsonRefsOptions} [options] - The JsonRefs options\n *\n * @returns {Promise} a promise that resolves a {@link module:JsonRefs~ResolvedRefsResults} and rejects with an\n * `Error` when the input arguments fail validation, when `options.subDocPath` points to an invalid location or when\n * the location argument points to an unloadable resource\n *\n * @alias module:JsonRefs.resolveRefs\n *\n * @example\n * // Example that only resolves relative and remote references\n * JsonRefs.resolveRefs(swaggerObj, {\n * filter: ['relative', 'remote']\n * })\n * .then(function (res) {\n * // Do something with the response\n * //\n * // res.refs: JSON Reference locations and details\n * // res.resolved: The document with the appropriate JSON References resolved\n * }, function (err) {\n * console.log(err.stack);\n * });\n */\nfunction resolveRefs (obj, options) {\n var allTasks = Promise.resolve();\n\n allTasks = allTasks\n .then(function () {\n // Validate the provided document\n if (!isType(obj, 'Array') && !isType(obj, 'Object')) {\n throw new TypeError('obj must be an Array or an Object');\n }\n\n // Validate options\n options = validateOptions(options, obj);\n\n // Clone the input so we do not alter it\n obj = clone(obj);\n })\n .then(function () {\n return findRefsRecursive(obj, options, [], [], {\n documents: {},\n refs: {}\n });\n })\n .then(function (allRefs) {\n var deferredRefs = {};\n var refs = {};\n\n function pathSorter (p1, p2) {\n return pathFromPtr(p1).length - pathFromPtr(p2).length;\n }\n\n // Resolve all references with a known value\n Object.keys(allRefs.refs).sort(pathSorter).forEach(function (refPtr) {\n var refDetails = allRefs.refs[refPtr];\n\n // Record all direct references\n if (!refDetails.indirect) {\n refs[refPtr] = refDetails;\n }\n\n // Delete helper property\n delete refDetails.indirect;\n\n if (isType(refDetails.error, 'Undefined') && refDetails.type !== 'invalid') {\n if (isType(refDetails.value, 'Undefined') && refDetails.circular) {\n refDetails.value = refDetails.def;\n }\n\n // We defer processing all references without a value until later\n if (isType(refDetails.value, 'Undefined')) {\n deferredRefs[refPtr] = refDetails;\n } else {\n if (refPtr === '#') {\n obj = refDetails.value;\n } else {\n setValue(obj, pathFromPtr(refPtr), refDetails.value);\n }\n\n // Delete helper property\n delete refDetails.ancestorPtrs;\n }\n } else {\n // Delete helper property\n delete refDetails.ancestorPtrs;\n }\n });\n\n // Resolve all deferred references\n Object.keys(deferredRefs).forEach(function (refPtr) {\n var refDetails = deferredRefs[refPtr];\n\n // Attempt to resolve the value against all if its ancestors in order\n refDetails.ancestorPtrs.forEach(function (ancestorPtr, index) {\n if (isType(refDetails.value, 'Undefined')) {\n try {\n refDetails.value = findValue(allRefs.documents[ancestorPtr], pathFromPtr(refDetails.uri));\n\n // Delete helper property\n delete refDetails.ancestorPtrs;\n\n setValue(obj, pathFromPtr(refPtr), refDetails.value);\n } catch (err) {\n if (index === refDetails.ancestorPtrs.length - 1) {\n refDetails.error = err.message;\n refDetails.missing = true;\n\n // Delete helper property\n delete refDetails.ancestorPtrs;\n }\n }\n }\n });\n });\n\n return {\n refs: refs,\n resolved: obj\n };\n });\n\n return allTasks;\n}\n\n/**\n * Resolves JSON References defined within the document at the provided location.\n *\n * This API is identical to {@link module:JsonRefs.resolveRefs} except this API will retrieve a remote document and then\n * return the result of {@link module:JsonRefs.resolveRefs} on the retrieved document.\n *\n * @param {string} location - The location to retrieve *(Can be relative or absolute, just make sure you look at the\n * {@link module:JsonRefs~JsonRefsOptions|options documentation} to see how relative references are handled.)*\n * @param {module:JsonRefs~JsonRefsOptions} [options] - The JsonRefs options\n *\n * @returns {Promise} a promise that resolves a {@link module:JsonRefs~RetrievedResolvedRefsResults} and rejects with an\n * `Error` when the input arguments fail validation, when `options.subDocPath` points to an invalid location or when\n * the location argument points to an unloadable resource\n *\n * @alias module:JsonRefs.resolveRefsAt\n *\n * @example\n * // Example that loads a JSON document (No options.loaderOptions.processContent required) and resolves all references\n * JsonRefs.resolveRefsAt('./swagger.json')\n * .then(function (res) {\n * // Do something with the response\n * //\n * // res.refs: JSON Reference locations and details\n * // res.resolved: The document with the appropriate JSON References resolved\n * // res.value: The retrieved document\n * }, function (err) {\n * console.log(err.stack);\n * });\n */\nfunction resolveRefsAt (location, options) {\n var allTasks = Promise.resolve();\n\n allTasks = allTasks\n .then(function () {\n // Validate the provided location\n if (!isType(location, 'String')) {\n throw new TypeError('location must be a string');\n }\n\n // Validate options\n options = validateOptions(options);\n\n // Combine the location and the optional relative base\n location = combineURIs(options.relativeBase, location);\n\n return getRemoteDocument(location, options);\n })\n .then(function (res) {\n var cOptions = clone(options);\n var uriDetails = parseURI(location);\n\n // Set the sub document path if necessary\n if (!isType(uriDetails.fragment, 'Undefined')) {\n cOptions.subDocPath = pathFromPtr(decodeURI(uriDetails.fragment));\n }\n\n // Update the relative base based on the retrieved location\n cOptions.relativeBase = path.dirname(location);\n\n return resolveRefs(res, cOptions)\n .then(function (res2) {\n return {\n refs: res2.refs,\n resolved: res2.resolved,\n value: res\n };\n });\n });\n\n return allTasks;\n}\n\n/* Export the module members */\nmodule.exports.clearCache = clearCache;\nmodule.exports.decodePath = decodePath;\nmodule.exports.encodePath = encodePath;\nmodule.exports.findRefs = findRefs;\nmodule.exports.findRefsAt = findRefsAt;\nmodule.exports.getRefDetails = getRefDetails;\nmodule.exports.isPtr = isPtr;\nmodule.exports.isRef = isRef;\nmodule.exports.pathFromPtr = pathFromPtr;\nmodule.exports.pathToPtr = pathToPtr;\nmodule.exports.resolveRefs = resolveRefs;\nmodule.exports.resolveRefsAt = resolveRefsAt;\n\n\n\n// WEBPACK FOOTER //\n// index.js","\n/**\n * Expose `Emitter`.\n */\n\nmodule.exports = Emitter;\n\n/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nfunction Emitter(obj) {\n if (obj) return mixin(obj);\n};\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n for (var key in Emitter.prototype) {\n obj[key] = Emitter.prototype[key];\n }\n return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n .push(fn);\n return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n function on() {\n this.off(event, on);\n fn.apply(this, arguments);\n }\n\n on.fn = fn;\n this.on(event, on);\n return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n\n // all\n if (0 == arguments.length) {\n this._callbacks = {};\n return this;\n }\n\n // specific event\n var callbacks = this._callbacks['$' + event];\n if (!callbacks) return this;\n\n // remove all handlers\n if (1 == arguments.length) {\n delete this._callbacks['$' + event];\n return this;\n }\n\n // remove specific handler\n var cb;\n for (var i = 0; i < callbacks.length; i++) {\n cb = callbacks[i];\n if (cb === fn || cb.fn === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n this._callbacks = this._callbacks || {};\n var args = [].slice.call(arguments, 1)\n , callbacks = this._callbacks['$' + event];\n\n if (callbacks) {\n callbacks = callbacks.slice(0);\n for (var i = 0, len = callbacks.length; i < len; ++i) {\n callbacks[i].apply(this, args);\n }\n }\n\n return this;\n};\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n this._callbacks = this._callbacks || {};\n return this._callbacks['$' + event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n return !! this.listeners(event).length;\n};\n\n\n\n// WEBPACK FOOTER //\n// node_modules/component-emitter/index.js","/*! Native Promise Only\n v0.8.1 (c) Kyle Simpson\n MIT License: http://getify.mit-license.org\n*/\n\n(function UMD(name,context,definition){\n\t// special form of UMD for polyfilling across evironments\n\tcontext[name] = context[name] || definition();\n\tif (typeof module != \"undefined\" && module.exports) { module.exports = context[name]; }\n\telse if (typeof define == \"function\" && define.amd) { define(function $AMD$(){ return context[name]; }); }\n})(\"Promise\",typeof global != \"undefined\" ? global : this,function DEF(){\n\t/*jshint validthis:true */\n\t\"use strict\";\n\n\tvar builtInProp, cycle, scheduling_queue,\n\t\tToString = Object.prototype.toString,\n\t\ttimer = (typeof setImmediate != \"undefined\") ?\n\t\t\tfunction timer(fn) { return setImmediate(fn); } :\n\t\t\tsetTimeout\n\t;\n\n\t// dammit, IE8.\n\ttry {\n\t\tObject.defineProperty({},\"x\",{});\n\t\tbuiltInProp = function builtInProp(obj,name,val,config) {\n\t\t\treturn Object.defineProperty(obj,name,{\n\t\t\t\tvalue: val,\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: config !== false\n\t\t\t});\n\t\t};\n\t}\n\tcatch (err) {\n\t\tbuiltInProp = function builtInProp(obj,name,val) {\n\t\t\tobj[name] = val;\n\t\t\treturn obj;\n\t\t};\n\t}\n\n\t// Note: using a queue instead of array for efficiency\n\tscheduling_queue = (function Queue() {\n\t\tvar first, last, item;\n\n\t\tfunction Item(fn,self) {\n\t\t\tthis.fn = fn;\n\t\t\tthis.self = self;\n\t\t\tthis.next = void 0;\n\t\t}\n\n\t\treturn {\n\t\t\tadd: function add(fn,self) {\n\t\t\t\titem = new Item(fn,self);\n\t\t\t\tif (last) {\n\t\t\t\t\tlast.next = item;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfirst = item;\n\t\t\t\t}\n\t\t\t\tlast = item;\n\t\t\t\titem = void 0;\n\t\t\t},\n\t\t\tdrain: function drain() {\n\t\t\t\tvar f = first;\n\t\t\t\tfirst = last = cycle = void 0;\n\n\t\t\t\twhile (f) {\n\t\t\t\t\tf.fn.call(f.self);\n\t\t\t\t\tf = f.next;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t})();\n\n\tfunction schedule(fn,self) {\n\t\tscheduling_queue.add(fn,self);\n\t\tif (!cycle) {\n\t\t\tcycle = timer(scheduling_queue.drain);\n\t\t}\n\t}\n\n\t// promise duck typing\n\tfunction isThenable(o) {\n\t\tvar _then, o_type = typeof o;\n\n\t\tif (o != null &&\n\t\t\t(\n\t\t\t\to_type == \"object\" || o_type == \"function\"\n\t\t\t)\n\t\t) {\n\t\t\t_then = o.then;\n\t\t}\n\t\treturn typeof _then == \"function\" ? _then : false;\n\t}\n\n\tfunction notify() {\n\t\tfor (var i=0; i 0) {\n\t\t\t\t\tschedule(notify,self);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (err) {\n\t\t\treject.call(new MakeDefWrapper(self),err);\n\t\t}\n\t}\n\n\tfunction reject(msg) {\n\t\tvar self = this;\n\n\t\t// already triggered?\n\t\tif (self.triggered) { return; }\n\n\t\tself.triggered = true;\n\n\t\t// unwrap\n\t\tif (self.def) {\n\t\t\tself = self.def;\n\t\t}\n\n\t\tself.msg = msg;\n\t\tself.state = 2;\n\t\tif (self.chain.length > 0) {\n\t\t\tschedule(notify,self);\n\t\t}\n\t}\n\n\tfunction iteratePromises(Constructor,arr,resolver,rejecter) {\n\t\tfor (var idx=0; idx 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n var result = splitPath(path),\n root = result[0],\n dir = result[1];\n\n if (!root && !dir) {\n // No dirname whatsoever\n return '.';\n }\n\n if (dir) {\n // It has a dirname, strip trailing slash\n dir = dir.substr(0, dir.length - 1);\n }\n\n return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n var f = splitPath(path)[2];\n // TODO: make this comparison case-insensitive on windows?\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\n\nexports.extname = function(path) {\n return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n\n\n\n// WEBPACK FOOTER //\n// node_modules/path-browserify/index.js","/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 Jeremy Whitlock\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n'use strict';\n\n/**\n * Utility that provides a single API for loading the content of a path/URL.\n *\n * @module PathLoader\n */\n\nvar supportedLoaders = {\n file: require('./lib/loaders/file'),\n http: require('./lib/loaders/http'),\n https: require('./lib/loaders/http')\n};\nvar defaultLoader = typeof window === 'object' || typeof importScripts === 'function' ?\n supportedLoaders.http :\n supportedLoaders.file;\n\n// Load promises polyfill if necessary\n/* istanbul ignore if */\nif (typeof Promise === 'undefined') {\n require('native-promise-only');\n}\n\nfunction getScheme (location) {\n if (typeof location !== 'undefined') {\n location = location.indexOf('://') === -1 ? '' : location.split('://')[0];\n }\n\n return location;\n}\n\n/**\n * Callback used to provide access to altering a remote request prior to the request being made.\n *\n * @typedef {function} PrepareRequestCallback\n *\n * @param {object} req - The Superagent request object\n * @param {string} location - The location being retrieved\n * @param {function} callback - First callback\n *\n * @alias module:PathLoader~PrepareRequestCallback\n */\n\n /**\n * Callback used to provide access to processing the raw response of the request being made. *(HTTP loader only)*\n *\n * @typedef {function} ProcessResponseCallback\n *\n * @param {object} res - The Superagent response object *(For non-HTTP loaders, this object will be like the Superagent\n * object in that it will have a `text` property whose value is the raw string value being processed. This was done\n * for consistency.)*\n * @param {function} callback - Error-first callback\n *\n * @returns {*} the result of processing the responsexs\n *\n * @alias module:PathLoader~ProcessResponseCallback\n */\n\nfunction getLoader (location) {\n var scheme = getScheme(location);\n var loader = supportedLoaders[scheme];\n\n if (typeof loader === 'undefined') {\n if (scheme === '') {\n loader = defaultLoader;\n } else {\n throw new Error('Unsupported scheme: ' + scheme);\n }\n }\n\n return loader;\n}\n\n/**\n * Loads a document at the provided location and returns a JavaScript object representation.\n *\n * @param {object} location - The location to the document\n * @param {object} [options] - The options\n * @param {string} [options.encoding='utf-8'] - The encoding to use when loading the file *(File loader only)*\n * @param {string} [options.method=get] - The HTTP method to use for the request *(HTTP loader only)*\n * @param {module:PathLoader~PrepareRequestCallback} [options.prepareRequest] - The callback used to prepare the request\n * *(HTTP loader only)*\n * @param {module:PathLoader~ProcessResponseCallback} [options.processContent] - The callback used to process the\n * response\n *\n * @returns {Promise} Always returns a promise even if there is a callback provided\n *\n * @example\n * // Example using Promises\n *\n * PathLoader\n * .load('./package.json')\n * .then(JSON.parse)\n * .then(function (document) {\n * console.log(document.name + ' (' + document.version + '): ' + document.description);\n * }, function (err) {\n * console.error(err.stack);\n * });\n *\n * @example\n * // Example using options.prepareRequest to provide authentication details for a remotely secure URL\n *\n * PathLoader\n * .load('https://api.github.com/repos/whitlockjc/path-loader', {\n * prepareRequest: function (req, callback) {\n * req.auth('my-username', 'my-password');\n * callback(undefined, req);\n * }\n * })\n * .then(JSON.parse)\n * .then(function (document) {\n * console.log(document.full_name + ': ' + document.description);\n * }, function (err) {\n * console.error(err.stack);\n * });\n *\n * @example\n * // Example loading a YAML file\n *\n * PathLoader\n * .load('/Users/not-you/projects/path-loader/.travis.yml')\n * .then(YAML.safeLoad)\n * .then(function (document) {\n * console.log('path-loader uses the', document.language, 'language.');\n * }, function (err) {\n * console.error(err.stack);\n * });\n *\n * @example\n * // Example loading a YAML file with options.processContent (Useful if you need information in the raw response)\n *\n * PathLoader\n * .load('/Users/not-you/projects/path-loader/.travis.yml', {\n * processContent: function (res, callback) {\n * callback(YAML.safeLoad(res.text));\n * }\n * })\n * .then(function (document) {\n * console.log('path-loader uses the', document.language, 'language.');\n * }, function (err) {\n * console.error(err.stack);\n * });\n */\nmodule.exports.load = function (location, options) {\n var allTasks = Promise.resolve();\n\n // Default options to empty object\n if (typeof options === 'undefined') {\n options = {};\n }\n\n // Validate arguments\n allTasks = allTasks.then(function () {\n if (typeof location === 'undefined') {\n throw new TypeError('location is required');\n } else if (typeof location !== 'string') {\n throw new TypeError('location must be a string');\n }\n\n if (typeof options !== 'undefined') {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n } else if (typeof options.processContent !== 'undefined' && typeof options.processContent !== 'function') {\n throw new TypeError('options.processContent must be a function');\n }\n }\n });\n\n // Load the document from the provided location and process it\n allTasks = allTasks\n .then(function () {\n return new Promise(function (resolve, reject) {\n var loader = getLoader(location);\n\n loader.load(location, options || {}, function (err, document) {\n if (err) {\n reject(err);\n } else {\n resolve(document);\n }\n });\n });\n })\n .then(function (res) {\n if (options.processContent) {\n return new Promise(function (resolve, reject) {\n // For consistency between file and http, always send an object with a 'text' property containing the raw\n // string value being processed.\n options.processContent(typeof res === 'object' ? res : {text: res}, function (err, processed) {\n if (err) {\n reject(err);\n } else {\n resolve(processed);\n }\n });\n });\n } else {\n // If there was no content processor, we will assume that for all objects that it is a Superagent response\n // and will return its `text` property value. Otherwise, we will return the raw response.\n return typeof res === 'object' ? res.text : res;\n }\n });\n\n return allTasks;\n};\n\n\n\n// WEBPACK FOOTER //\n// node_modules/path-loader/index.js","/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 Jeremy Whitlock\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n'use strict';\n\nvar unsupportedError = new TypeError('The \\'file\\' scheme is not supported in the browser');\n\n/**\n * The file loader is not supported in the browser.\n *\n * @throws {error} the file loader is not supported in the browser\n */\nmodule.exports.getBase = function () {\n throw unsupportedError;\n};\n\n/**\n * The file loader is not supported in the browser.\n */\nmodule.exports.load = function () {\n var fn = arguments[arguments.length - 1];\n\n if (typeof fn === 'function') {\n fn(unsupportedError);\n } else {\n throw unsupportedError;\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// node_modules/path-loader/lib/loaders/file-browser.js","/* eslint-env node, browser */\n\n/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 Jeremy Whitlock\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n'use strict';\n\nvar request = require('superagent');\n\nvar supportedHttpMethods = ['delete', 'get', 'head', 'patch', 'post', 'put'];\n\n/**\n * Loads a file from an http or https URL.\n *\n * @param {string} location - The document URL (If relative, location is relative to window.location.origin).\n * @param {object} options - The loader options\n * @param {string} [options.method=get] - The HTTP method to use for the request\n * @param {module:PathLoader~PrepareRequestCallback} [options.prepareRequest] - The callback used to prepare a request\n * @param {module:PathLoader~ProcessResponseCallback} [options.processContent] - The callback used to process the\n * response\n * @param {function} callback - The error-first callback\n */\nmodule.exports.load = function (location, options, callback) {\n var realMethod = options.method ? options.method.toLowerCase() : 'get';\n var err;\n var realRequest;\n\n function makeRequest (err, req) {\n if (err) {\n callback(err);\n } else {\n // buffer() is only available in Node.js\n if (typeof req.buffer === 'function') {\n req.buffer(true);\n }\n\n req\n .end(function (err2, res) {\n if (err2) {\n callback(err2);\n } else {\n callback(undefined, res);\n }\n });\n }\n }\n\n if (typeof options.method !== 'undefined') {\n if (typeof options.method !== 'string') {\n err = new TypeError('options.method must be a string');\n } else if (supportedHttpMethods.indexOf(options.method) === -1) {\n err = new TypeError('options.method must be one of the following: ' +\n supportedHttpMethods.slice(0, supportedHttpMethods.length - 1).join(', ') + ' or ' +\n supportedHttpMethods[supportedHttpMethods.length - 1]);\n }\n } else if (typeof options.prepareRequest !== 'undefined' && typeof options.prepareRequest !== 'function') {\n err = new TypeError('options.prepareRequest must be a function');\n }\n\n if (!err) {\n realRequest = request[realMethod === 'delete' ? 'del' : realMethod](location);\n\n if (options.prepareRequest) {\n try {\n options.prepareRequest(realRequest, makeRequest);\n } catch (err2) {\n callback(err2);\n }\n } else {\n makeRequest(undefined, realRequest);\n }\n } else {\n callback(err);\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// node_modules/path-loader/lib/loaders/http.js","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n// WEBPACK FOOTER //\n// node_modules/process/browser.js","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n sep = sep || '&';\n eq = eq || '=';\n var obj = {};\n\n if (typeof qs !== 'string' || qs.length === 0) {\n return obj;\n }\n\n var regexp = /\\+/g;\n qs = qs.split(sep);\n\n var maxKeys = 1000;\n if (options && typeof options.maxKeys === 'number') {\n maxKeys = options.maxKeys;\n }\n\n var len = qs.length;\n // maxKeys <= 0 means that we should not limit keys count\n if (maxKeys > 0 && len > maxKeys) {\n len = maxKeys;\n }\n\n for (var i = 0; i < len; ++i) {\n var x = qs[i].replace(regexp, '%20'),\n idx = x.indexOf(eq),\n kstr, vstr, k, v;\n\n if (idx >= 0) {\n kstr = x.substr(0, idx);\n vstr = x.substr(idx + 1);\n } else {\n kstr = x;\n vstr = '';\n }\n\n k = decodeURIComponent(kstr);\n v = decodeURIComponent(vstr);\n\n if (!hasOwnProperty(obj, k)) {\n obj[k] = v;\n } else if (isArray(obj[k])) {\n obj[k].push(v);\n } else {\n obj[k] = [obj[k], v];\n }\n }\n\n return obj;\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\n\n\n// WEBPACK FOOTER //\n// node_modules/querystring-es3/decode.js","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar stringifyPrimitive = function(v) {\n switch (typeof v) {\n case 'string':\n return v;\n\n case 'boolean':\n return v ? 'true' : 'false';\n\n case 'number':\n return isFinite(v) ? v : '';\n\n default:\n return '';\n }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n if (obj === null) {\n obj = undefined;\n }\n\n if (typeof obj === 'object') {\n return map(objectKeys(obj), function(k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n if (isArray(obj[k])) {\n return map(obj[k], function(v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).join(sep);\n\n }\n\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq +\n encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nfunction map (xs, f) {\n if (xs.map) return xs.map(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n res.push(f(xs[i], i));\n }\n return res;\n}\n\nvar objectKeys = Object.keys || function (obj) {\n var res = [];\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\n }\n return res;\n};\n\n\n\n// WEBPACK FOOTER //\n// node_modules/querystring-es3/encode.js","'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n\n\n\n// WEBPACK FOOTER //\n// node_modules/querystring-es3/index.js","\n/**\n * Reduce `arr` with `fn`.\n *\n * @param {Array} arr\n * @param {Function} fn\n * @param {Mixed} initial\n *\n * TODO: combatible error handling?\n */\n\nmodule.exports = function(arr, fn, initial){ \n var idx = 0;\n var len = arr.length;\n var curr = arguments.length == 3\n ? initial\n : arr[idx++];\n\n while (idx < len) {\n curr = fn.call(null, curr, arr[idx], ++idx, arr);\n }\n \n return curr;\n};\n\n\n// WEBPACK FOOTER //\n// node_modules/reduce-component/index.js","'use strict';\nmodule.exports = function (str) {\n\tvar isExtendedLengthPath = /^\\\\\\\\\\?\\\\/.test(str);\n\tvar hasNonAscii = /[^\\x00-\\x80]+/.test(str);\n\n\tif (isExtendedLengthPath || hasNonAscii) {\n\t\treturn str;\n\t}\n\n\treturn str.replace(/\\\\/g, '/');\n};\n\n\n\n// WEBPACK FOOTER //\n// node_modules/slash/index.js","/**\n * Module dependencies.\n */\n\nvar Emitter = require('emitter');\nvar reduce = require('reduce');\nvar requestBase = require('./request-base');\nvar isObject = require('./is-object');\n\n/**\n * Root reference for iframes.\n */\n\nvar root;\nif (typeof window !== 'undefined') { // Browser window\n root = window;\n} else if (typeof self !== 'undefined') { // Web Worker\n root = self;\n} else { // Other environments\n root = this;\n}\n\n/**\n * Noop.\n */\n\nfunction noop(){};\n\n/**\n * Check if `obj` is a host object,\n * we don't want to serialize these :)\n *\n * TODO: future proof, move to compoent land\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isHost(obj) {\n var str = {}.toString.call(obj);\n\n switch (str) {\n case '[object File]':\n case '[object Blob]':\n case '[object FormData]':\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Expose `request`.\n */\n\nvar request = module.exports = require('./request').bind(null, Request);\n\n/**\n * Determine XHR.\n */\n\nrequest.getXHR = function () {\n if (root.XMLHttpRequest\n && (!root.location || 'file:' != root.location.protocol\n || !root.ActiveXObject)) {\n return new XMLHttpRequest;\n } else {\n try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {}\n try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {}\n try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {}\n try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {}\n }\n return false;\n};\n\n/**\n * Removes leading and trailing whitespace, added to support IE.\n *\n * @param {String} s\n * @return {String}\n * @api private\n */\n\nvar trim = ''.trim\n ? function(s) { return s.trim(); }\n : function(s) { return s.replace(/(^\\s*|\\s*$)/g, ''); };\n\n/**\n * Serialize the given `obj`.\n *\n * @param {Object} obj\n * @return {String}\n * @api private\n */\n\nfunction serialize(obj) {\n if (!isObject(obj)) return obj;\n var pairs = [];\n for (var key in obj) {\n if (null != obj[key]) {\n pushEncodedKeyValuePair(pairs, key, obj[key]);\n }\n }\n return pairs.join('&');\n}\n\n/**\n * Helps 'serialize' with serializing arrays.\n * Mutates the pairs array.\n *\n * @param {Array} pairs\n * @param {String} key\n * @param {Mixed} val\n */\n\nfunction pushEncodedKeyValuePair(pairs, key, val) {\n if (Array.isArray(val)) {\n return val.forEach(function(v) {\n pushEncodedKeyValuePair(pairs, key, v);\n });\n }\n pairs.push(encodeURIComponent(key)\n + '=' + encodeURIComponent(val));\n}\n\n/**\n * Expose serialization method.\n */\n\n request.serializeObject = serialize;\n\n /**\n * Parse the given x-www-form-urlencoded `str`.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction parseString(str) {\n var obj = {};\n var pairs = str.split('&');\n var parts;\n var pair;\n\n for (var i = 0, len = pairs.length; i < len; ++i) {\n pair = pairs[i];\n parts = pair.split('=');\n obj[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);\n }\n\n return obj;\n}\n\n/**\n * Expose parser.\n */\n\nrequest.parseString = parseString;\n\n/**\n * Default MIME type map.\n *\n * superagent.types.xml = 'application/xml';\n *\n */\n\nrequest.types = {\n html: 'text/html',\n json: 'application/json',\n xml: 'application/xml',\n urlencoded: 'application/x-www-form-urlencoded',\n 'form': 'application/x-www-form-urlencoded',\n 'form-data': 'application/x-www-form-urlencoded'\n};\n\n/**\n * Default serialization map.\n *\n * superagent.serialize['application/xml'] = function(obj){\n * return 'generated xml here';\n * };\n *\n */\n\n request.serialize = {\n 'application/x-www-form-urlencoded': serialize,\n 'application/json': JSON.stringify\n };\n\n /**\n * Default parsers.\n *\n * superagent.parse['application/xml'] = function(str){\n * return { object parsed from str };\n * };\n *\n */\n\nrequest.parse = {\n 'application/x-www-form-urlencoded': parseString,\n 'application/json': JSON.parse\n};\n\n/**\n * Parse the given header `str` into\n * an object containing the mapped fields.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction parseHeader(str) {\n var lines = str.split(/\\r?\\n/);\n var fields = {};\n var index;\n var line;\n var field;\n var val;\n\n lines.pop(); // trailing CRLF\n\n for (var i = 0, len = lines.length; i < len; ++i) {\n line = lines[i];\n index = line.indexOf(':');\n field = line.slice(0, index).toLowerCase();\n val = trim(line.slice(index + 1));\n fields[field] = val;\n }\n\n return fields;\n}\n\n/**\n * Check if `mime` is json or has +json structured syntax suffix.\n *\n * @param {String} mime\n * @return {Boolean}\n * @api private\n */\n\nfunction isJSON(mime) {\n return /[\\/+]json\\b/.test(mime);\n}\n\n/**\n * Return the mime type for the given `str`.\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\n\nfunction type(str){\n return str.split(/ *; */).shift();\n};\n\n/**\n * Return header field parameters.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction params(str){\n return reduce(str.split(/ *; */), function(obj, str){\n var parts = str.split(/ *= */)\n , key = parts.shift()\n , val = parts.shift();\n\n if (key && val) obj[key] = val;\n return obj;\n }, {});\n};\n\n/**\n * Initialize a new `Response` with the given `xhr`.\n *\n * - set flags (.ok, .error, etc)\n * - parse header\n *\n * Examples:\n *\n * Aliasing `superagent` as `request` is nice:\n *\n * request = superagent;\n *\n * We can use the promise-like API, or pass callbacks:\n *\n * request.get('/').end(function(res){});\n * request.get('/', function(res){});\n *\n * Sending data can be chained:\n *\n * request\n * .post('/user')\n * .send({ name: 'tj' })\n * .end(function(res){});\n *\n * Or passed to `.send()`:\n *\n * request\n * .post('/user')\n * .send({ name: 'tj' }, function(res){});\n *\n * Or passed to `.post()`:\n *\n * request\n * .post('/user', { name: 'tj' })\n * .end(function(res){});\n *\n * Or further reduced to a single call for simple cases:\n *\n * request\n * .post('/user', { name: 'tj' }, function(res){});\n *\n * @param {XMLHTTPRequest} xhr\n * @param {Object} options\n * @api private\n */\n\nfunction Response(req, options) {\n options = options || {};\n this.req = req;\n this.xhr = this.req.xhr;\n // responseText is accessible only if responseType is '' or 'text' and on older browsers\n this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined')\n ? this.xhr.responseText\n : null;\n this.statusText = this.req.xhr.statusText;\n this.setStatusProperties(this.xhr.status);\n this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders());\n // getAllResponseHeaders sometimes falsely returns \"\" for CORS requests, but\n // getResponseHeader still works. so we get content-type even if getting\n // other headers fails.\n this.header['content-type'] = this.xhr.getResponseHeader('content-type');\n this.setHeaderProperties(this.header);\n this.body = this.req.method != 'HEAD'\n ? this.parseBody(this.text ? this.text : this.xhr.response)\n : null;\n}\n\n/**\n * Get case-insensitive `field` value.\n *\n * @param {String} field\n * @return {String}\n * @api public\n */\n\nResponse.prototype.get = function(field){\n return this.header[field.toLowerCase()];\n};\n\n/**\n * Set header related properties:\n *\n * - `.type` the content type without params\n *\n * A response of \"Content-Type: text/plain; charset=utf-8\"\n * will provide you with a `.type` of \"text/plain\".\n *\n * @param {Object} header\n * @api private\n */\n\nResponse.prototype.setHeaderProperties = function(header){\n // content-type\n var ct = this.header['content-type'] || '';\n this.type = type(ct);\n\n // params\n var obj = params(ct);\n for (var key in obj) this[key] = obj[key];\n};\n\n/**\n * Parse the given body `str`.\n *\n * Used for auto-parsing of bodies. Parsers\n * are defined on the `superagent.parse` object.\n *\n * @param {String} str\n * @return {Mixed}\n * @api private\n */\n\nResponse.prototype.parseBody = function(str){\n var parse = request.parse[this.type];\n if (!parse && isJSON(this.type)) {\n parse = request.parse['application/json'];\n }\n return parse && str && (str.length || str instanceof Object)\n ? parse(str)\n : null;\n};\n\n/**\n * Set flags such as `.ok` based on `status`.\n *\n * For example a 2xx response will give you a `.ok` of __true__\n * whereas 5xx will be __false__ and `.error` will be __true__. The\n * `.clientError` and `.serverError` are also available to be more\n * specific, and `.statusType` is the class of error ranging from 1..5\n * sometimes useful for mapping respond colors etc.\n *\n * \"sugar\" properties are also defined for common cases. Currently providing:\n *\n * - .noContent\n * - .badRequest\n * - .unauthorized\n * - .notAcceptable\n * - .notFound\n *\n * @param {Number} status\n * @api private\n */\n\nResponse.prototype.setStatusProperties = function(status){\n // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n if (status === 1223) {\n status = 204;\n }\n\n var type = status / 100 | 0;\n\n // status / class\n this.status = this.statusCode = status;\n this.statusType = type;\n\n // basics\n this.info = 1 == type;\n this.ok = 2 == type;\n this.clientError = 4 == type;\n this.serverError = 5 == type;\n this.error = (4 == type || 5 == type)\n ? this.toError()\n : false;\n\n // sugar\n this.accepted = 202 == status;\n this.noContent = 204 == status;\n this.badRequest = 400 == status;\n this.unauthorized = 401 == status;\n this.notAcceptable = 406 == status;\n this.notFound = 404 == status;\n this.forbidden = 403 == status;\n};\n\n/**\n * Return an `Error` representative of this response.\n *\n * @return {Error}\n * @api public\n */\n\nResponse.prototype.toError = function(){\n var req = this.req;\n var method = req.method;\n var url = req.url;\n\n var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')';\n var err = new Error(msg);\n err.status = this.status;\n err.method = method;\n err.url = url;\n\n return err;\n};\n\n/**\n * Expose `Response`.\n */\n\nrequest.Response = Response;\n\n/**\n * Initialize a new `Request` with the given `method` and `url`.\n *\n * @param {String} method\n * @param {String} url\n * @api public\n */\n\nfunction Request(method, url) {\n var self = this;\n this._query = this._query || [];\n this.method = method;\n this.url = url;\n this.header = {}; // preserves header name case\n this._header = {}; // coerces header names to lowercase\n this.on('end', function(){\n var err = null;\n var res = null;\n\n try {\n res = new Response(self);\n } catch(e) {\n err = new Error('Parser is unable to parse the response');\n err.parse = true;\n err.original = e;\n // issue #675: return the raw response if the response parsing fails\n err.rawResponse = self.xhr && self.xhr.responseText ? self.xhr.responseText : null;\n // issue #876: return the http status code if the response parsing fails\n err.statusCode = self.xhr && self.xhr.status ? self.xhr.status : null;\n return self.callback(err);\n }\n\n self.emit('response', res);\n\n if (err) {\n return self.callback(err, res);\n }\n\n if (res.status >= 200 && res.status < 300) {\n return self.callback(err, res);\n }\n\n var new_err = new Error(res.statusText || 'Unsuccessful HTTP response');\n new_err.original = err;\n new_err.response = res;\n new_err.status = res.status;\n\n self.callback(new_err, res);\n });\n}\n\n/**\n * Mixin `Emitter` and `requestBase`.\n */\n\nEmitter(Request.prototype);\nfor (var key in requestBase) {\n Request.prototype[key] = requestBase[key];\n}\n\n/**\n * Abort the request, and clear potential timeout.\n *\n * @return {Request}\n * @api public\n */\n\nRequest.prototype.abort = function(){\n if (this.aborted) return;\n this.aborted = true;\n this.xhr.abort();\n this.clearTimeout();\n this.emit('abort');\n return this;\n};\n\n/**\n * Set Content-Type to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n * superagent.types.xml = 'application/xml';\n *\n * request.post('/')\n * .type('xml')\n * .send(xmlstring)\n * .end(callback);\n *\n * request.post('/')\n * .type('application/xml')\n * .send(xmlstring)\n * .end(callback);\n *\n * @param {String} type\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.type = function(type){\n this.set('Content-Type', request.types[type] || type);\n return this;\n};\n\n/**\n * Set responseType to `val`. Presently valid responseTypes are 'blob' and \n * 'arraybuffer'.\n *\n * Examples:\n *\n * req.get('/')\n * .responseType('blob')\n * .end(callback);\n *\n * @param {String} val\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.responseType = function(val){\n this._responseType = val;\n return this;\n};\n\n/**\n * Set Accept to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n * superagent.types.json = 'application/json';\n *\n * request.get('/agent')\n * .accept('json')\n * .end(callback);\n *\n * request.get('/agent')\n * .accept('application/json')\n * .end(callback);\n *\n * @param {String} accept\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.accept = function(type){\n this.set('Accept', request.types[type] || type);\n return this;\n};\n\n/**\n * Set Authorization field value with `user` and `pass`.\n *\n * @param {String} user\n * @param {String} pass\n * @param {Object} options with 'type' property 'auto' or 'basic' (default 'basic')\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.auth = function(user, pass, options){\n if (!options) {\n options = {\n type: 'basic'\n }\n }\n\n switch (options.type) {\n case 'basic':\n var str = btoa(user + ':' + pass);\n this.set('Authorization', 'Basic ' + str);\n break;\n\n case 'auto':\n this.username = user;\n this.password = pass;\n break;\n }\n return this;\n};\n\n/**\n* Add query-string `val`.\n*\n* Examples:\n*\n* request.get('/shoes')\n* .query('size=10')\n* .query({ color: 'blue' })\n*\n* @param {Object|String} val\n* @return {Request} for chaining\n* @api public\n*/\n\nRequest.prototype.query = function(val){\n if ('string' != typeof val) val = serialize(val);\n if (val) this._query.push(val);\n return this;\n};\n\n/**\n * Queue the given `file` as an attachment to the specified `field`,\n * with optional `filename`.\n *\n * ``` js\n * request.post('/upload')\n * .attach(new Blob(['hey!'], { type: \"text/html\"}))\n * .end(callback);\n * ```\n *\n * @param {String} field\n * @param {Blob|File} file\n * @param {String} filename\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.attach = function(field, file, filename){\n this._getFormData().append(field, file, filename || file.name);\n return this;\n};\n\nRequest.prototype._getFormData = function(){\n if (!this._formData) {\n this._formData = new root.FormData();\n }\n return this._formData;\n};\n\n/**\n * Send `data` as the request body, defaulting the `.type()` to \"json\" when\n * an object is given.\n *\n * Examples:\n *\n * // manual json\n * request.post('/user')\n * .type('json')\n * .send('{\"name\":\"tj\"}')\n * .end(callback)\n *\n * // auto json\n * request.post('/user')\n * .send({ name: 'tj' })\n * .end(callback)\n *\n * // manual x-www-form-urlencoded\n * request.post('/user')\n * .type('form')\n * .send('name=tj')\n * .end(callback)\n *\n * // auto x-www-form-urlencoded\n * request.post('/user')\n * .type('form')\n * .send({ name: 'tj' })\n * .end(callback)\n *\n * // defaults to x-www-form-urlencoded\n * request.post('/user')\n * .send('name=tobi')\n * .send('species=ferret')\n * .end(callback)\n *\n * @param {String|Object} data\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.send = function(data){\n var obj = isObject(data);\n var type = this._header['content-type'];\n\n // merge\n if (obj && isObject(this._data)) {\n for (var key in data) {\n this._data[key] = data[key];\n }\n } else if ('string' == typeof data) {\n if (!type) this.type('form');\n type = this._header['content-type'];\n if ('application/x-www-form-urlencoded' == type) {\n this._data = this._data\n ? this._data + '&' + data\n : data;\n } else {\n this._data = (this._data || '') + data;\n }\n } else {\n this._data = data;\n }\n\n if (!obj || isHost(data)) return this;\n if (!type) this.type('json');\n return this;\n};\n\n/**\n * @deprecated\n */\nResponse.prototype.parse = function serialize(fn){\n if (root.console) {\n console.warn(\"Client-side parse() method has been renamed to serialize(). This method is not compatible with superagent v2.0\");\n }\n this.serialize(fn);\n return this;\n};\n\nResponse.prototype.serialize = function serialize(fn){\n this._parser = fn;\n return this;\n};\n\n/**\n * Invoke the callback with `err` and `res`\n * and handle arity check.\n *\n * @param {Error} err\n * @param {Response} res\n * @api private\n */\n\nRequest.prototype.callback = function(err, res){\n var fn = this._callback;\n this.clearTimeout();\n fn(err, res);\n};\n\n/**\n * Invoke callback with x-domain error.\n *\n * @api private\n */\n\nRequest.prototype.crossDomainError = function(){\n var err = new Error('Request has been terminated\\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.');\n err.crossDomain = true;\n\n err.status = this.status;\n err.method = this.method;\n err.url = this.url;\n\n this.callback(err);\n};\n\n/**\n * Invoke callback with timeout error.\n *\n * @api private\n */\n\nRequest.prototype.timeoutError = function(){\n var timeout = this._timeout;\n var err = new Error('timeout of ' + timeout + 'ms exceeded');\n err.timeout = timeout;\n this.callback(err);\n};\n\n/**\n * Enable transmission of cookies with x-domain requests.\n *\n * Note that for this to work the origin must not be\n * using \"Access-Control-Allow-Origin\" with a wildcard,\n * and also must set \"Access-Control-Allow-Credentials\"\n * to \"true\".\n *\n * @api public\n */\n\nRequest.prototype.withCredentials = function(){\n this._withCredentials = true;\n return this;\n};\n\n/**\n * Initiate request, invoking callback `fn(res)`\n * with an instanceof `Response`.\n *\n * @param {Function} fn\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.end = function(fn){\n var self = this;\n var xhr = this.xhr = request.getXHR();\n var query = this._query.join('&');\n var timeout = this._timeout;\n var data = this._formData || this._data;\n\n // store callback\n this._callback = fn || noop;\n\n // state change\n xhr.onreadystatechange = function(){\n if (4 != xhr.readyState) return;\n\n // In IE9, reads to any property (e.g. status) off of an aborted XHR will\n // result in the error \"Could not complete the operation due to error c00c023f\"\n var status;\n try { status = xhr.status } catch(e) { status = 0; }\n\n if (0 == status) {\n if (self.timedout) return self.timeoutError();\n if (self.aborted) return;\n return self.crossDomainError();\n }\n self.emit('end');\n };\n\n // progress\n var handleProgress = function(e){\n if (e.total > 0) {\n e.percent = e.loaded / e.total * 100;\n }\n e.direction = 'download';\n self.emit('progress', e);\n };\n if (this.hasListeners('progress')) {\n xhr.onprogress = handleProgress;\n }\n try {\n if (xhr.upload && this.hasListeners('progress')) {\n xhr.upload.onprogress = handleProgress;\n }\n } catch(e) {\n // Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist.\n // Reported here:\n // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context\n }\n\n // timeout\n if (timeout && !this._timer) {\n this._timer = setTimeout(function(){\n self.timedout = true;\n self.abort();\n }, timeout);\n }\n\n // querystring\n if (query) {\n query = request.serializeObject(query);\n this.url += ~this.url.indexOf('?')\n ? '&' + query\n : '?' + query;\n }\n\n // initiate request\n if (this.username && this.password) {\n xhr.open(this.method, this.url, true, this.username, this.password);\n } else {\n xhr.open(this.method, this.url, true);\n }\n\n // CORS\n if (this._withCredentials) xhr.withCredentials = true;\n\n // body\n if ('GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !isHost(data)) {\n // serialize stuff\n var contentType = this._header['content-type'];\n var serialize = this._parser || request.serialize[contentType ? contentType.split(';')[0] : ''];\n if (!serialize && isJSON(contentType)) serialize = request.serialize['application/json'];\n if (serialize) data = serialize(data);\n }\n\n // set header fields\n for (var field in this.header) {\n if (null == this.header[field]) continue;\n xhr.setRequestHeader(field, this.header[field]);\n }\n\n if (this._responseType) {\n xhr.responseType = this._responseType;\n }\n\n // send stuff\n this.emit('request', this);\n\n // IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing)\n // We need null here if data is undefined\n xhr.send(typeof data !== 'undefined' ? data : null);\n return this;\n};\n\n\n/**\n * Expose `Request`.\n */\n\nrequest.Request = Request;\n\n/**\n * GET `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} data or fn\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.get = function(url, data, fn){\n var req = request('GET', url);\n if ('function' == typeof data) fn = data, data = null;\n if (data) req.query(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * HEAD `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} data or fn\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.head = function(url, data, fn){\n var req = request('HEAD', url);\n if ('function' == typeof data) fn = data, data = null;\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * DELETE `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nfunction del(url, fn){\n var req = request('DELETE', url);\n if (fn) req.end(fn);\n return req;\n};\n\nrequest['del'] = del;\nrequest['delete'] = del;\n\n/**\n * PATCH `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} data\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.patch = function(url, data, fn){\n var req = request('PATCH', url);\n if ('function' == typeof data) fn = data, data = null;\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * POST `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} data\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.post = function(url, data, fn){\n var req = request('POST', url);\n if ('function' == typeof data) fn = data, data = null;\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * PUT `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} data or fn\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.put = function(url, data, fn){\n var req = request('PUT', url);\n if ('function' == typeof data) fn = data, data = null;\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n\n\n\n// WEBPACK FOOTER //\n// node_modules/superagent/lib/client.js","/**\n * Check if `obj` is an object.\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isObject(obj) {\n return null != obj && 'object' == typeof obj;\n}\n\nmodule.exports = isObject;\n\n\n\n// WEBPACK FOOTER //\n// node_modules/superagent/lib/is-object.js","/**\n * Module of mixed-in functions shared between node and client code\n */\nvar isObject = require('./is-object');\n\n/**\n * Clear previous timeout.\n *\n * @return {Request} for chaining\n * @api public\n */\n\nexports.clearTimeout = function _clearTimeout(){\n this._timeout = 0;\n clearTimeout(this._timer);\n return this;\n};\n\n/**\n * Force given parser\n *\n * Sets the body parser no matter type.\n *\n * @param {Function}\n * @api public\n */\n\nexports.parse = function parse(fn){\n this._parser = fn;\n return this;\n};\n\n/**\n * Set timeout to `ms`.\n *\n * @param {Number} ms\n * @return {Request} for chaining\n * @api public\n */\n\nexports.timeout = function timeout(ms){\n this._timeout = ms;\n return this;\n};\n\n/**\n * Faux promise support\n *\n * @param {Function} fulfill\n * @param {Function} reject\n * @return {Request}\n */\n\nexports.then = function then(fulfill, reject) {\n return this.end(function(err, res) {\n err ? reject(err) : fulfill(res);\n });\n}\n\n/**\n * Allow for extension\n */\n\nexports.use = function use(fn) {\n fn(this);\n return this;\n}\n\n\n/**\n * Get request header `field`.\n * Case-insensitive.\n *\n * @param {String} field\n * @return {String}\n * @api public\n */\n\nexports.get = function(field){\n return this._header[field.toLowerCase()];\n};\n\n/**\n * Get case-insensitive header `field` value.\n * This is a deprecated internal API. Use `.get(field)` instead.\n *\n * (getHeader is no longer used internally by the superagent code base)\n *\n * @param {String} field\n * @return {String}\n * @api private\n * @deprecated\n */\n\nexports.getHeader = exports.get;\n\n/**\n * Set header `field` to `val`, or multiple fields with one object.\n * Case-insensitive.\n *\n * Examples:\n *\n * req.get('/')\n * .set('Accept', 'application/json')\n * .set('X-API-Key', 'foobar')\n * .end(callback);\n *\n * req.get('/')\n * .set({ Accept: 'application/json', 'X-API-Key': 'foobar' })\n * .end(callback);\n *\n * @param {String|Object} field\n * @param {String} val\n * @return {Request} for chaining\n * @api public\n */\n\nexports.set = function(field, val){\n if (isObject(field)) {\n for (var key in field) {\n this.set(key, field[key]);\n }\n return this;\n }\n this._header[field.toLowerCase()] = val;\n this.header[field] = val;\n return this;\n};\n\n/**\n * Remove header `field`.\n * Case-insensitive.\n *\n * Example:\n *\n * req.get('/')\n * .unset('User-Agent')\n * .end(callback);\n *\n * @param {String} field\n */\nexports.unset = function(field){\n delete this._header[field.toLowerCase()];\n delete this.header[field];\n return this;\n};\n\n/**\n * Write the field `name` and `val` for \"multipart/form-data\"\n * request bodies.\n *\n * ``` js\n * request.post('/upload')\n * .field('foo', 'bar')\n * .end(callback);\n * ```\n *\n * @param {String} name\n * @param {String|Blob|File|Buffer|fs.ReadStream} val\n * @return {Request} for chaining\n * @api public\n */\nexports.field = function(name, val) {\n this._getFormData().append(name, val);\n return this;\n};\n\n\n\n// WEBPACK FOOTER //\n// node_modules/superagent/lib/request-base.js","// The node and browser modules expose versions of this with the\n// appropriate constructor function bound as first argument\n/**\n * Issue a request:\n *\n * Examples:\n *\n * request('GET', '/users').end(callback)\n * request('/users').end(callback)\n * request('/users', callback)\n *\n * @param {String} method\n * @param {String|Function} url or callback\n * @return {Request}\n * @api public\n */\n\nfunction request(RequestConstructor, method, url) {\n // callback\n if ('function' == typeof url) {\n return new RequestConstructor('GET', method).end(url);\n }\n\n // url first\n if (2 == arguments.length) {\n return new RequestConstructor('GET', method);\n }\n\n return new RequestConstructor(method, url);\n}\n\nmodule.exports = request;\n\n\n\n// WEBPACK FOOTER //\n// node_modules/superagent/lib/request.js","/*! https://mths.be/punycode v1.3.2 by @mathias, modified for URI.js */\r\n\r\nvar punycode = (function () {\r\n\r\n\t/**\r\n\t * The `punycode` object.\r\n\t * @name punycode\r\n\t * @type Object\r\n\t */\r\n\tvar punycode,\r\n\r\n\t/** Highest positive signed 32-bit float value */\r\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\r\n\r\n\t/** Bootstring parameters */\r\n\tbase = 36,\r\n\ttMin = 1,\r\n\ttMax = 26,\r\n\tskew = 38,\r\n\tdamp = 700,\r\n\tinitialBias = 72,\r\n\tinitialN = 128, // 0x80\r\n\tdelimiter = '-', // '\\x2D'\r\n\r\n\t/** Regular expressions */\r\n\tregexPunycode = /^xn--/,\r\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\r\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\r\n\r\n\t/** Error messages */\r\n\terrors = {\r\n\t\t'overflow': 'Overflow: input needs wider integers to process',\r\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\r\n\t\t'invalid-input': 'Invalid input'\r\n\t},\r\n\r\n\t/** Convenience shortcuts */\r\n\tbaseMinusTMin = base - tMin,\r\n\tfloor = Math.floor,\r\n\tstringFromCharCode = String.fromCharCode,\r\n\r\n\t/** Temporary variable */\r\n\tkey;\r\n\r\n\t/*--------------------------------------------------------------------------*/\r\n\r\n\t/**\r\n\t * A generic error utility function.\r\n\t * @private\r\n\t * @param {String} type The error type.\r\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\r\n\t */\r\n\tfunction error(type) {\r\n\t\tthrow new RangeError(errors[type]);\r\n\t}\r\n\r\n\t/**\r\n\t * A generic `Array#map` utility function.\r\n\t * @private\r\n\t * @param {Array} array The array to iterate over.\r\n\t * @param {Function} callback The function that gets called for every array\r\n\t * item.\r\n\t * @returns {Array} A new array of values returned by the callback function.\r\n\t */\r\n\tfunction map(array, fn) {\r\n\t\tvar length = array.length;\r\n\t\tvar result = [];\r\n\t\twhile (length--) {\r\n\t\t\tresult[length] = fn(array[length]);\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\r\n\t/**\r\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\r\n\t * addresses.\r\n\t * @private\r\n\t * @param {String} domain The domain name or email address.\r\n\t * @param {Function} callback The function that gets called for every\r\n\t * character.\r\n\t * @returns {Array} A new string of characters returned by the callback\r\n\t * function.\r\n\t */\r\n\tfunction mapDomain(string, fn) {\r\n\t\tvar parts = string.split('@');\r\n\t\tvar result = '';\r\n\t\tif (parts.length > 1) {\r\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\r\n\t\t\t// the local part (i.e. everything up to `@`) intact.\r\n\t\t\tresult = parts[0] + '@';\r\n\t\t\tstring = parts[1];\r\n\t\t}\r\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\r\n\t\tstring = string.replace(regexSeparators, '\\x2E');\r\n\t\tvar labels = string.split('.');\r\n\t\tvar encoded = map(labels, fn).join('.');\r\n\t\treturn result + encoded;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates an array containing the numeric code points of each Unicode\r\n\t * character in the string. While JavaScript uses UCS-2 internally,\r\n\t * this function will convert a pair of surrogate halves (each of which\r\n\t * UCS-2 exposes as separate characters) into a single code point,\r\n\t * matching UTF-16.\r\n\t * @see `punycode.ucs2.encode`\r\n\t * @see \r\n\t * @memberOf punycode.ucs2\r\n\t * @name decode\r\n\t * @param {String} string The Unicode input string (UCS-2).\r\n\t * @returns {Array} The new array of code points.\r\n\t */\r\n\tfunction ucs2decode(string) {\r\n\t\tvar output = [],\r\n\t\t counter = 0,\r\n\t\t length = string.length,\r\n\t\t value,\r\n\t\t extra;\r\n\t\twhile (counter < length) {\r\n\t\t\tvalue = string.charCodeAt(counter++);\r\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\r\n\t\t\t\t// high surrogate, and there is a next character\r\n\t\t\t\textra = string.charCodeAt(counter++);\r\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\r\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\r\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\r\n\t\t\t\t\toutput.push(value);\r\n\t\t\t\t\tcounter--;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\toutput.push(value);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn output;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a string based on an array of numeric code points.\r\n\t * @see `punycode.ucs2.decode`\r\n\t * @memberOf punycode.ucs2\r\n\t * @name encode\r\n\t * @param {Array} codePoints The array of numeric code points.\r\n\t * @returns {String} The new Unicode string (UCS-2).\r\n\t */\r\n\tfunction ucs2encode(array) {\r\n\t\treturn map(array, function(value) {\r\n\t\t\tvar output = '';\r\n\t\t\tif (value > 0xFFFF) {\r\n\t\t\t\tvalue -= 0x10000;\r\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\r\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\r\n\t\t\t}\r\n\t\t\toutput += stringFromCharCode(value);\r\n\t\t\treturn output;\r\n\t\t}).join('');\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a basic code point into a digit/integer.\r\n\t * @see `digitToBasic()`\r\n\t * @private\r\n\t * @param {Number} codePoint The basic numeric code point value.\r\n\t * @returns {Number} The numeric value of a basic code point (for use in\r\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\r\n\t * the code point does not represent a value.\r\n\t */\r\n\tfunction basicToDigit(codePoint) {\r\n\t\tif (codePoint - 48 < 10) {\r\n\t\t\treturn codePoint - 22;\r\n\t\t}\r\n\t\tif (codePoint - 65 < 26) {\r\n\t\t\treturn codePoint - 65;\r\n\t\t}\r\n\t\tif (codePoint - 97 < 26) {\r\n\t\t\treturn codePoint - 97;\r\n\t\t}\r\n\t\treturn base;\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a digit/integer into a basic code point.\r\n\t * @see `basicToDigit()`\r\n\t * @private\r\n\t * @param {Number} digit The numeric value of a basic code point.\r\n\t * @returns {Number} The basic code point whose value (when used for\r\n\t * representing integers) is `digit`, which needs to be in the range\r\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\r\n\t * used; else, the lowercase form is used. The behavior is undefined\r\n\t * if `flag` is non-zero and `digit` has no uppercase form.\r\n\t */\r\n\tfunction digitToBasic(digit, flag) {\r\n\t\t// 0..25 map to ASCII a..z or A..Z\r\n\t\t// 26..35 map to ASCII 0..9\r\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\r\n\t}\r\n\r\n\t/**\r\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\r\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\r\n\t * @private\r\n\t */\r\n\tfunction adapt(delta, numPoints, firstTime) {\r\n\t\tvar k = 0;\r\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\r\n\t\tdelta += floor(delta / numPoints);\r\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\r\n\t\t\tdelta = floor(delta / baseMinusTMin);\r\n\t\t}\r\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\r\n\t * symbols.\r\n\t * @memberOf punycode\r\n\t * @param {String} input The Punycode string of ASCII-only symbols.\r\n\t * @returns {String} The resulting string of Unicode symbols.\r\n\t */\r\n\tfunction decode(input) {\r\n\t\t// Don't use UCS-2\r\n\t\tvar output = [],\r\n\t\t inputLength = input.length,\r\n\t\t out,\r\n\t\t i = 0,\r\n\t\t n = initialN,\r\n\t\t bias = initialBias,\r\n\t\t basic,\r\n\t\t j,\r\n\t\t index,\r\n\t\t oldi,\r\n\t\t w,\r\n\t\t k,\r\n\t\t digit,\r\n\t\t t,\r\n\t\t /** Cached calculation results */\r\n\t\t baseMinusT;\r\n\r\n\t\t// Handle the basic code points: let `basic` be the number of input code\r\n\t\t// points before the last delimiter, or `0` if there is none, then copy\r\n\t\t// the first basic code points to the output.\r\n\r\n\t\tbasic = input.lastIndexOf(delimiter);\r\n\t\tif (basic < 0) {\r\n\t\t\tbasic = 0;\r\n\t\t}\r\n\r\n\t\tfor (j = 0; j < basic; ++j) {\r\n\t\t\t// if it's not a basic code point\r\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\r\n\t\t\t\terror('not-basic');\r\n\t\t\t}\r\n\t\t\toutput.push(input.charCodeAt(j));\r\n\t\t}\r\n\r\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\r\n\t\t// points were copied; start at the beginning otherwise.\r\n\r\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\r\n\r\n\t\t\t// `index` is the index of the next character to be consumed.\r\n\t\t\t// Decode a generalized variable-length integer into `delta`,\r\n\t\t\t// which gets added to `i`. The overflow checking is easier\r\n\t\t\t// if we increase `i` as we go, then subtract off its starting\r\n\t\t\t// value at the end to obtain `delta`.\r\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\r\n\r\n\t\t\t\tif (index >= inputLength) {\r\n\t\t\t\t\terror('invalid-input');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\r\n\r\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\r\n\t\t\t\t\terror('overflow');\r\n\t\t\t\t}\r\n\r\n\t\t\t\ti += digit * w;\r\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\r\n\r\n\t\t\t\tif (digit < t) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbaseMinusT = base - t;\r\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\r\n\t\t\t\t\terror('overflow');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tw *= baseMinusT;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tout = output.length + 1;\r\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\r\n\r\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\r\n\t\t\t// incrementing `n` each time, so we'll fix that now:\r\n\t\t\tif (floor(i / out) > maxInt - n) {\r\n\t\t\t\terror('overflow');\r\n\t\t\t}\r\n\r\n\t\t\tn += floor(i / out);\r\n\t\t\ti %= out;\r\n\r\n\t\t\t// Insert `n` at position `i` of the output\r\n\t\t\toutput.splice(i++, 0, n);\r\n\r\n\t\t}\r\n\r\n\t\treturn ucs2encode(output);\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\r\n\t * Punycode string of ASCII-only symbols.\r\n\t * @memberOf punycode\r\n\t * @param {String} input The string of Unicode symbols.\r\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\r\n\t */\r\n\tfunction encode(input) {\r\n\t\tvar n,\r\n\t\t delta,\r\n\t\t handledCPCount,\r\n\t\t basicLength,\r\n\t\t bias,\r\n\t\t j,\r\n\t\t m,\r\n\t\t q,\r\n\t\t k,\r\n\t\t t,\r\n\t\t currentValue,\r\n\t\t output = [],\r\n\t\t /** `inputLength` will hold the number of code points in `input`. */\r\n\t\t inputLength,\r\n\t\t /** Cached calculation results */\r\n\t\t handledCPCountPlusOne,\r\n\t\t baseMinusT,\r\n\t\t qMinusT;\r\n\r\n\t\t// Convert the input in UCS-2 to Unicode\r\n\t\tinput = ucs2decode(input);\r\n\r\n\t\t// Cache the length\r\n\t\tinputLength = input.length;\r\n\r\n\t\t// Initialize the state\r\n\t\tn = initialN;\r\n\t\tdelta = 0;\r\n\t\tbias = initialBias;\r\n\r\n\t\t// Handle the basic code points\r\n\t\tfor (j = 0; j < inputLength; ++j) {\r\n\t\t\tcurrentValue = input[j];\r\n\t\t\tif (currentValue < 0x80) {\r\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\thandledCPCount = basicLength = output.length;\r\n\r\n\t\t// `handledCPCount` is the number of code points that have been handled;\r\n\t\t// `basicLength` is the number of basic code points.\r\n\r\n\t\t// Finish the basic string - if it is not empty - with a delimiter\r\n\t\tif (basicLength) {\r\n\t\t\toutput.push(delimiter);\r\n\t\t}\r\n\r\n\t\t// Main encoding loop:\r\n\t\twhile (handledCPCount < inputLength) {\r\n\r\n\t\t\t// All non-basic code points < n have been handled already. Find the next\r\n\t\t\t// larger one:\r\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\r\n\t\t\t\tcurrentValue = input[j];\r\n\t\t\t\tif (currentValue >= n && currentValue < m) {\r\n\t\t\t\t\tm = currentValue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Increase `delta` enough to advance the decoder's state to ,\r\n\t\t\t// but guard against overflow\r\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\r\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\r\n\t\t\t\terror('overflow');\r\n\t\t\t}\r\n\r\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\r\n\t\t\tn = m;\r\n\r\n\t\t\tfor (j = 0; j < inputLength; ++j) {\r\n\t\t\t\tcurrentValue = input[j];\r\n\r\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\r\n\t\t\t\t\terror('overflow');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (currentValue == n) {\r\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\r\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\r\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\r\n\t\t\t\t\t\tif (q < t) {\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tqMinusT = q - t;\r\n\t\t\t\t\t\tbaseMinusT = base - t;\r\n\t\t\t\t\t\toutput.push(\r\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\r\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\r\n\t\t\t\t\tdelta = 0;\r\n\t\t\t\t\t++handledCPCount;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t++delta;\r\n\t\t\t++n;\r\n\r\n\t\t}\r\n\t\treturn output.join('');\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a Punycode string representing a domain name or an email address\r\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\r\n\t * it doesn't matter if you call it on a string that has already been\r\n\t * converted to Unicode.\r\n\t * @memberOf punycode\r\n\t * @param {String} input The Punycoded domain name or email address to\r\n\t * convert to Unicode.\r\n\t * @returns {String} The Unicode representation of the given Punycode\r\n\t * string.\r\n\t */\r\n\tfunction toUnicode(input) {\r\n\t\treturn mapDomain(input, function(string) {\r\n\t\t\treturn regexPunycode.test(string)\r\n\t\t\t\t? decode(string.slice(4).toLowerCase())\r\n\t\t\t\t: string;\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a Unicode string representing a domain name or an email address to\r\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\r\n\t * i.e. it doesn't matter if you call it with a domain that's already in\r\n\t * ASCII.\r\n\t * @memberOf punycode\r\n\t * @param {String} input The domain name or email address to convert, as a\r\n\t * Unicode string.\r\n\t * @returns {String} The Punycode representation of the given domain name or\r\n\t * email address.\r\n\t */\r\n\tfunction toASCII(input) {\r\n\t\treturn mapDomain(input, function(string) {\r\n\t\t\treturn regexNonASCII.test(string)\r\n\t\t\t\t? 'xn--' + encode(string)\r\n\t\t\t\t: string;\r\n\t\t});\r\n\t}\r\n\r\n\t/*--------------------------------------------------------------------------*/\r\n\r\n\t/** Define the public API */\r\n\tpunycode = {\r\n\t\t/**\r\n\t\t * A string representing the current Punycode.js version number.\r\n\t\t * @memberOf punycode\r\n\t\t * @type String\r\n\t\t */\r\n\t\tversion: '1.3.2',\r\n\t\t/**\r\n\t\t * An object of methods to convert from JavaScript's internal character\r\n\t\t * representation (UCS-2) to Unicode code points, and back.\r\n\t\t * @see \r\n\t\t * @memberOf punycode\r\n\t\t * @type Object\r\n\t\t */\r\n\t\tucs2: {\r\n\t\t\tdecode: ucs2decode,\r\n\t\t\tencode: ucs2encode\r\n\t\t},\r\n\t\tdecode: decode,\r\n\t\tencode: encode,\r\n\t\ttoASCII: toASCII,\r\n\t\ttoUnicode: toUnicode\r\n\t};\r\n\r\n\treturn punycode;\r\n}());\r\n\r\nif (typeof COMPILED === \"undefined\" && typeof module !== \"undefined\") module.exports = punycode;\n\n\n// WEBPACK FOOTER //\n// node_modules/uri-js/build/punycode.js","///\r\nrequire(\"./schemes/http\");\r\nrequire(\"./schemes/urn\");\r\nrequire(\"./schemes/mailto\");\r\n\n\n\n// WEBPACK FOOTER //\n// node_modules/uri-js/build/schemes.js","///\r\nif (typeof COMPILED === \"undefined\" && typeof URI === \"undefined\" && typeof require === \"function\")\r\n var URI = require(\"../uri\");\r\nURI.SCHEMES[\"http\"] = URI.SCHEMES[\"https\"] = {\r\n domainHost: true,\r\n parse: function (components, options) {\r\n //report missing host\r\n if (!components.host) {\r\n components.error = components.error || \"HTTP URIs must have a host.\";\r\n }\r\n return components;\r\n },\r\n serialize: function (components, options) {\r\n //normalize the default port\r\n if (components.port === (String(components.scheme).toLowerCase() !== \"https\" ? 80 : 443) || components.port === \"\") {\r\n components.port = undefined;\r\n }\r\n //normalize the empty path\r\n if (!components.path) {\r\n components.path = \"/\";\r\n }\r\n //NOTE: We do not parse query strings for HTTP URIs\r\n //as WWW Form Url Encoded query strings are part of the HTML4+ spec,\r\n //and not the HTTP spec. \r\n return components;\r\n }\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// node_modules/uri-js/build/schemes/http.js","///\r\nif (typeof COMPILED === \"undefined\" && typeof URI === \"undefined\" && typeof require === \"function\") {\r\n var URI = require(\"../uri\"), punycode = require(\"../punycode\");\r\n}\r\n(function () {\r\n function merge() {\r\n var sets = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n sets[_i - 0] = arguments[_i];\r\n }\r\n if (sets.length > 1) {\r\n sets[0] = sets[0].slice(0, -1);\r\n var xl = sets.length - 1;\r\n for (var x = 1; x < xl; ++x) {\r\n sets[x] = sets[x].slice(1, -1);\r\n }\r\n sets[xl] = sets[xl].slice(1);\r\n return sets.join('');\r\n }\r\n else {\r\n return sets[0];\r\n }\r\n }\r\n function subexp(str) {\r\n return \"(?:\" + str + \")\";\r\n }\r\n var O = {}, isIRI = URI.IRI_SUPPORT, \r\n //RFC 3986\r\n UNRESERVED$$ = \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\" + (isIRI ? \"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\" : \"\") + \"]\", HEXDIG$$ = \"[0-9A-Fa-f]\", PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)), \r\n //RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; = \r\n //ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\#\\\\$\\\\%\\\\&\\\\'\\\\*\\\\+\\\\-\\\\/\\\\=\\\\?\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\",\r\n //WSP$$ = \"[\\\\x20\\\\x09]\",\r\n //OBS_QTEXT$$ = \"[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F]\", //(%d1-8 / %d11-12 / %d14-31 / %d127)\r\n //QTEXT$$ = merge(\"[\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7E]\", OBS_QTEXT$$), //%d33 / %d35-91 / %d93-126 / obs-qtext\r\n //VCHAR$$ = \"[\\\\x21-\\\\x7E]\",\r\n //WSP$$ = \"[\\\\x20\\\\x09]\",\r\n //OBS_QP$ = subexp(\"\\\\\\\\\" + merge(\"[\\\\x00\\\\x0D\\\\x0A]\", OBS_QTEXT$$)), //%d0 / CR / LF / obs-qtext\r\n //FWS$ = subexp(subexp(WSP$$ + \"*\" + \"\\\\x0D\\\\x0A\") + \"?\" + WSP$$ + \"+\"),\r\n //QUOTED_PAIR$ = subexp(subexp(\"\\\\\\\\\" + subexp(VCHAR$$ + \"|\" + WSP$$)) + \"|\" + OBS_QP$),\r\n //QUOTED_STRING$ = subexp('\\\\\"' + subexp(FWS$ + \"?\" + QCONTENT$) + \"*\" + FWS$ + \"?\" + '\\\\\"'),\r\n ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\", QTEXT$$ = \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\", VCHAR$$ = merge(QTEXT$$, \"[\\\\\\\"\\\\\\\\]\"), DOT_ATOM_TEXT$ = subexp(ATEXT$$ + \"+\" + subexp(\"\\\\.\" + ATEXT$$ + \"+\") + \"*\"), QUOTED_PAIR$ = subexp(\"\\\\\\\\\" + VCHAR$$), QCONTENT$ = subexp(QTEXT$$ + \"|\" + QUOTED_PAIR$), QUOTED_STRING$ = subexp('\\\\\"' + QCONTENT$ + \"*\" + '\\\\\"'), \r\n //RFC 6068\r\n DTEXT_NO_OBS$$ = \"[\\\\x21-\\\\x5A\\\\x5E-\\\\x7E]\", SOME_DELIMS$$ = \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\", QCHAR$ = subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$ + \"|\" + SOME_DELIMS$$), DOMAIN$ = subexp(DOT_ATOM_TEXT$ + \"|\" + \"\\\\[\" + DTEXT_NO_OBS$$ + \"*\" + \"\\\\]\"), LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + \"|\" + QUOTED_STRING$), ADDR_SPEC$ = subexp(LOCAL_PART$ + \"\\\\@\" + DOMAIN$), TO$ = subexp(ADDR_SPEC$ + subexp(\"\\\\,\" + ADDR_SPEC$) + \"*\"), HFNAME$ = subexp(QCHAR$ + \"*\"), HFVALUE$ = HFNAME$, HFIELD$ = subexp(HFNAME$ + \"\\\\=\" + HFVALUE$), HFIELDS2$ = subexp(HFIELD$ + subexp(\"\\\\&\" + HFIELD$) + \"*\"), HFIELDS$ = subexp(\"\\\\?\" + HFIELDS2$), MAILTO_URI = URI.VALIDATE_SUPPORT && new RegExp(\"^mailto\\\\:\" + TO$ + \"?\" + HFIELDS$ + \"?$\"), UNRESERVED = new RegExp(UNRESERVED$$, \"g\"), PCT_ENCODED = new RegExp(PCT_ENCODED$, \"g\"), NOT_LOCAL_PART = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", '[\\\\\"]', VCHAR$$), \"g\"), NOT_DOMAIN = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", \"[\\\\[]\", DTEXT_NO_OBS$$, \"[\\\\]]\"), \"g\"), NOT_HFNAME = new RegExp(merge(\"[^]\", UNRESERVED$$, SOME_DELIMS$$), \"g\"), NOT_HFVALUE = NOT_HFNAME, TO = URI.VALIDATE_SUPPORT && new RegExp(\"^\" + TO$ + \"$\"), HFIELDS = URI.VALIDATE_SUPPORT && new RegExp(\"^\" + HFIELDS2$ + \"$\");\r\n function toUpperCase(str) {\r\n return str.toUpperCase();\r\n }\r\n function decodeUnreserved(str) {\r\n var decStr = URI.pctDecChars(str);\r\n return (!decStr.match(UNRESERVED) ? str : decStr);\r\n }\r\n function toArray(obj) {\r\n return obj !== undefined && obj !== null ? (obj instanceof Array && !obj.callee ? obj : (typeof obj.length !== \"number\" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : [];\r\n }\r\n URI.SCHEMES[\"mailto\"] = {\r\n parse: function (components, options) {\r\n if (URI.VALIDATE_SUPPORT && !components.error) {\r\n if (components.path && !TO.test(components.path)) {\r\n components.error = \"Email address is not valid\";\r\n }\r\n else if (components.query && !HFIELDS.test(components.query)) {\r\n components.error = \"Header fields are invalid\";\r\n }\r\n }\r\n var to = components.to = (components.path ? components.path.split(\",\") : []);\r\n components.path = undefined;\r\n if (components.query) {\r\n var unknownHeaders = false, headers = {};\r\n var hfields = components.query.split(\"&\");\r\n for (var x = 0, xl = hfields.length; x < xl; ++x) {\r\n var hfield = hfields[x].split(\"=\");\r\n switch (hfield[0]) {\r\n case \"to\":\r\n var toAddrs = hfield[1].split(\",\");\r\n for (var x_1 = 0, xl_1 = toAddrs.length; x_1 < xl_1; ++x_1) {\r\n to.push(toAddrs[x_1]);\r\n }\r\n break;\r\n case \"subject\":\r\n components.subject = URI.unescapeComponent(hfield[1], options);\r\n break;\r\n case \"body\":\r\n components.body = URI.unescapeComponent(hfield[1], options);\r\n break;\r\n default:\r\n unknownHeaders = true;\r\n headers[URI.unescapeComponent(hfield[0], options)] = URI.unescapeComponent(hfield[1], options);\r\n break;\r\n }\r\n }\r\n if (unknownHeaders)\r\n components.headers = headers;\r\n }\r\n components.query = undefined;\r\n for (var x = 0, xl = to.length; x < xl; ++x) {\r\n var addr = to[x].split(\"@\");\r\n addr[0] = URI.unescapeComponent(addr[0]);\r\n if (typeof punycode !== \"undefined\" && !options.unicodeSupport) {\r\n //convert Unicode IDN -> ASCII IDN\r\n try {\r\n addr[1] = punycode.toASCII(URI.unescapeComponent(addr[1], options).toLowerCase());\r\n }\r\n catch (e) {\r\n components.error = components.error || \"Email address's domain name can not be converted to ASCII via punycode: \" + e;\r\n }\r\n }\r\n else {\r\n addr[1] = URI.unescapeComponent(addr[1], options).toLowerCase();\r\n }\r\n to[x] = addr.join(\"@\");\r\n }\r\n return components;\r\n },\r\n serialize: function (components, options) {\r\n var to = toArray(components.to);\r\n if (to) {\r\n for (var x = 0, xl = to.length; x < xl; ++x) {\r\n var toAddr = String(to[x]);\r\n var atIdx = toAddr.lastIndexOf(\"@\");\r\n var localPart = toAddr.slice(0, atIdx);\r\n var domain = toAddr.slice(atIdx + 1);\r\n localPart = localPart.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, URI.pctEncChar);\r\n if (typeof punycode !== \"undefined\") {\r\n //convert IDN via punycode\r\n try {\r\n domain = (!options.iri ? punycode.toASCII(URI.unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain));\r\n }\r\n catch (e) {\r\n components.error = components.error || \"Email address's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\r\n }\r\n }\r\n else {\r\n domain = domain.replace(PCT_ENCODED, decodeUnreserved).toLowerCase().replace(PCT_ENCODED, toUpperCase).replace(NOT_DOMAIN, URI.pctEncChar);\r\n }\r\n to[x] = localPart + \"@\" + domain;\r\n }\r\n components.path = to.join(\",\");\r\n }\r\n var headers = components.headers = components.headers || {};\r\n if (components.subject)\r\n headers[\"subject\"] = components.subject;\r\n if (components.body)\r\n headers[\"body\"] = components.body;\r\n var fields = [];\r\n for (var name_1 in headers) {\r\n if (headers[name_1] !== O[name_1]) {\r\n fields.push(name_1.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, URI.pctEncChar) +\r\n \"=\" +\r\n headers[name_1].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, URI.pctEncChar));\r\n }\r\n }\r\n if (fields.length) {\r\n components.query = fields.join(\"&\");\r\n }\r\n return components;\r\n }\r\n };\r\n})();\r\n\n\n\n// WEBPACK FOOTER //\n// node_modules/uri-js/build/schemes/mailto.js","///\r\nif (typeof COMPILED === \"undefined\" && typeof URI === \"undefined\" && typeof require === \"function\")\r\n var URI = require(\"../uri\");\r\n(function () {\r\n var pctEncChar = URI.pctEncChar, NID$ = \"(?:[0-9A-Za-z][0-9A-Za-z\\\\-]{1,31})\", PCT_ENCODED$ = \"(?:\\\\%[0-9A-Fa-f]{2})\", TRANS$$ = \"[0-9A-Za-z\\\\(\\\\)\\\\+\\\\,\\\\-\\\\.\\\\:\\\\=\\\\@\\\\;\\\\$\\\\_\\\\!\\\\*\\\\'\\\\/\\\\?\\\\#]\", NSS$ = \"(?:(?:\" + PCT_ENCODED$ + \"|\" + TRANS$$ + \")+)\", URN_SCHEME = new RegExp(\"^urn\\\\:(\" + NID$ + \")$\"), URN_PATH = new RegExp(\"^(\" + NID$ + \")\\\\:(\" + NSS$ + \")$\"), URN_PARSE = /^([^\\:]+)\\:(.*)/, URN_EXCLUDED = /[\\x00-\\x20\\\\\\\"\\&\\<\\>\\[\\]\\^\\`\\{\\|\\}\\~\\x7F-\\xFF]/g, UUID = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;\r\n //RFC 2141\r\n URI.SCHEMES[\"urn\"] = {\r\n parse: function (components, options) {\r\n var matches = components.path.match(URN_PATH), scheme, schemeHandler;\r\n if (!matches) {\r\n if (!options.tolerant) {\r\n components.error = components.error || \"URN is not strictly valid.\";\r\n }\r\n matches = components.path.match(URN_PARSE);\r\n }\r\n if (matches) {\r\n scheme = \"urn:\" + matches[1].toLowerCase();\r\n schemeHandler = URI.SCHEMES[scheme];\r\n //in order to serialize properly, \r\n //every URN must have a serializer that calls the URN serializer \r\n if (!schemeHandler) {\r\n //create fake scheme handler\r\n schemeHandler = URI.SCHEMES[scheme] = {\r\n parse: function (components, options) {\r\n return components;\r\n },\r\n serialize: URI.SCHEMES[\"urn\"].serialize\r\n };\r\n }\r\n components.scheme = scheme;\r\n components.path = matches[2];\r\n components = schemeHandler.parse(components, options);\r\n }\r\n else {\r\n components.error = components.error || \"URN can not be parsed.\";\r\n }\r\n return components;\r\n },\r\n serialize: function (components, options) {\r\n var scheme = components.scheme || options.scheme, matches;\r\n if (scheme && scheme !== \"urn\") {\r\n var matches = scheme.match(URN_SCHEME);\r\n if (!matches) {\r\n matches = [\"urn:\" + scheme, scheme];\r\n }\r\n components.scheme = \"urn\";\r\n components.path = matches[1] + \":\" + (components.path ? components.path.replace(URN_EXCLUDED, pctEncChar) : \"\");\r\n }\r\n return components;\r\n }\r\n };\r\n //RFC 4122\r\n URI.SCHEMES[\"urn:uuid\"] = {\r\n parse: function (components, options) {\r\n if (!options.tolerant && (!components.path || !components.path.match(UUID))) {\r\n components.error = components.error || \"UUID is not valid.\";\r\n }\r\n return components;\r\n },\r\n serialize: function (components, options) {\r\n //ensure UUID is valid\r\n if (!options.tolerant && (!components.path || !components.path.match(UUID))) {\r\n //invalid UUIDs can not have this scheme\r\n components.scheme = undefined;\r\n }\r\n else {\r\n //normalize UUID\r\n components.path = (components.path || \"\").toLowerCase();\r\n }\r\n return URI.SCHEMES[\"urn\"].serialize(components, options);\r\n }\r\n };\r\n}());\r\n\n\n\n// WEBPACK FOOTER //\n// node_modules/uri-js/build/schemes/urn.js","/**\r\n * URI.js\r\n *\r\n * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.\r\n * @author Gary Court\r\n * @version 2.0.0\r\n * @see http://github.com/garycourt/uri-js\r\n * @license URI.js v2.0.0 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js\r\n */\r\n/**\r\n * Copyright 2011 Gary Court. All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification, are\r\n * permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this list of\r\n * conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\r\n * of conditions and the following disclaimer in the documentation and/or other materials\r\n * provided with the distribution.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\r\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\r\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\r\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\r\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n *\r\n * The views and conclusions contained in the software and documentation are those of the\r\n * authors and should not be interpreted as representing official policies, either expressed\r\n * or implied, of Gary Court.\r\n */\r\n///\r\n///\r\n/**\r\n * Compiler switch for indicating code is compiled\r\n * @define {boolean}\r\n */\r\nvar COMPILED = false;\r\n/**\r\n * Compiler switch for supporting IRI URIs\r\n * @define {boolean}\r\n */\r\nvar URI__IRI_SUPPORT = true;\r\n/**\r\n * Compiler switch for supporting URI validation\r\n * @define {boolean}\r\n */\r\nvar URI__VALIDATE_SUPPORT = true;\r\nvar URI = (function () {\r\n function merge() {\r\n var sets = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n sets[_i - 0] = arguments[_i];\r\n }\r\n if (sets.length > 1) {\r\n sets[0] = sets[0].slice(0, -1);\r\n var xl = sets.length - 1;\r\n for (var x = 1; x < xl; ++x) {\r\n sets[x] = sets[x].slice(1, -1);\r\n }\r\n sets[xl] = sets[xl].slice(1);\r\n return sets.join('');\r\n }\r\n else {\r\n return sets[0];\r\n }\r\n }\r\n function subexp(str) {\r\n return \"(?:\" + str + \")\";\r\n }\r\n function buildExps(isIRI) {\r\n var ALPHA$$ = \"[A-Za-z]\", CR$ = \"[\\\\x0D]\", DIGIT$$ = \"[0-9]\", DQUOTE$$ = \"[\\\\x22]\", HEXDIG$$ = merge(DIGIT$$, \"[A-Fa-f]\"), LF$$ = \"[\\\\x0A]\", SP$$ = \"[\\\\x20]\", PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)), GEN_DELIMS$$ = \"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\", SUB_DELIMS$$ = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\", RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), UCSCHAR$$ = isIRI ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\" : \"[]\", IPRIVATE$$ = isIRI ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\", UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, \"[\\\\-\\\\.\\\\_\\\\~]\", UCSCHAR$$), SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\") + \"*\"), USERINFO$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\")) + \"*\"), DEC_OCTET$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"[1-9]\" + DIGIT$$) + \"|\" + DIGIT$$), IPV4ADDRESS$ = subexp(DEC_OCTET$ + \"\\\\.\" + DEC_OCTET$ + \"\\\\.\" + DEC_OCTET$ + \"\\\\.\" + DEC_OCTET$), H16$ = subexp(HEXDIG$$ + \"{1,4}\"), LS32$ = subexp(subexp(H16$ + \"\\\\:\" + H16$) + \"|\" + IPV4ADDRESS$), IPV6ADDRESS$ = subexp(merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"), IPVFUTURE$ = subexp(\"v\" + HEXDIG$$ + \"+\\\\.\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"), IP_LITERAL$ = subexp(\"\\\\[\" + subexp(IPV6ADDRESS$ + \"|\" + IPVFUTURE$) + \"\\\\]\"), REG_NAME$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$)) + \"*\"), HOST$ = subexp(IP_LITERAL$ + \"|\" + IPV4ADDRESS$ + \"(?!\" + REG_NAME$ + \")\" + \"|\" + REG_NAME$), PORT$ = subexp(DIGIT$$ + \"*\"), AUTHORITY$ = subexp(subexp(USERINFO$ + \"@\") + \"?\" + HOST$ + subexp(\"\\\\:\" + PORT$) + \"?\"), PCHAR$ = subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@]\")), SEGMENT$ = subexp(PCHAR$ + \"*\"), SEGMENT_NZ$ = subexp(PCHAR$ + \"+\"), SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\@]\")) + \"+\"), PATH_ABEMPTY$ = subexp(subexp(\"\\\\/\" + SEGMENT$) + \"*\"), PATH_ABSOLUTE$ = subexp(\"\\\\/\" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + \"?\"), PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), PATH_EMPTY$ = \"(?!\" + PCHAR$ + \")\", PATH$ = subexp(PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$), QUERY$ = subexp(subexp(PCHAR$ + \"|\" + merge(\"[\\\\/\\\\?]\", IPRIVATE$$)) + \"*\"), FRAGMENT$ = subexp(subexp(PCHAR$ + \"|[\\\\/\\\\?]\") + \"*\"), HIER_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$), URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"), RELATIVE_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$), RELATIVE$ = subexp(RELATIVE_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"), URI_REFERENCE$ = subexp(URI$ + \"|\" + RELATIVE$), ABSOLUTE_URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\"), GENERIC_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\", RELATIVE_REF$ = \"^(){0}\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\", ABSOLUTE_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?$\", SAMEDOC_REF$ = \"^\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\", AUTHORITY_REF$ = \"^\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?$\";\r\n return {\r\n URI_REF: URI__VALIDATE_SUPPORT && new RegExp(\"(\" + GENERIC_REF$ + \")|(\" + RELATIVE_REF$ + \")\"),\r\n NOT_SCHEME: new RegExp(merge(\"[^]\", ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\"), \"g\"),\r\n NOT_USERINFO: new RegExp(merge(\"[^\\\\%\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\r\n NOT_HOST: new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\r\n NOT_PATH: new RegExp(merge(\"[^\\\\%\\\\/\\\\:\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\r\n NOT_PATH_NOSCHEME: new RegExp(merge(\"[^\\\\%\\\\/\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\r\n NOT_QUERY: new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\", IPRIVATE$$), \"g\"),\r\n NOT_FRAGMENT: new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\"), \"g\"),\r\n ESCAPE: new RegExp(merge(\"[^]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\r\n UNRESERVED: new RegExp(UNRESERVED$$, \"g\"),\r\n OTHER_CHARS: new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, RESERVED$$), \"g\"),\r\n PCT_ENCODED: new RegExp(PCT_ENCODED$, \"g\")\r\n };\r\n }\r\n var URI_PROTOCOL = buildExps(false), IRI_PROTOCOL = URI__IRI_SUPPORT ? buildExps(true) : undefined, URI_PARSE = /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?([^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n)*))?/i, RDS1 = /^\\.\\.?\\//, RDS2 = /^\\/\\.(\\/|$)/, RDS3 = /^\\/\\.\\.(\\/|$)/, RDS4 = /^\\.\\.?$/, RDS5 = /^\\/?(?:.|\\n)*?(?=\\/|$)/, NO_MATCH_IS_UNDEFINED = (\"\").match(/(){0}/)[1] === undefined;\r\n function pctEncChar(chr) {\r\n var c = chr.charCodeAt(0), e;\r\n if (c < 16)\r\n e = \"%0\" + c.toString(16).toUpperCase();\r\n else if (c < 128)\r\n e = \"%\" + c.toString(16).toUpperCase();\r\n else if (c < 2048)\r\n e = \"%\" + ((c >> 6) | 192).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\r\n else\r\n e = \"%\" + ((c >> 12) | 224).toString(16).toUpperCase() + \"%\" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\r\n return e;\r\n }\r\n function pctDecChars(str) {\r\n var newStr = \"\", i = 0, il = str.length, c, c2, c3;\r\n while (i < il) {\r\n c = parseInt(str.substr(i + 1, 2), 16);\r\n if (c < 128) {\r\n newStr += String.fromCharCode(c);\r\n i += 3;\r\n }\r\n else if (c >= 194 && c < 224) {\r\n if ((il - i) >= 6) {\r\n c2 = parseInt(str.substr(i + 4, 2), 16);\r\n newStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\r\n }\r\n else {\r\n newStr += str.substr(i, 6);\r\n }\r\n i += 6;\r\n }\r\n else if (c >= 224) {\r\n if ((il - i) >= 9) {\r\n c2 = parseInt(str.substr(i + 4, 2), 16);\r\n c3 = parseInt(str.substr(i + 7, 2), 16);\r\n newStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\r\n }\r\n else {\r\n newStr += str.substr(i, 9);\r\n }\r\n i += 9;\r\n }\r\n else {\r\n newStr += str.substr(i, 3);\r\n i += 3;\r\n }\r\n }\r\n return newStr;\r\n }\r\n function typeOf(o) {\r\n return o === undefined ? \"undefined\" : (o === null ? \"null\" : Object.prototype.toString.call(o).split(\" \").pop().split(\"]\").shift().toLowerCase());\r\n }\r\n function toUpperCase(str) {\r\n return str.toUpperCase();\r\n }\r\n var SCHEMES = {};\r\n function _normalizeComponentEncoding(components, protocol) {\r\n function decodeUnreserved(str) {\r\n var decStr = pctDecChars(str);\r\n return (!decStr.match(protocol.UNRESERVED) ? str : decStr);\r\n }\r\n if (components.scheme)\r\n components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, \"\");\r\n if (components.userinfo !== undefined)\r\n components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\r\n if (components.host !== undefined)\r\n components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\r\n if (components.path !== undefined)\r\n components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\r\n if (components.query !== undefined)\r\n components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\r\n if (components.fragment !== undefined)\r\n components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\r\n return components;\r\n }\r\n ;\r\n function parse(uriString, options) {\r\n if (options === void 0) { options = {}; }\r\n var protocol = (URI__IRI_SUPPORT && options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL), matches, parseError = false, components = {}, schemeHandler;\r\n if (options.reference === \"suffix\")\r\n uriString = (options.scheme ? options.scheme + \":\" : \"\") + \"//\" + uriString;\r\n if (URI__VALIDATE_SUPPORT) {\r\n matches = uriString.match(protocol.URI_REF);\r\n if (matches) {\r\n if (matches[1]) {\r\n //generic URI\r\n matches = matches.slice(1, 10);\r\n }\r\n else {\r\n //relative URI\r\n matches = matches.slice(10, 19);\r\n }\r\n }\r\n if (!matches) {\r\n parseError = true;\r\n if (!options.tolerant)\r\n components.error = components.error || \"URI is not strictly valid.\";\r\n matches = uriString.match(URI_PARSE);\r\n }\r\n }\r\n else {\r\n matches = uriString.match(URI_PARSE);\r\n }\r\n if (matches) {\r\n if (NO_MATCH_IS_UNDEFINED) {\r\n //store each component\r\n components.scheme = matches[1];\r\n //components.authority = matches[2];\r\n components.userinfo = matches[3];\r\n components.host = matches[4];\r\n components.port = parseInt(matches[5], 10);\r\n components.path = matches[6] || \"\";\r\n components.query = matches[7];\r\n components.fragment = matches[8];\r\n //fix port number\r\n if (isNaN(components.port)) {\r\n components.port = matches[5];\r\n }\r\n }\r\n else {\r\n //store each component\r\n components.scheme = matches[1] || undefined;\r\n //components.authority = (uriString.indexOf(\"//\") !== -1 ? matches[2] : undefined);\r\n components.userinfo = (uriString.indexOf(\"@\") !== -1 ? matches[3] : undefined);\r\n components.host = (uriString.indexOf(\"//\") !== -1 ? matches[4] : undefined);\r\n components.port = parseInt(matches[5], 10);\r\n components.path = matches[6] || \"\";\r\n components.query = (uriString.indexOf(\"?\") !== -1 ? matches[7] : undefined);\r\n components.fragment = (uriString.indexOf(\"#\") !== -1 ? matches[8] : undefined);\r\n //fix port number\r\n if (isNaN(components.port)) {\r\n components.port = (uriString.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/) ? matches[4] : undefined);\r\n }\r\n }\r\n //determine reference type\r\n if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {\r\n components.reference = \"same-document\";\r\n }\r\n else if (components.scheme === undefined) {\r\n components.reference = \"relative\";\r\n }\r\n else if (components.fragment === undefined) {\r\n components.reference = \"absolute\";\r\n }\r\n else {\r\n components.reference = \"uri\";\r\n }\r\n //check for reference errors\r\n if (options.reference && options.reference !== \"suffix\" && options.reference !== components.reference) {\r\n components.error = components.error || \"URI is not a \" + options.reference + \" reference.\";\r\n }\r\n //find scheme handler\r\n schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\r\n //check if scheme can't handle IRIs\r\n if (URI__IRI_SUPPORT && typeof punycode !== \"undefined\" && !options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\r\n //if host component is a domain name\r\n if (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {\r\n //convert Unicode IDN -> ASCII IDN\r\n try {\r\n components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());\r\n }\r\n catch (e) {\r\n components.error = components.error || \"Host's domain name can not be converted to ASCII via punycode: \" + e;\r\n }\r\n }\r\n //convert IRI -> URI\r\n _normalizeComponentEncoding(components, URI_PROTOCOL);\r\n }\r\n else {\r\n //normalize encodings\r\n _normalizeComponentEncoding(components, protocol);\r\n }\r\n //perform scheme specific parsing\r\n if (schemeHandler && schemeHandler.parse) {\r\n schemeHandler.parse(components, options);\r\n }\r\n }\r\n else {\r\n parseError = true;\r\n components.error = components.error || \"URI can not be parsed.\";\r\n }\r\n return components;\r\n }\r\n ;\r\n function _recomposeAuthority(components, options) {\r\n var uriTokens = [];\r\n if (components.userinfo !== undefined) {\r\n uriTokens.push(components.userinfo);\r\n uriTokens.push(\"@\");\r\n }\r\n if (components.host !== undefined) {\r\n uriTokens.push(components.host);\r\n }\r\n if (typeof components.port === \"number\") {\r\n uriTokens.push(\":\");\r\n uriTokens.push(components.port.toString(10));\r\n }\r\n return uriTokens.length ? uriTokens.join(\"\") : undefined;\r\n }\r\n ;\r\n function removeDotSegments(input) {\r\n var output = [], s;\r\n while (input.length) {\r\n if (input.match(RDS1)) {\r\n input = input.replace(RDS1, \"\");\r\n }\r\n else if (input.match(RDS2)) {\r\n input = input.replace(RDS2, \"/\");\r\n }\r\n else if (input.match(RDS3)) {\r\n input = input.replace(RDS3, \"/\");\r\n output.pop();\r\n }\r\n else if (input === \".\" || input === \"..\") {\r\n input = \"\";\r\n }\r\n else {\r\n s = input.match(RDS5)[0];\r\n input = input.slice(s.length);\r\n output.push(s);\r\n }\r\n }\r\n return output.join(\"\");\r\n }\r\n ;\r\n function serialize(components, options) {\r\n if (options === void 0) { options = {}; }\r\n var protocol = (URI__IRI_SUPPORT && options.iri ? IRI_PROTOCOL : URI_PROTOCOL), uriTokens = [], schemeHandler, authority, s;\r\n //find scheme handler\r\n schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\r\n //perform scheme specific serialization\r\n if (schemeHandler && schemeHandler.serialize)\r\n schemeHandler.serialize(components, options);\r\n //if host component is a domain name\r\n if (URI__IRI_SUPPORT && typeof punycode !== \"undefined\" && components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {\r\n //convert IDN via punycode\r\n try {\r\n components.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host));\r\n }\r\n catch (e) {\r\n components.error = components.error || \"Host's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\r\n }\r\n }\r\n //normalize encoding\r\n _normalizeComponentEncoding(components, protocol);\r\n if (options.reference !== \"suffix\" && components.scheme) {\r\n uriTokens.push(components.scheme);\r\n uriTokens.push(\":\");\r\n }\r\n authority = _recomposeAuthority(components, options);\r\n if (authority !== undefined) {\r\n if (options.reference !== \"suffix\") {\r\n uriTokens.push(\"//\");\r\n }\r\n uriTokens.push(authority);\r\n if (components.path && components.path.charAt(0) !== \"/\") {\r\n uriTokens.push(\"/\");\r\n }\r\n }\r\n if (components.path !== undefined) {\r\n s = components.path;\r\n if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\r\n s = removeDotSegments(s);\r\n }\r\n if (authority === undefined) {\r\n s = s.replace(/^\\/\\//, \"/%2F\"); //don't allow the path to start with \"//\"\r\n }\r\n uriTokens.push(s);\r\n }\r\n if (components.query !== undefined) {\r\n uriTokens.push(\"?\");\r\n uriTokens.push(components.query);\r\n }\r\n if (components.fragment !== undefined) {\r\n uriTokens.push(\"#\");\r\n uriTokens.push(components.fragment);\r\n }\r\n return uriTokens.join(''); //merge tokens into a string\r\n }\r\n ;\r\n function resolveComponents(base, relative, options, skipNormalization) {\r\n if (options === void 0) { options = {}; }\r\n var target = {};\r\n if (!skipNormalization) {\r\n base = parse(serialize(base, options), options); //normalize base components\r\n relative = parse(serialize(relative, options), options); //normalize relative components\r\n }\r\n options = options || {};\r\n if (!options.tolerant && relative.scheme) {\r\n target.scheme = relative.scheme;\r\n //target.authority = relative.authority;\r\n target.userinfo = relative.userinfo;\r\n target.host = relative.host;\r\n target.port = relative.port;\r\n target.path = removeDotSegments(relative.path);\r\n target.query = relative.query;\r\n }\r\n else {\r\n if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\r\n //target.authority = relative.authority;\r\n target.userinfo = relative.userinfo;\r\n target.host = relative.host;\r\n target.port = relative.port;\r\n target.path = removeDotSegments(relative.path);\r\n target.query = relative.query;\r\n }\r\n else {\r\n if (!relative.path) {\r\n target.path = base.path;\r\n if (relative.query !== undefined) {\r\n target.query = relative.query;\r\n }\r\n else {\r\n target.query = base.query;\r\n }\r\n }\r\n else {\r\n if (relative.path.charAt(0) === \"/\") {\r\n target.path = removeDotSegments(relative.path);\r\n }\r\n else {\r\n if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\r\n target.path = \"/\" + relative.path;\r\n }\r\n else if (!base.path) {\r\n target.path = relative.path;\r\n }\r\n else {\r\n target.path = base.path.slice(0, base.path.lastIndexOf(\"/\") + 1) + relative.path;\r\n }\r\n target.path = removeDotSegments(target.path);\r\n }\r\n target.query = relative.query;\r\n }\r\n //target.authority = base.authority;\r\n target.userinfo = base.userinfo;\r\n target.host = base.host;\r\n target.port = base.port;\r\n }\r\n target.scheme = base.scheme;\r\n }\r\n target.fragment = relative.fragment;\r\n return target;\r\n }\r\n ;\r\n function resolve(baseURI, relativeURI, options) {\r\n return serialize(resolveComponents(parse(baseURI, options), parse(relativeURI, options), options, true), options);\r\n }\r\n ;\r\n function normalize(uri, options) {\r\n if (typeof uri === \"string\") {\r\n uri = serialize(parse(uri, options), options);\r\n }\r\n else if (typeOf(uri) === \"object\") {\r\n uri = parse(serialize(uri, options), options);\r\n }\r\n return uri;\r\n }\r\n ;\r\n function equal(uriA, uriB, options) {\r\n if (typeof uriA === \"string\") {\r\n uriA = serialize(parse(uriA, options), options);\r\n }\r\n else if (typeOf(uriA) === \"object\") {\r\n uriA = serialize(uriA, options);\r\n }\r\n if (typeof uriB === \"string\") {\r\n uriB = serialize(parse(uriB, options), options);\r\n }\r\n else if (typeOf(uriB) === \"object\") {\r\n uriB = serialize(uriB, options);\r\n }\r\n return uriA === uriB;\r\n }\r\n ;\r\n function escapeComponent(str, options) {\r\n return str && str.toString().replace((!URI__IRI_SUPPORT || !options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar);\r\n }\r\n ;\r\n function unescapeComponent(str, options) {\r\n return str && str.toString().replace((!URI__IRI_SUPPORT || !options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars);\r\n }\r\n ;\r\n return {\r\n IRI_SUPPORT: URI__IRI_SUPPORT,\r\n VALIDATE_SUPPORT: URI__VALIDATE_SUPPORT,\r\n pctEncChar: pctEncChar,\r\n pctDecChars: pctDecChars,\r\n SCHEMES: SCHEMES,\r\n parse: parse,\r\n _recomposeAuthority: _recomposeAuthority,\r\n removeDotSegments: removeDotSegments,\r\n serialize: serialize,\r\n resolveComponents: resolveComponents,\r\n resolve: resolve,\r\n normalize: normalize,\r\n equal: equal,\r\n escapeComponent: escapeComponent,\r\n unescapeComponent: unescapeComponent\r\n };\r\n})();\r\nif (!COMPILED && typeof module !== \"undefined\" && typeof require === \"function\") {\r\n var punycode = require(\"./punycode\");\r\n module.exports = URI;\r\n require(\"./schemes\");\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// node_modules/uri-js/build/uri.js","import {stringify, parse} from './sf-path';\r\nimport { defaultForm, createDefaults } from './schema-defaults';\r\nimport canonicalTitleMap from './canonical-title-map';\r\n\r\n// export function merge(schema, form, schemaDefaultTypes, ignore, options, readonly, asyncTemplates) {\r\nexport function merge(lookup, form, ignore, options, readonly, asyncTemplates) {\r\n let formItems = [];\r\n let formItemRest = [];\r\n form = form || [];\r\n let idx = form.indexOf('*');\r\n options = options || {};\r\n let stdForm = {};\r\n\r\n let idxRest = form.indexOf('...');\r\n if(typeof lookup === 'object' && lookup.hasOwnProperty('properties')) {\r\n readonly = readonly || lookup.readonly || lookup.readOnly;\r\n stdForm = defaultForm(lookup, createDefaults(), ignore, options);\r\n\r\n let defaultFormLookup = stdForm.lookup;\r\n\r\n lookup = defaultFormLookup || lookup;\r\n formItems = formItems.concat(stdForm.form);\r\n };\r\n\r\n if (idx !== -1) {\r\n form = form.slice(0, idx).concat(formItems).concat(form.slice(idx + 1));\r\n }\r\n\r\n //simple case, we have a \"...\", just put the formItemRest there\r\n if (stdForm.form && idxRest !== -1) {\r\n let formKeys = form.map(function(obj) {\r\n if (typeof obj === 'string'){\r\n return obj;\r\n }\r\n else if (obj.key) {\r\n return obj.key;\r\n };\r\n }).filter(function(element) {\r\n return element !== undefined;\r\n });\r\n\r\n formItemRest = formItemRest.concat(\r\n stdForm.form.map(function(obj) {\r\n let isInside = formKeys.indexOf(obj.key[0]) !== -1;\r\n if (!isInside) {\r\n return obj;\r\n };\r\n })\r\n .filter(function(element) {\r\n return element !== undefined;\r\n })\r\n );\r\n };\r\n\r\n if (idxRest !== -1) {\r\n form = form.slice(0, idxRest).concat(formItemRest).concat(form.slice(idxRest + 1));\r\n };\r\n\r\n // ok let's merge!\r\n // We look at the supplied form and extend it with schema standards\r\n return form.map((obj) => {\r\n // handle the shortcut with just a name\r\n if (typeof obj === 'string') {\r\n obj = { key: obj };\r\n }\r\n\r\n if (obj.key) {\r\n if (typeof obj.key === 'string') {\r\n obj.key = parse(obj.key);\r\n }\r\n }\r\n\r\n // If it has a titleMap make sure it's a list\r\n if (obj.titleMap) {\r\n obj.titleMap = canonicalTitleMap(obj.titleMap);\r\n }\r\n\r\n // extend with std form from schema.\r\n if (obj.key) {\r\n const strid = stringify(obj.key);\r\n if (lookup[strid]) {\r\n const schemaDefaults = lookup[strid];\r\n if (schemaDefaults) {\r\n Object.keys(schemaDefaults).forEach((attr) => {\r\n if (obj[attr] === undefined) {\r\n obj[attr] = schemaDefaults[attr];\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Are we inheriting readonly?\r\n if (readonly === true) { // Inheriting false is not cool.\r\n obj.readonly = true;\r\n }\r\n\r\n // if it's a type with items, merge 'em!\r\n if (obj.items) {\r\n obj.items = merge(lookup, obj.items, ignore, options, obj.readonly, asyncTemplates);\r\n }\r\n\r\n // if its has tabs, merge them also!\r\n if (obj.tabs) {\r\n obj.tabs.forEach((tab) => {\r\n if (tab.items) {\r\n tab.items = merge(lookup, tab.items, ignore, options, obj.readonly, asyncTemplates);\r\n }\r\n });\r\n }\r\n\r\n // Special case: checkbox\r\n // Since have to ternary state we need a default\r\n if (obj.type === 'checkbox' && obj.schema['default'] === undefined) {\r\n obj.schema['default'] = false;\r\n };\r\n\r\n // Special case: template type with tempplateUrl that's needs to be loaded before rendering\r\n // TODO: this is not a clean solution. Maybe something cleaner can be made when $ref support\r\n // is introduced since we need to go async then anyway\r\n if (asyncTemplates && obj.type === 'template' && !obj.template && obj.templateUrl) {\r\n asyncTemplates.push(obj);\r\n }\r\n\r\n return obj;\r\n });\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/merge.js","import * as JsonRefs from './../../lib/json-refs-standalone';\r\n\r\nexport function jsonref(schema, callBack) {\r\n let promise = new Promise(\r\n function(resolve, reject) {\r\n JsonRefs.resolveRefs(schema, {\r\n \"filter\": [ 'relative', 'local', 'remote' ]\r\n })\r\n .then((res) => { resolve(res.resolved); })\r\n .catch((err) => { reject(new Error(err)); });\r\n }\r\n );\r\n\r\n if(typeof(callBack) === 'function') {\r\n promise\r\n .then((resolved) => { callBack(null, resolved); })\r\n .catch((error) => { callBack(error); });\r\n }\r\n else {\r\n return promise;\r\n }\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/resolve.js","import * as sfPath from './sf-path';\r\n\r\nconst numRe = /^\\d+$/;\r\n\r\n/**\r\n * @description\r\n * Utility method to access deep properties without\r\n * throwing errors when things are not defined.\r\n * Can also set a value in a deep structure, creating objects when missing\r\n * ex.\r\n * var foo = Select('address.contact.name',obj)\r\n * Select('address.contact.name',obj,'Leeroy')\r\n *\r\n * @param {string} projection A dot path to the property you want to get/set\r\n * @param {object} obj (optional) The object to project on, defaults to 'this'\r\n * @param {Any} valueToSet (opional) The value to set, if parts of the path of\r\n * the projection is missing empty objects will be created.\r\n * @returns {Any|undefined} returns the value at the end of the projection path\r\n * or undefined if there is none.\r\n */\r\nexport function select(projection, obj, valueToSet) {\r\n if (!obj) {\r\n obj = this;\r\n };\r\n\r\n // Support [] array syntax\r\n let parts = typeof projection === 'string' ? sfPath.parse(projection) : projection;\r\n\r\n if (typeof valueToSet !== 'undefined' && parts.length === 1) {\r\n // special case, just setting one variable\r\n obj[parts[0]] = valueToSet;\r\n\r\n return obj;\r\n };\r\n\r\n if (typeof valueToSet !== 'undefined' &&\r\n typeof obj[parts[0]] === 'undefined') {\r\n // We need to look ahead to check if array is appropriate\r\n obj[parts[0]] = parts.length > 2 && numRe.test(parts[1]) ? [] : {};\r\n };\r\n\r\n let value = obj[parts[0]];\r\n\r\n for (let i = 1; i < parts.length; i++) {\r\n // Special case: We allow JSON Form syntax for arrays using empty brackets\r\n // These will of course not work here so we exit if they are found.\r\n if (parts[i] === '') {\r\n return undefined;\r\n };\r\n\r\n if (typeof valueToSet !== 'undefined') {\r\n if (i === parts.length - 1) {\r\n // last step. Let's set the value\r\n value[parts[i]] = valueToSet;\r\n return valueToSet;\r\n }\r\n else {\r\n // Make sure to create new objects on the way if they are not there.\r\n // We need to look ahead to check if array is appropriate\r\n let tmp = value[parts[i]];\r\n\r\n if (typeof tmp === 'undefined' || tmp === null) {\r\n tmp = numRe.test(parts[i + 1]) ? [] : {};\r\n value[parts[i]] = tmp;\r\n };\r\n\r\n value = tmp;\r\n };\r\n }\r\n else if (value) {\r\n // Just get nex value.\r\n value = value[parts[i]];\r\n };\r\n };\r\n\r\n return value;\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/select.js","/**\r\n * Traverse a schema, applying a function(schema,path) on every sub schema\r\n * i.e. every property of an object.\r\n */\r\nexport function traverseSchema(schema, fn, path, ignoreArrays) {\r\n ignoreArrays = ignoreArrays === undefined ? true : ignoreArrays;\r\n\r\n path = path || [];\r\n\r\n const traverse = function(schemaObject: any, processorFunction: Function, pathArray: Array) {\r\n processorFunction(schemaObject, pathArray);\r\n if (schemaObject.properties) {\r\n Object.keys(schemaObject.properties).forEach((name) => {\r\n const currentPath = pathArray.slice();\r\n currentPath.push(name);\r\n traverse(schemaObject.properties[name], processorFunction, currentPath);\r\n });\r\n }\r\n\r\n // Only support type \"array\" which have a schemaObject as \"items\".\r\n if (!ignoreArrays && schemaObject.items) {\r\n const arrPath = pathArray.slice(); arrPath.push('');\r\n traverse(schemaObject.items, processorFunction, arrPath);\r\n }\r\n };\r\n\r\n traverse(schema, fn, path || []);\r\n}\r\n\r\nexport function traverseForm(form, fn) {\r\n fn(form);\r\n if (form.items) {\r\n form.items.forEach((f) => {\r\n traverseForm(f, fn);\r\n });\r\n }\r\n\r\n if (form.tabs) {\r\n form.tabs.forEach((tab) => {\r\n if (tab.items) {\r\n tab.items.forEach((f) => {\r\n traverseForm(f, fn);\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/traverse.js","/* Common code for validating a value against its form and schema definition */\r\nimport tv4 from 'tv4';\r\n\r\n/**\r\n * Validate a value against its form definition and schema.\r\n * The value should either be of proper type or a string, some type\r\n * coercion is applied.\r\n *\r\n * @param {Object} form A merged form definition, i.e. one with a schema.\r\n * @param {Any} value the value to validate.\r\n * @return {Object} a tv4js result object.\r\n */\r\nexport function validate(form, value) {\r\n if (!form) {\r\n return { valid: true };\r\n };\r\n\r\n let schema = form.schema;\r\n if (!schema) {\r\n return { valid: true };\r\n };\r\n\r\n // Input of type text and textareas will give us a viewValue of ''\r\n // when empty, this is a valid value in a schema and does not count as something\r\n // that breaks validation of 'required'. But for our own sanity an empty field should\r\n // not validate if it's required.\r\n if (value === '') {\r\n value = undefined;\r\n };\r\n\r\n // Numbers fields will give a null value, which also means empty field\r\n if (form.type === 'number' && value === null) {\r\n value = undefined;\r\n };\r\n\r\n // Version 4 of JSON Schema has the required property not on the\r\n // property itself but on the wrapping object. Since we like to test\r\n // only this property we wrap it in a fake object.\r\n let wrap = { type: 'object', 'properties': {}, required: undefined};\r\n let propName = form.key[form.key.length - 1];\r\n wrap.properties[propName] = schema;\r\n\r\n if (form.required) {\r\n wrap.required = [ propName ];\r\n };\r\n\r\n let valueWrap = {};\r\n if (!!value) {\r\n valueWrap[propName] = value;\r\n };\r\n\r\n return tv4.validateResult(valueWrap, wrap);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/lib/validate.js","'use strict';\n\n;!function(undefined) {\n\n\tvar ObjectPath = {\n\t\tparse: function(str){\n\t\t\tif(typeof str !== 'string'){\n\t\t\t\tthrow new TypeError('ObjectPath.parse must be passed a string');\n\t\t\t}\n\n\t\t\tvar i = 0;\n\t\t\tvar parts = [];\n\t\t\tvar d, b, q, c;\n\t\t\twhile (i < str.length){\n\t\t\t\td = str.indexOf('.', i);\n\t\t\t\tb = str.indexOf('[', i);\n\n\t\t\t\t// we've reached the end\n\t\t\t\tif (d === -1 && b === -1){\n\t\t\t\t\tparts.push(str.slice(i, str.length));\n\t\t\t\t\ti = str.length;\n\t\t\t\t}\n\n\t\t\t\t// dots\n\t\t\t\telse if (b === -1 || (d !== -1 && d < b)) {\n\t\t\t\t\tparts.push(str.slice(i, d));\n\t\t\t\t\ti = d + 1;\n\t\t\t\t}\n\n\t\t\t\t// brackets\n\t\t\t\telse {\n\t\t\t\t\tif (b > i){\n\t\t\t\t\t\tparts.push(str.slice(i, b));\n\t\t\t\t\t\ti = b;\n\t\t\t\t\t}\n\t\t\t\t\tq = str.slice(b+1, b+2);\n\t\t\t\t\tif (q !== '\"' && q !=='\\'') {\n\t\t\t\t\t\tc = str.indexOf(']', b);\n\t\t\t\t\t\tif (c === -1) c = str.length;\n\t\t\t\t\t\tparts.push(str.slice(i + 1, c));\n\t\t\t\t\t\ti = (str.slice(c + 1, c + 2) === '.') ? c + 2 : c + 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc = str.indexOf(q+']', b);\n\t\t\t\t\t\tif (c === -1) c = str.length;\n\t\t\t\t\t\twhile (str.slice(c - 1, c) === '\\\\' && b < str.length){\n\t\t\t\t\t\t\tb++;\n\t\t\t\t\t\t\tc = str.indexOf(q+']', b);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparts.push(str.slice(i + 2, c).replace(new RegExp('\\\\'+q,'g'), q));\n\t\t\t\t\t\ti = (str.slice(c + 2, c + 3) === '.') ? c + 3 : c + 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn parts;\n\t\t},\n\n\t\t// root === true : auto calculate root; must be dot-notation friendly\n\t\t// root String : the string to use as root\n\t\tstringify: function(arr, quote){\n\n\t\t\tif(!Array.isArray(arr))\n\t\t\t\tarr = [arr.toString()];\n\n\t\t\tquote = quote === '\"' ? '\"' : '\\'';\n\n\t\t\treturn arr.map(function(n){ return '[' + quote + (n.toString()).replace(new RegExp(quote, 'g'), '\\\\' + quote) + quote + ']'; }).join('');\n\t\t},\n\n\t\tnormalize: function(data, quote){\n\t\t\treturn ObjectPath.stringify(Array.isArray(data) ? data : ObjectPath.parse(data), quote);\n\t\t},\n\n\t\t// Angular\n\t\tregisterModule: function(angular) {\n\t\t\tangular.module('ObjectPath', []).provider('ObjectPath', function(){\n\t\t\t\tthis.parse = ObjectPath.parse;\n\t\t\t\tthis.stringify = ObjectPath.stringify;\n\t\t\t\tthis.normalize = ObjectPath.normalize;\n\t\t\t\tthis.$get = function(){\n\t\t\t\t\treturn ObjectPath;\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\t};\n\n\t// AMD\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(function() {\n\t\t\treturn {ObjectPath: ObjectPath};\n\t\t});\n\t}\n\n\t// CommonJS\n\telse if (typeof exports === 'object') {\n\t\texports.ObjectPath = ObjectPath;\n\t}\n\n\t// Browser global\n\telse {\n\t\twindow.ObjectPath = ObjectPath;\n\t}\n\t\n}();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/objectpath/lib/ObjectPath.js\n// module id = 11\n// module chunks = 0","module.exports = tv4;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"tv4\"\n// module id = 12\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/json-schema-form-core.min.js b/dist/json-schema-form-core.min.js new file mode 100644 index 0000000..6c3b573 --- /dev/null +++ b/dist/json-schema-form-core.min.js @@ -0,0 +1,9 @@ +/*! + * json-schema-form-core + * @version 1.0.0-alpha.2 + * @date Sun, 19 Feb 2017 12:19:19 GMT + * @link https://github.com/json-schema-form/json-schema-form-core + * @license MIT + * Copyright (c) 2014-2017 JSON Schema Form + */ +module.exports=function(r){function n(t){if(e[t])return e[t].exports;var o=e[t]={i:t,l:!1,exports:{}};return r[t].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var e={};return n.m=r,n.c=e,n.i=function(r){return r},n.d=function(r,e,t){n.o(r,e)||Object.defineProperty(r,e,{configurable:!1,enumerable:!0,get:t})},n.n=function(r){var e=r&&r.__esModule?function(){return r.default}:function(){return r};return n.d(e,"a",e),e},n.o=function(r,n){return Object.prototype.hasOwnProperty.call(r,n)},n.p="",n(n.s=0)}([function(r,n,e){!function(){throw new Error('Cannot find module "C:\\Users\\Marcel\\Documents\\SERIOUS\\git\\json-schema-form-core\\src\\lib\\index"')}()}]); \ No newline at end of file diff --git a/lib/json-refs-standalone.js b/lib/json-refs-standalone.js new file mode 100644 index 0000000..e9ec447 --- /dev/null +++ b/lib/json-refs-standalone.js @@ -0,0 +1,5409 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.JsonRefs = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o -1) { + combinedDetails = u2Details; + } else { + u1Details = isType(u1, 'Undefined') ? undefined : parseURI(u1); + + if (!isType(u1Details, 'Undefined')) { + combinedDetails = u1Details; + + // Join the paths + combinedDetails.path = slash(path.join(u1Details.path, u2Details.path)); + + // Join query parameters + combinedDetails.query = combineQueryParams(u1Details.query, u2Details.query); + } else { + combinedDetails = u2Details; + } + } + + // Remove the fragment + combinedDetails.fragment = undefined; + + // For relative URIs, add back the '..' since it was removed above + return (remoteUriTypes.indexOf(combinedDetails.reference) === -1 && + combinedDetails.path.indexOf('../') === 0 ? '../' : '') + URI.serialize(combinedDetails); +} + +function findAncestors (obj, path) { + var ancestors = []; + var node; + + if (path.length > 0) { + node = obj; + + path.slice(0, path.length - 1).forEach(function (seg) { + if (seg in node) { + node = node[seg]; + + ancestors.push(node); + } + }); + } + + return ancestors; +} + +function processSubDocument (mode, doc, subDocPath, refDetails, options, parents, parentPtrs, allRefs, indirect) { + var refValue; + var rOptions; + + if (subDocPath.length > 0) { + try { + refValue = findValue(doc, subDocPath); + } catch (err) { + // We only mark missing remote references as missing because local references can have deferred values + if (mode === 'remote') { + refDetails.error = err.message; + refDetails.missing = true; + } + } + } else { + refValue = doc; + } + + if (!isType(refValue, 'Undefined')) { + refDetails.value = refValue; + } + + if (isType(refValue, 'Array') || isType(refValue, 'Object')) { + rOptions = clone(options); + + if (mode === 'local') { + delete rOptions.subDocPath; + + // Traverse the dereferenced value + doc = refValue; + } else { + rOptions.relativeBase = path.dirname(parents[parents.length - 1]); + + if (subDocPath.length === 0) { + delete rOptions.subDocPath; + } else { + rOptions.subDocPath = subDocPath; + } + } + + return findRefsRecursive(doc, rOptions, parents, parentPtrs, allRefs, indirect); + } +} + +// Should this be its own exported API? +function findRefsRecursive (obj, options, parents, parentPtrs, allRefs, indirect) { + var allTasks = Promise.resolve(); + var parentPath = parentPtrs.length ? pathFromPtr(parentPtrs[parentPtrs.length - 1]) : []; + var refs = findRefs(obj, options); + var subDocPath = options.subDocPath || []; + var subDocPtr = pathToPtr(subDocPath); + var ancestorPtrs = ['#']; + + parents.forEach(function (parent, index) { + if (parent.charAt(0) !== '#') { + ancestorPtrs.push(parentPtrs[index]); + } + }); + + // Reverse the order so we search them in the proper order + ancestorPtrs.reverse(); + + if ((parents[parents.length - 1] || '').charAt(0) !== '#') { + allRefs.documents[pathToPtr(parentPath)] = obj; + } + + Object.keys(refs).forEach(function (refPtr) { + var refDetails = refs[refPtr]; + var location; + var parentIndex; + var refFullPath; + var refFullPtr; + + // If there are no parents, treat the reference pointer as-is. Otherwise, the reference is a reference within a + // remote document and its sub document path prefix must be removed. + if (parents.length === 0) { + refFullPath = parentPath.concat(pathFromPtr(refPtr)); + } else { + refFullPath = parentPath.concat(pathFromPtr(refPtr).slice(parents.length === 0 ? 0 : subDocPath.length)); + } + + refFullPtr = pathToPtr(refFullPath); + + // It is possible to process the same reference more than once in the event of hierarchical references so we avoid + // processing a reference if we've already done so. + if (!isType(allRefs[refFullPtr], 'Undefined')) { + return; + } + + // Record the reference metadata + allRefs.refs[refFullPtr] = refs[refPtr]; + + // Do not process invalid references + if (isType(refDetails.error, 'Undefined') && refDetails.type !== 'invalid') { + if (remoteTypes.indexOf(refDetails.type) > -1) { + location = combineURIs(options.relativeBase, refDetails.uri); + parentIndex = parents.indexOf(location); + } else { + location = refDetails.uri; + parentIndex = parentPtrs.indexOf(location); + } + + // Record ancestor paths + refDetails.ancestorPtrs = ancestorPtrs; + + // Record if the reference is indirect based on its parent + refDetails.indirect = indirect; + + // Only process non-circular references further + if (parentIndex === -1) { + if (remoteTypes.indexOf(refDetails.type) > -1) { + allTasks = allTasks + .then(function () { + return getRemoteDocument(location, options) + .then(function (doc) { + return processSubDocument('remote', + doc, + isType(refDetails.uriDetails.fragment, 'Undefined') ? + [] : + pathFromPtr(decodeURI(refDetails.uriDetails.fragment)), + refDetails, + options, + parents.concat(location), + parentPtrs.concat(refFullPtr), + allRefs, + indirect); + }) + .catch(function (err) { + refDetails.error = err.message; + refDetails.missing = true; + }); + }); + } else { + if (refFullPtr.indexOf(location + '/') !== 0 && refFullPtr !== location && + subDocPtr.indexOf(location + '/') !== 0 && subDocPtr !== location) { + if (location.indexOf(subDocPtr + '/') !== 0) { + allTasks = allTasks + .then(function () { + return processSubDocument('local', + obj, + pathFromPtr(location), + refDetails, + options, + parents.concat(location), + parentPtrs.concat(refFullPtr), + allRefs, + indirect || (location.indexOf(subDocPtr + '/') === -1 && location !== subDocPtr)); + }); + } + } else { + refDetails.circular = true; + } + } + } else { + // Mark seen ancestors as circular + parentPtrs.slice(parentIndex).forEach(function (parentPtr) { + allRefs.refs[parentPtr].circular = true; + }); + + refDetails.circular = true; + } + } + }); + + allTasks = allTasks + .then(function () { + // Identify indirect, local circular references (Issue 82) + var circulars = []; + var processedRefPtrs = []; + var processedRefs = []; + + function walkRefs (parentPtrs, parentRefs, refPtr, ref) { + Object.keys(allRefs.refs).forEach(function (dRefPtr) { + var dRefDetails = allRefs.refs[dRefPtr]; + + // Do not process already processed references or references that are not a nested references + if (processedRefs.indexOf(ref) === -1 && processedRefPtrs.indexOf(refPtr) === -1 && + circulars.indexOf(ref) === -1 && dRefPtr !== refPtr && dRefPtr.indexOf(ref + '/') === 0) { + if (parentRefs.indexOf(ref) > -1) { + parentRefs.forEach(function (parentRef) { + if (circulars.indexOf(ref) === -1) { + circulars.push(parentRef); + } + }); + } else { + walkRefs(parentPtrs.concat(refPtr), parentRefs.concat(ref), dRefPtr, dRefDetails.uri); + } + + processedRefPtrs.push(refPtr); + processedRefs.push(ref); + } + }); + } + + Object.keys(allRefs.refs).forEach(function (refPtr) { + var refDetails = allRefs.refs[refPtr]; + + // Only process local, non-circular references + if (refDetails.type === 'local' && !refDetails.circular && circulars.indexOf(refDetails.uri) === -1) { + walkRefs([], [], refPtr, refDetails.uri); + } + }); + + Object.keys(allRefs.refs).forEach(function (refPtr) { + var refDetails = allRefs.refs[refPtr]; + + if (circulars.indexOf(refDetails.uri) > -1) { + refDetails.circular = true; + } + }); + }) + .then(function () { + return allRefs; + }); + + return allTasks; +} + +function findValue (obj, path) { + var value = obj; + + path.forEach(function (seg) { + seg = decodeURI(seg); + + if (seg in value) { + value = value[seg]; + } else { + throw Error('JSON Pointer points to missing location: ' + pathToPtr(path)); + } + }); + + return value; +} + +function getExtraRefKeys (ref) { + return Object.keys(ref).filter(function (key) { + return key !== '$ref'; + }); +} + +function getRefType (refDetails) { + var type; + + // Convert the URI reference to one of our types + switch (refDetails.uriDetails.reference) { + case 'absolute': + case 'uri': + type = 'remote'; + break; + case 'same-document': + type = 'local'; + break; + default: + type = refDetails.uriDetails.reference; + } + + return type; +} + +function getRemoteDocument (url, options) { + var cacheEntry = remoteCache[url]; + var allTasks = Promise.resolve(); + var loaderOptions = clone(options.loaderOptions || {}); + + if (isType(cacheEntry, 'Undefined')) { + // If there is no content processor, default to processing the raw response as JSON + if (isType(loaderOptions.processContent, 'Undefined')) { + loaderOptions.processContent = function (res, callback) { + callback(undefined, JSON.parse(res.text)); + }; + } + + // Attempt to load the resource using path-loader + allTasks = PathLoader.load(decodeURI(url), loaderOptions); + + // Update the cache + allTasks = allTasks + .then(function (res) { + remoteCache[url] = { + value: res + }; + + return res; + }) + .catch(function (err) { + remoteCache[url] = { + error: err + }; + + throw err; + }); + } else { + // Return the cached version + allTasks = allTasks.then(function () { + return cacheEntry.value; + }); + } + + // Return a cloned version to avoid updating the cache + allTasks = allTasks.then(function (res) { + return clone(res); + }); + + return allTasks; +} + +function isRefLike (obj, throwWithDetails) { + var refLike = true; + + try { + if (!isType(obj, 'Object')) { + throw new Error('obj is not an Object'); + } else if (!isType(obj.$ref, 'String')) { + throw new Error('obj.$ref is not a String'); + } + } catch (err) { + if (throwWithDetails) { + throw err; + } + + refLike = false; + } + + return refLike; +} + +function isType (obj, type) { + // A PhantomJS bug (https://github.com/ariya/phantomjs/issues/11722) prohibits us from using the same approach for + // undefined checking that we use for other types. + if (type === 'Undefined') { + return typeof obj === 'undefined'; + } else { + return Object.prototype.toString.call(obj) === '[object ' + type + ']'; + } +} + +function makeRefFilter (options) { + var refFilter; + var validTypes; + + if (isType(options.filter, 'Array') || isType(options.filter, 'String')) { + validTypes = isType(options.filter, 'String') ? [options.filter] : options.filter; + refFilter = function (refDetails) { + // Check the exact type or for invalid URIs, check its original type + return validTypes.indexOf(refDetails.type) > -1 || validTypes.indexOf(getRefType(refDetails)) > -1; + }; + } else if (isType(options.filter, 'Function')) { + refFilter = options.filter; + } else if (isType(options.filter, 'Undefined')) { + refFilter = function () { + return true; + }; + } + + return function (refDetails, path) { + return (refDetails.type !== 'invalid' || options.includeInvalid === true) && refFilter(refDetails, path); + }; +} + +function makeSubDocPath (options) { + var subDocPath; + + if (isType(options.subDocPath, 'Array')) { + subDocPath = options.subDocPath; + } else if (isType(options.subDocPath, 'String')) { + subDocPath = pathFromPtr(options.subDocPath); + } else if (isType(options.subDocPath, 'Undefined')) { + subDocPath = []; + } + + return subDocPath; +} + +function parseURI (uri) { + // We decode first to avoid doubly encoding + return URI.parse(encodeURI(decodeURI(uri))); +} + +function setValue (obj, refPath, value) { + findValue(obj, refPath.slice(0, refPath.length - 1))[decodeURI(refPath[refPath.length - 1])] = value; +} + +function walk (ancestors, node, path, fn) { + var processChildren = true; + + function walkItem (item, segment) { + path.push(segment); + walk(ancestors, item, path, fn); + path.pop(); + } + + // Call the iteratee + if (isType(fn, 'Function')) { + processChildren = fn(ancestors, node, path); + } + + // We do not process circular objects again + if (ancestors.indexOf(node) === -1) { + ancestors.push(node); + + if (processChildren !== false) { + if (isType(node, 'Array')) { + node.forEach(function (member, index) { + walkItem(member, index.toString()); + }); + } else if (isType(node, 'Object')) { + Object.keys(node).forEach(function (key) { + walkItem(node[key], key); + }); + } + } + } + + ancestors.pop(); +} + +function validateOptions (options, obj) { + if (isType(options, 'Undefined')) { + // Default to an empty options object + options = {}; + } else { + // Clone the options so we do not alter the ones passed in + options = clone(options); + } + + if (!isType(options, 'Object')) { + throw new TypeError('options must be an Object'); + } else if (!isType(options.filter, 'Undefined') && + !isType(options.filter, 'Array') && + !isType(options.filter, 'Function') && + !isType(options.filter, 'String')) { + throw new TypeError('options.filter must be an Array, a Function of a String'); + } else if (!isType(options.includeInvalid, 'Undefined') && + !isType(options.includeInvalid, 'Boolean')) { + throw new TypeError('options.includeInvalid must be a Boolean'); + } else if (!isType(options.refPreProcessor, 'Undefined') && + !isType(options.refPreProcessor, 'Function')) { + throw new TypeError('options.refPreProcessor must be a Function'); + } else if (!isType(options.refPostProcessor, 'Undefined') && + !isType(options.refPostProcessor, 'Function')) { + throw new TypeError('options.refPostProcessor must be a Function'); + } else if (!isType(options.subDocPath, 'Undefined') && + !isType(options.subDocPath, 'Array') && + !isPtr(options.subDocPath)) { + // If a pointer is provided, throw an error if it's not the proper type + throw new TypeError('options.subDocPath must be an Array of path segments or a valid JSON Pointer'); + } + + options.filter = makeRefFilter(options); + + // Set the subDocPath to avoid everyone else having to compute it + options.subDocPath = makeSubDocPath(options); + + if (!isType(obj, 'Undefined')) { + try { + findValue(obj, options.subDocPath); + } catch (err) { + err.message = err.message.replace('JSON Pointer', 'options.subDocPath'); + + throw err; + } + } + + return options; +} + +/* Module Members */ + +/* + * Each of the functions below are defined as function statements and *then* exported in two steps instead of one due + * to a bug in jsdoc (https://github.com/jsdoc2md/jsdoc-parse/issues/18) that causes our documentation to be + * generated improperly. The impact to the user is significant enough for us to warrant working around it until this + * is fixed. + */ + +/** + * The options used for various JsonRefs APIs. + * + * @typedef {object} JsonRefsOptions + * + * @param {string|string[]|function} [filter=function () {return true;}] - The filter to use when gathering JSON + * References *(If this value is a single string or an array of strings, the value(s) are expected to be the `type(s)` + * you are interested in collecting as described in {@link module:JsonRefs.getRefDetails}. If it is a function, it is + * expected that the function behaves like {@link module:JsonRefs~RefDetailsFilter}.)* + * @param {boolean} [includeInvalid=false] - Whether or not to include invalid JSON Reference details *(This will make + * it so that objects that are like JSON Reference objects, as in they are an `Object` and the have a `$ref` property, + * but fail validation will be included. This is very useful for when you want to know if you have invalid JSON + * Reference definitions. This will not mean that APIs will process invalid JSON References but the reasons as to why + * the JSON References are invalid will be included in the returned metadata.)* + * @param {object} [loaderOptions] - The options to pass to + * {@link https://github.com/whitlockjc/path-loader/blob/master/docs/API.md#module_PathLoader.load|PathLoader~load} + * @param {module:JsonRefs~RefPreProcessor} [refPreProcessor] - The callback used to pre-process a JSON Reference like + * object *(This is called prior to validating the JSON Reference like object and getting its details)* + * @param {module:JsonRefs~RefPostProcessor} [refPostProcessor] - The callback used to post-process the JSON Reference + * metadata *(This is called prior filtering the references)* + * @param {string} [options.relativeBase] - The base location to use when resolving relative references *(Only useful + * for APIs that do remote reference resolution. If this value is not defined, + * {@link https://github.com/whitlockjc/path-loader|path-loader} will use `window.location.href` for the browser and + * `process.cwd()` for Node.js.)* + * @param {string|string[]} [options.subDocPath=[]] - The JSON Pointer or array of path segments to the sub document + * location to search from + */ + +/** + * Simple function used to filter out JSON References. + * + * @typedef {function} RefDetailsFilter + * + * @param {module:JsonRefs~UnresolvedRefDetails} refDetails - The JSON Reference details to test + * @param {string[]} path - The path to the JSON Reference + * + * @returns {boolean} whether the JSON Reference should be filtered *(out)* or not + */ + +/** + * Simple function used to pre-process a JSON Reference like object. + * + * @typedef {function} RefPreProcessor + * + * @param {object} obj - The JSON Reference like object + * @param {string[]} path - The path to the JSON Reference like object + * + * @returns {object} the processed JSON Reference like object + */ + +/** + * Simple function used to post-process a JSON Reference details. + * + * @typedef {function} RefPostProcessor + * + * @param {module:JsonRefs~UnresolvedRefDetails} refDetails - The JSON Reference details to test + * @param {string[]} path - The path to the JSON Reference + * + * @returns {object} the processed JSON Reference details object + */ + +/** + * Detailed information about resolved JSON References. + * + * @typedef {module:JsonRefs~UnresolvedRefDetails} ResolvedRefDetails + * + * @property {boolean} [circular] - Whether or not the JSON Reference is circular *(Will not be set if the JSON + * Reference is not circular)* + * @property {boolean} [missing] - Whether or not the referenced value was missing or not *(Will not be set if the + * referenced value is not missing)* + * @property {*} [value] - The referenced value *(Will not be set if the referenced value is missing)* + */ + +/** + * The results of resolving the JSON References of an array/object. + * + * @typedef {object} ResolvedRefsResults + * + * @property {module:JsonRefs~ResolvedRefDetails} refs - An object whose keys are JSON Pointers *(fragment version)* + * to where the JSON Reference is defined and whose values are {@link module:JsonRefs~ResolvedRefDetails} + * @property {object} resolved - The array/object with its JSON References fully resolved + */ + +/** + * An object containing the retrieved document and detailed information about its JSON References. + * + * @typedef {module:JsonRefs~ResolvedRefsResults} RetrievedRefsResults + * + * @property {object} value - The retrieved document + */ + +/** + * An object containing the retrieved document, the document with its references resolved and detailed information + * about its JSON References. + * + * @typedef {object} RetrievedResolvedRefsResults + * + * @property {module:JsonRefs~UnresolvedRefDetails} refs - An object whose keys are JSON Pointers *(fragment version)* + * to where the JSON Reference is defined and whose values are {@link module:JsonRefs~UnresolvedRefDetails} + * @property {ResolvedRefsResults} - An object whose keys are JSON Pointers *(fragment version)* + * to where the JSON Reference is defined and whose values are {@link module:JsonRefs~ResolvedRefDetails} + * @property {object} value - The retrieved document + */ + +/** + * Detailed information about unresolved JSON References. + * + * @typedef {object} UnresolvedRefDetails + * + * @property {object} def - The JSON Reference definition + * @property {string} [error] - The error information for invalid JSON Reference definition *(Only present when the + * JSON Reference definition is invalid or there was a problem retrieving a remote reference during resolution)* + * @property {string} uri - The URI portion of the JSON Reference + * @property {object} uriDetails - Detailed information about the URI as provided by + * {@link https://github.com/garycourt/uri-js|URI.parse}. + * @property {string} type - The JSON Reference type *(This value can be one of the following: `invalid`, `local`, + * `relative` or `remote`.)* + * @property {string} [warning] - The warning information *(Only present when the JSON Reference definition produces a + * warning)* + */ + +/** + * Clears the internal cache of remote documents, reference details, etc. + * + * @alias module:JsonRefs.clearCache + */ +function clearCache () { + remoteCache = {}; +} + +/** + * Takes an array of path segments and decodes the JSON Pointer tokens in them. + * + * @param {string[]} path - The array of path segments + * + * @returns {string} the array of path segments with their JSON Pointer tokens decoded + * + * @throws {Error} if the path is not an `Array` + * + * @see {@link https://tools.ietf.org/html/rfc6901#section-3} + * + * @alias module:JsonRefs.decodePath + */ +function decodePath (path) { + if (!isType(path, 'Array')) { + throw new TypeError('path must be an array'); + } + + return path.map(function (seg) { + if (!isType(seg, 'String')) { + seg = JSON.stringify(seg); + } + + return decodeURI(seg.replace(/~1/g, '/').replace(/~0/g, '~')); + }); +} + +/** + * Takes an array of path segments and encodes the special JSON Pointer characters in them. + * + * @param {string[]} path - The array of path segments + * + * @returns {string} the array of path segments with their JSON Pointer tokens encoded + * + * @throws {Error} if the path is not an `Array` + * + * @see {@link https://tools.ietf.org/html/rfc6901#section-3} + * + * @alias module:JsonRefs.encodePath + */ +function encodePath (path) { + if (!isType(path, 'Array')) { + throw new TypeError('path must be an array'); + } + + return path.map(function (seg) { + if (!isType(seg, 'String')) { + seg = JSON.stringify(seg); + } + + return seg.replace(/~/g, '~0').replace(/\//g, '~1'); + }); +} + +/** + * Finds JSON References defined within the provided array/object. + * + * @param {array|object} obj - The structure to find JSON References within + * @param {module:JsonRefs~JsonRefsOptions} [options] - The JsonRefs options + * + * @returns {object} an object whose keys are JSON Pointers *(fragment version)* to where the JSON Reference is defined + * and whose values are {@link module:JsonRefs~UnresolvedRefDetails}. + * + * @throws {Error} when the input arguments fail validation or if `options.subDocPath` points to an invalid location + * + * @alias module:JsonRefs.findRefs + * + * @example + * // Finding all valid references + * var allRefs = JsonRefs.findRefs(obj); + * // Finding all remote references + * var remoteRefs = JsonRefs.findRefs(obj, {filter: ['relative', 'remote']}); + * // Finding all invalid references + * var invalidRefs = JsonRefs.findRefs(obj, {filter: 'invalid', includeInvalid: true}); + */ +function findRefs (obj, options) { + var refs = {}; + + // Validate the provided document + if (!isType(obj, 'Array') && !isType(obj, 'Object')) { + throw new TypeError('obj must be an Array or an Object'); + } + + // Validate options + options = validateOptions(options, obj); + + // Walk the document (or sub document) and find all JSON References + walk(findAncestors(obj, options.subDocPath), + findValue(obj, options.subDocPath), + clone(options.subDocPath), + function (ancestors, node, path) { + var processChildren = true; + var refDetails; + + if (isRefLike(node)) { + // Pre-process the node when necessary + if (!isType(options.refPreProcessor, 'Undefined')) { + node = options.refPreProcessor(clone(node), path); + } + + refDetails = getRefDetails(node); + + // Post-process the reference details + if (!isType(options.refPostProcessor, 'Undefined')) { + refDetails = options.refPostProcessor(refDetails, path); + } + + if (options.filter(refDetails, path)) { + refs[pathToPtr(path)] = refDetails; + } + + // Whenever a JSON Reference has extra children, its children should not be processed. + // See: http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03#section-3 + if (getExtraRefKeys(node).length > 0) { + processChildren = false; + } + } + + return processChildren; + }); + + return refs; +} + +/** + * Finds JSON References defined within the document at the provided location. + * + * This API is identical to {@link module:JsonRefs.findRefs} except this API will retrieve a remote document and then + * return the result of {@link module:JsonRefs.findRefs} on the retrieved document. + * + * @param {string} location - The location to retrieve *(Can be relative or absolute, just make sure you look at the + * {@link module:JsonRefs~JsonRefsOptions|options documentation} to see how relative references are handled.)* + * @param {module:JsonRefs~JsonRefsOptions} [options] - The JsonRefs options + * + * @returns {Promise} a promise that resolves a {@link module:JsonRefs~RetrievedRefsResults} and rejects with an + * `Error` when the input arguments fail validation, when `options.subDocPath` points to an invalid location or when + * the location argument points to an unloadable resource + * + * @alias module:JsonRefs.findRefsAt + * + * @example + * // Example that only resolves references within a sub document + * JsonRefs.findRefsAt('http://petstore.swagger.io/v2/swagger.json', { + * subDocPath: '#/definitions' + * }) + * .then(function (res) { + * // Do something with the response + * // + * // res.refs: JSON Reference locations and details + * // res.value: The retrieved document + * }, function (err) { + * console.log(err.stack); + * }); + */ +function findRefsAt (location, options) { + var allTasks = Promise.resolve(); + + allTasks = allTasks + .then(function () { + // Validate the provided location + if (!isType(location, 'String')) { + throw new TypeError('location must be a string'); + } + + // Validate options + options = validateOptions(options); + + // Combine the location and the optional relative base + location = combineURIs(options.relativeBase, location); + + return getRemoteDocument(location, options); + }) + .then(function (res) { + var cacheEntry = clone(remoteCache[location]); + var cOptions = clone(options); + var uriDetails = parseURI(location); + + if (isType(cacheEntry.refs, 'Undefined')) { + // Do not filter any references so the cache is complete + delete cOptions.filter; + delete cOptions.subDocPath; + + cOptions.includeInvalid = true; + + remoteCache[location].refs = findRefs(res, cOptions); + } + + // Add the filter options back + if (!isType(options.filter, 'Undefined')) { + cOptions.filter = options.filter; + } + + if (!isType(uriDetails.fragment, 'Undefined')) { + cOptions.subDocPath = pathFromPtr(decodeURI(uriDetails.fragment)); + } else if (!isType(uriDetails.subDocPath, 'Undefined')) { + cOptions.subDocPath = options.subDocPath; + } + + // This will use the cache so don't worry about calling it twice + return { + refs: findRefs(res, cOptions), + value: res + }; + }); + + return allTasks; +} + +/** + * Returns detailed information about the JSON Reference. + * + * @param {object} obj - The JSON Reference definition + * + * @returns {module:JsonRefs~UnresolvedRefDetails} the detailed information + * + * @alias module:JsonRefs.getRefDetails + */ +function getRefDetails (obj) { + var details = { + def: obj + }; + var cacheKey; + var extraKeys; + var uriDetails; + + try { + if (isRefLike(obj, true)) { + cacheKey = obj.$ref; + uriDetails = uriDetailsCache[cacheKey]; + + if (isType(uriDetails, 'Undefined')) { + uriDetails = uriDetailsCache[cacheKey] = parseURI(cacheKey); + } + + details.uri = cacheKey; + details.uriDetails = uriDetails; + + if (isType(uriDetails.error, 'Undefined')) { + details.type = getRefType(details); + } else { + details.error = details.uriDetails.error; + details.type = 'invalid'; + } + + // Identify warning + extraKeys = getExtraRefKeys(obj); + + if (extraKeys.length > 0) { + details.warning = 'Extra JSON Reference properties will be ignored: ' + extraKeys.join(', '); + } + } else { + details.type = 'invalid'; + } + } catch (err) { + details.error = err.message; + details.type = 'invalid'; + } + + return details; +} + +/** + * Returns whether the argument represents a JSON Pointer. + * + * A string is a JSON Pointer if the following are all true: + * + * * The string is of type `String` + * * The string must be empty, `#` or start with a `/` or `#/` + * + * @param {string} ptr - The string to check + * @param {boolean} [throwWithDetails=false] - Whether or not to throw an `Error` with the details as to why the value + * provided is invalid + * + * @returns {boolean} the result of the check + * + * @throws {error} when the provided value is invalid and the `throwWithDetails` argument is `true` + * + * @alias module:JsonRefs.isPtr + * + * @see {@link https://tools.ietf.org/html/rfc6901#section-3} + * + * @example + * // Separating the different ways to invoke isPtr for demonstration purposes + * if (isPtr(str)) { + * // Handle a valid JSON Pointer + * } else { + * // Get the reason as to why the value is not a JSON Pointer so you can fix/report it + * try { + * isPtr(str, true); + * } catch (err) { + * // The error message contains the details as to why the provided value is not a JSON Pointer + * } + * } + */ +function isPtr (ptr, throwWithDetails) { + var valid = true; + var firstChar; + + try { + if (isType(ptr, 'String')) { + if (ptr !== '') { + firstChar = ptr.charAt(0); + + if (['#', '/'].indexOf(firstChar) === -1) { + throw new Error('ptr must start with a / or #/'); + } else if (firstChar === '#' && ptr !== '#' && ptr.charAt(1) !== '/') { + throw new Error('ptr must start with a / or #/'); + } else if (ptr.match(badPtrTokenRegex)) { + throw new Error('ptr has invalid token(s)'); + } + } + } else { + throw new Error('ptr is not a String'); + } + } catch (err) { + if (throwWithDetails === true) { + throw err; + } + + valid = false; + } + + return valid; +} + +/** + * Returns whether the argument represents a JSON Reference. + * + * An object is a JSON Reference only if the following are all true: + * + * * The object is of type `Object` + * * The object has a `$ref` property + * * The `$ref` property is a valid URI *(We do not require 100% strict URIs and will handle unescaped special + * characters.)* + * + * @param {object} obj - The object to check + * @param {boolean} [throwWithDetails=false] - Whether or not to throw an `Error` with the details as to why the value + * provided is invalid + * + * @returns {boolean} the result of the check + * + * @throws {error} when the provided value is invalid and the `throwWithDetails` argument is `true` + * + * @alias module:JsonRefs.isRef + * + * @see {@link http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03#section-3} + * + * @example + * // Separating the different ways to invoke isRef for demonstration purposes + * if (isRef(obj)) { + * // Handle a valid JSON Reference + * } else { + * // Get the reason as to why the value is not a JSON Reference so you can fix/report it + * try { + * isRef(str, true); + * } catch (err) { + * // The error message contains the details as to why the provided value is not a JSON Reference + * } + * } + */ +function isRef (obj, throwWithDetails) { + return isRefLike(obj, throwWithDetails) && getRefDetails(obj, throwWithDetails).type !== 'invalid'; +} + +/** + * Returns an array of path segments for the provided JSON Pointer. + * + * @param {string} ptr - The JSON Pointer + * + * @returns {string[]} the path segments + * + * @throws {Error} if the provided `ptr` argument is not a JSON Pointer + * + * @alias module:JsonRefs.pathFromPtr + */ +function pathFromPtr (ptr) { + if (!isPtr(ptr)) { + throw new Error('ptr must be a JSON Pointer'); + } + + var segments = ptr.split('/'); + + // Remove the first segment + segments.shift(); + + return decodePath(segments); +} + +/** + * Returns a JSON Pointer for the provided array of path segments. + * + * **Note:** If a path segment in `path` is not a `String`, it will be converted to one using `JSON.stringify`. + * + * @param {string[]} path - The array of path segments + * @param {boolean} [hashPrefix=true] - Whether or not create a hash-prefixed JSON Pointer + * + * @returns {string} the corresponding JSON Pointer + * + * @throws {Error} if the `path` argument is not an array + * + * @alias module:JsonRefs.pathToPtr + */ +function pathToPtr (path, hashPrefix) { + if (!isType(path, 'Array')) { + throw new Error('path must be an Array'); + } + + // Encode each segment and return + return (hashPrefix !== false ? '#' : '') + (path.length > 0 ? '/' : '') + encodePath(path).join('/'); +} + +/** + * Finds JSON References defined within the provided array/object and resolves them. + * + * @param {array|object} obj - The structure to find JSON References within + * @param {module:JsonRefs~JsonRefsOptions} [options] - The JsonRefs options + * + * @returns {Promise} a promise that resolves a {@link module:JsonRefs~ResolvedRefsResults} and rejects with an + * `Error` when the input arguments fail validation, when `options.subDocPath` points to an invalid location or when + * the location argument points to an unloadable resource + * + * @alias module:JsonRefs.resolveRefs + * + * @example + * // Example that only resolves relative and remote references + * JsonRefs.resolveRefs(swaggerObj, { + * filter: ['relative', 'remote'] + * }) + * .then(function (res) { + * // Do something with the response + * // + * // res.refs: JSON Reference locations and details + * // res.resolved: The document with the appropriate JSON References resolved + * }, function (err) { + * console.log(err.stack); + * }); + */ +function resolveRefs (obj, options) { + var allTasks = Promise.resolve(); + + allTasks = allTasks + .then(function () { + // Validate the provided document + if (!isType(obj, 'Array') && !isType(obj, 'Object')) { + throw new TypeError('obj must be an Array or an Object'); + } + + // Validate options + options = validateOptions(options, obj); + + // Clone the input so we do not alter it + obj = clone(obj); + }) + .then(function () { + return findRefsRecursive(obj, options, [], [], { + documents: {}, + refs: {} + }); + }) + .then(function (allRefs) { + var deferredRefs = {}; + var refs = {}; + + function pathSorter (p1, p2) { + return pathFromPtr(p1).length - pathFromPtr(p2).length; + } + + // Resolve all references with a known value + Object.keys(allRefs.refs).sort(pathSorter).forEach(function (refPtr) { + var refDetails = allRefs.refs[refPtr]; + + // Record all direct references + if (!refDetails.indirect) { + refs[refPtr] = refDetails; + } + + // Delete helper property + delete refDetails.indirect; + + if (isType(refDetails.error, 'Undefined') && refDetails.type !== 'invalid') { + if (isType(refDetails.value, 'Undefined') && refDetails.circular) { + refDetails.value = refDetails.def; + } + + // We defer processing all references without a value until later + if (isType(refDetails.value, 'Undefined')) { + deferredRefs[refPtr] = refDetails; + } else { + if (refPtr === '#') { + obj = refDetails.value; + } else { + setValue(obj, pathFromPtr(refPtr), refDetails.value); + } + + // Delete helper property + delete refDetails.ancestorPtrs; + } + } else { + // Delete helper property + delete refDetails.ancestorPtrs; + } + }); + + // Resolve all deferred references + Object.keys(deferredRefs).forEach(function (refPtr) { + var refDetails = deferredRefs[refPtr]; + + // Attempt to resolve the value against all if its ancestors in order + refDetails.ancestorPtrs.forEach(function (ancestorPtr, index) { + if (isType(refDetails.value, 'Undefined')) { + try { + refDetails.value = findValue(allRefs.documents[ancestorPtr], pathFromPtr(refDetails.uri)); + + // Delete helper property + delete refDetails.ancestorPtrs; + + setValue(obj, pathFromPtr(refPtr), refDetails.value); + } catch (err) { + if (index === refDetails.ancestorPtrs.length - 1) { + refDetails.error = err.message; + refDetails.missing = true; + + // Delete helper property + delete refDetails.ancestorPtrs; + } + } + } + }); + }); + + return { + refs: refs, + resolved: obj + }; + }); + + return allTasks; +} + +/** + * Resolves JSON References defined within the document at the provided location. + * + * This API is identical to {@link module:JsonRefs.resolveRefs} except this API will retrieve a remote document and then + * return the result of {@link module:JsonRefs.resolveRefs} on the retrieved document. + * + * @param {string} location - The location to retrieve *(Can be relative or absolute, just make sure you look at the + * {@link module:JsonRefs~JsonRefsOptions|options documentation} to see how relative references are handled.)* + * @param {module:JsonRefs~JsonRefsOptions} [options] - The JsonRefs options + * + * @returns {Promise} a promise that resolves a {@link module:JsonRefs~RetrievedResolvedRefsResults} and rejects with an + * `Error` when the input arguments fail validation, when `options.subDocPath` points to an invalid location or when + * the location argument points to an unloadable resource + * + * @alias module:JsonRefs.resolveRefsAt + * + * @example + * // Example that loads a JSON document (No options.loaderOptions.processContent required) and resolves all references + * JsonRefs.resolveRefsAt('./swagger.json') + * .then(function (res) { + * // Do something with the response + * // + * // res.refs: JSON Reference locations and details + * // res.resolved: The document with the appropriate JSON References resolved + * // res.value: The retrieved document + * }, function (err) { + * console.log(err.stack); + * }); + */ +function resolveRefsAt (location, options) { + var allTasks = Promise.resolve(); + + allTasks = allTasks + .then(function () { + // Validate the provided location + if (!isType(location, 'String')) { + throw new TypeError('location must be a string'); + } + + // Validate options + options = validateOptions(options); + + // Combine the location and the optional relative base + location = combineURIs(options.relativeBase, location); + + return getRemoteDocument(location, options); + }) + .then(function (res) { + var cOptions = clone(options); + var uriDetails = parseURI(location); + + // Set the sub document path if necessary + if (!isType(uriDetails.fragment, 'Undefined')) { + cOptions.subDocPath = pathFromPtr(decodeURI(uriDetails.fragment)); + } + + // Update the relative base based on the retrieved location + cOptions.relativeBase = path.dirname(location); + + return resolveRefs(res, cOptions) + .then(function (res2) { + return { + refs: res2.refs, + resolved: res2.resolved, + value: res + }; + }); + }); + + return allTasks; +} + +/* Export the module members */ +module.exports.clearCache = clearCache; +module.exports.decodePath = decodePath; +module.exports.encodePath = encodePath; +module.exports.findRefs = findRefs; +module.exports.findRefsAt = findRefsAt; +module.exports.getRefDetails = getRefDetails; +module.exports.isPtr = isPtr; +module.exports.isRef = isRef; +module.exports.pathFromPtr = pathFromPtr; +module.exports.pathToPtr = pathToPtr; +module.exports.resolveRefs = resolveRefs; +module.exports.resolveRefsAt = resolveRefsAt; + +},{"native-promise-only":3,"path":4,"path-loader":5,"querystring":11,"slash":13,"uri-js":23}],2:[function(require,module,exports){ + +/** + * Expose `Emitter`. + */ + +module.exports = Emitter; + +/** + * Initialize a new `Emitter`. + * + * @api public + */ + +function Emitter(obj) { + if (obj) return mixin(obj); +}; + +/** + * Mixin the emitter properties. + * + * @param {Object} obj + * @return {Object} + * @api private + */ + +function mixin(obj) { + for (var key in Emitter.prototype) { + obj[key] = Emitter.prototype[key]; + } + return obj; +} + +/** + * Listen on the given `event` with `fn`. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.on = +Emitter.prototype.addEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + (this._callbacks['$' + event] = this._callbacks['$' + event] || []) + .push(fn); + return this; +}; + +/** + * Adds an `event` listener that will be invoked a single + * time then automatically removed. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.once = function(event, fn){ + function on() { + this.off(event, on); + fn.apply(this, arguments); + } + + on.fn = fn; + this.on(event, on); + return this; +}; + +/** + * Remove the given callback for `event` or all + * registered callbacks. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.off = +Emitter.prototype.removeListener = +Emitter.prototype.removeAllListeners = +Emitter.prototype.removeEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + + // all + if (0 == arguments.length) { + this._callbacks = {}; + return this; + } + + // specific event + var callbacks = this._callbacks['$' + event]; + if (!callbacks) return this; + + // remove all handlers + if (1 == arguments.length) { + delete this._callbacks['$' + event]; + return this; + } + + // remove specific handler + var cb; + for (var i = 0; i < callbacks.length; i++) { + cb = callbacks[i]; + if (cb === fn || cb.fn === fn) { + callbacks.splice(i, 1); + break; + } + } + return this; +}; + +/** + * Emit `event` with the given args. + * + * @param {String} event + * @param {Mixed} ... + * @return {Emitter} + */ + +Emitter.prototype.emit = function(event){ + this._callbacks = this._callbacks || {}; + var args = [].slice.call(arguments, 1) + , callbacks = this._callbacks['$' + event]; + + if (callbacks) { + callbacks = callbacks.slice(0); + for (var i = 0, len = callbacks.length; i < len; ++i) { + callbacks[i].apply(this, args); + } + } + + return this; +}; + +/** + * Return array of callbacks for `event`. + * + * @param {String} event + * @return {Array} + * @api public + */ + +Emitter.prototype.listeners = function(event){ + this._callbacks = this._callbacks || {}; + return this._callbacks['$' + event] || []; +}; + +/** + * Check if this emitter has `event` handlers. + * + * @param {String} event + * @return {Boolean} + * @api public + */ + +Emitter.prototype.hasListeners = function(event){ + return !! this.listeners(event).length; +}; + +},{}],3:[function(require,module,exports){ +(function (global){ +/*! Native Promise Only + v0.8.1 (c) Kyle Simpson + MIT License: http://getify.mit-license.org +*/ + +(function UMD(name,context,definition){ + // special form of UMD for polyfilling across evironments + context[name] = context[name] || definition(); + if (typeof module != "undefined" && module.exports) { module.exports = context[name]; } + else if (typeof define == "function" && define.amd) { define(function $AMD$(){ return context[name]; }); } +})("Promise",typeof global != "undefined" ? global : this,function DEF(){ + /*jshint validthis:true */ + "use strict"; + + var builtInProp, cycle, scheduling_queue, + ToString = Object.prototype.toString, + timer = (typeof setImmediate != "undefined") ? + function timer(fn) { return setImmediate(fn); } : + setTimeout + ; + + // dammit, IE8. + try { + Object.defineProperty({},"x",{}); + builtInProp = function builtInProp(obj,name,val,config) { + return Object.defineProperty(obj,name,{ + value: val, + writable: true, + configurable: config !== false + }); + }; + } + catch (err) { + builtInProp = function builtInProp(obj,name,val) { + obj[name] = val; + return obj; + }; + } + + // Note: using a queue instead of array for efficiency + scheduling_queue = (function Queue() { + var first, last, item; + + function Item(fn,self) { + this.fn = fn; + this.self = self; + this.next = void 0; + } + + return { + add: function add(fn,self) { + item = new Item(fn,self); + if (last) { + last.next = item; + } + else { + first = item; + } + last = item; + item = void 0; + }, + drain: function drain() { + var f = first; + first = last = cycle = void 0; + + while (f) { + f.fn.call(f.self); + f = f.next; + } + } + }; + })(); + + function schedule(fn,self) { + scheduling_queue.add(fn,self); + if (!cycle) { + cycle = timer(scheduling_queue.drain); + } + } + + // promise duck typing + function isThenable(o) { + var _then, o_type = typeof o; + + if (o != null && + ( + o_type == "object" || o_type == "function" + ) + ) { + _then = o.then; + } + return typeof _then == "function" ? _then : false; + } + + function notify() { + for (var i=0; i 0) { + schedule(notify,self); + } + } + } + catch (err) { + reject.call(new MakeDefWrapper(self),err); + } + } + + function reject(msg) { + var self = this; + + // already triggered? + if (self.triggered) { return; } + + self.triggered = true; + + // unwrap + if (self.def) { + self = self.def; + } + + self.msg = msg; + self.state = 2; + if (self.chain.length > 0) { + schedule(notify,self); + } + } + + function iteratePromises(Constructor,arr,resolver,rejecter) { + for (var idx=0; idx 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// Split a filename into [root, dir, basename, ext], unix version +// 'root' is just a slash, or nothing. +var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; +var splitPath = function(filename) { + return splitPathRe.exec(filename).slice(1); +}; + +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; + +// path.normalize(path) +// posix version +exports.normalize = function(path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; + + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; + +// posix version +exports.isAbsolute = function(path) { + return path.charAt(0) === '/'; +}; + +// posix version +exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function(p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + return p; + }).join('/')); +}; + + +// path.relative(from, to) +// posix version +exports.relative = function(from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); +}; + +exports.sep = '/'; +exports.delimiter = ':'; + +exports.dirname = function(path) { + var result = splitPath(path), + root = result[0], + dir = result[1]; + + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + + return root + dir; +}; + + +exports.basename = function(path, ext) { + var f = splitPath(path)[2]; + // TODO: make this comparison case-insensitive on windows? + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + + +exports.extname = function(path) { + return splitPath(path)[3]; +}; + +function filter (xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; +} + +// String.prototype.substr - negative index don't work in IE8 +var substr = 'ab'.substr(-1) === 'b' + ? function (str, start, len) { return str.substr(start, len) } + : function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + } +; + +}).call(this,require('_process')) + +},{"_process":8}],5:[function(require,module,exports){ +/* + * The MIT License (MIT) + * + * Copyright (c) 2015 Jeremy Whitlock + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +'use strict'; + +/** + * Utility that provides a single API for loading the content of a path/URL. + * + * @module PathLoader + */ + +var supportedLoaders = { + file: require('./lib/loaders/file'), + http: require('./lib/loaders/http'), + https: require('./lib/loaders/http') +}; +var defaultLoader = typeof window === 'object' || typeof importScripts === 'function' ? + supportedLoaders.http : + supportedLoaders.file; + +// Load promises polyfill if necessary +/* istanbul ignore if */ +if (typeof Promise === 'undefined') { + require('native-promise-only'); +} + +function getScheme (location) { + if (typeof location !== 'undefined') { + location = location.indexOf('://') === -1 ? '' : location.split('://')[0]; + } + + return location; +} + +/** + * Callback used to provide access to altering a remote request prior to the request being made. + * + * @typedef {function} PrepareRequestCallback + * + * @param {object} req - The Superagent request object + * @param {string} location - The location being retrieved + * @param {function} callback - First callback + * + * @alias module:PathLoader~PrepareRequestCallback + */ + + /** + * Callback used to provide access to processing the raw response of the request being made. *(HTTP loader only)* + * + * @typedef {function} ProcessResponseCallback + * + * @param {object} res - The Superagent response object *(For non-HTTP loaders, this object will be like the Superagent + * object in that it will have a `text` property whose value is the raw string value being processed. This was done + * for consistency.)* + * @param {function} callback - Error-first callback + * + * @returns {*} the result of processing the responsexs + * + * @alias module:PathLoader~ProcessResponseCallback + */ + +function getLoader (location) { + var scheme = getScheme(location); + var loader = supportedLoaders[scheme]; + + if (typeof loader === 'undefined') { + if (scheme === '') { + loader = defaultLoader; + } else { + throw new Error('Unsupported scheme: ' + scheme); + } + } + + return loader; +} + +/** + * Loads a document at the provided location and returns a JavaScript object representation. + * + * @param {object} location - The location to the document + * @param {object} [options] - The options + * @param {string} [options.encoding='utf-8'] - The encoding to use when loading the file *(File loader only)* + * @param {string} [options.method=get] - The HTTP method to use for the request *(HTTP loader only)* + * @param {module:PathLoader~PrepareRequestCallback} [options.prepareRequest] - The callback used to prepare the request + * *(HTTP loader only)* + * @param {module:PathLoader~ProcessResponseCallback} [options.processContent] - The callback used to process the + * response + * + * @returns {Promise} Always returns a promise even if there is a callback provided + * + * @example + * // Example using Promises + * + * PathLoader + * .load('./package.json') + * .then(JSON.parse) + * .then(function (document) { + * console.log(document.name + ' (' + document.version + '): ' + document.description); + * }, function (err) { + * console.error(err.stack); + * }); + * + * @example + * // Example using options.prepareRequest to provide authentication details for a remotely secure URL + * + * PathLoader + * .load('https://api.github.com/repos/whitlockjc/path-loader', { + * prepareRequest: function (req, callback) { + * req.auth('my-username', 'my-password'); + * callback(undefined, req); + * } + * }) + * .then(JSON.parse) + * .then(function (document) { + * console.log(document.full_name + ': ' + document.description); + * }, function (err) { + * console.error(err.stack); + * }); + * + * @example + * // Example loading a YAML file + * + * PathLoader + * .load('/Users/not-you/projects/path-loader/.travis.yml') + * .then(YAML.safeLoad) + * .then(function (document) { + * console.log('path-loader uses the', document.language, 'language.'); + * }, function (err) { + * console.error(err.stack); + * }); + * + * @example + * // Example loading a YAML file with options.processContent (Useful if you need information in the raw response) + * + * PathLoader + * .load('/Users/not-you/projects/path-loader/.travis.yml', { + * processContent: function (res, callback) { + * callback(YAML.safeLoad(res.text)); + * } + * }) + * .then(function (document) { + * console.log('path-loader uses the', document.language, 'language.'); + * }, function (err) { + * console.error(err.stack); + * }); + */ +module.exports.load = function (location, options) { + var allTasks = Promise.resolve(); + + // Default options to empty object + if (typeof options === 'undefined') { + options = {}; + } + + // Validate arguments + allTasks = allTasks.then(function () { + if (typeof location === 'undefined') { + throw new TypeError('location is required'); + } else if (typeof location !== 'string') { + throw new TypeError('location must be a string'); + } + + if (typeof options !== 'undefined') { + if (typeof options !== 'object') { + throw new TypeError('options must be an object'); + } else if (typeof options.processContent !== 'undefined' && typeof options.processContent !== 'function') { + throw new TypeError('options.processContent must be a function'); + } + } + }); + + // Load the document from the provided location and process it + allTasks = allTasks + .then(function () { + return new Promise(function (resolve, reject) { + var loader = getLoader(location); + + loader.load(location, options || {}, function (err, document) { + if (err) { + reject(err); + } else { + resolve(document); + } + }); + }); + }) + .then(function (res) { + if (options.processContent) { + return new Promise(function (resolve, reject) { + // For consistency between file and http, always send an object with a 'text' property containing the raw + // string value being processed. + options.processContent(typeof res === 'object' ? res : {text: res}, function (err, processed) { + if (err) { + reject(err); + } else { + resolve(processed); + } + }); + }); + } else { + // If there was no content processor, we will assume that for all objects that it is a Superagent response + // and will return its `text` property value. Otherwise, we will return the raw response. + return typeof res === 'object' ? res.text : res; + } + }); + + return allTasks; +}; + +},{"./lib/loaders/file":6,"./lib/loaders/http":7,"native-promise-only":3}],6:[function(require,module,exports){ +/* + * The MIT License (MIT) + * + * Copyright (c) 2015 Jeremy Whitlock + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +'use strict'; + +var unsupportedError = new TypeError('The \'file\' scheme is not supported in the browser'); + +/** + * The file loader is not supported in the browser. + * + * @throws {error} the file loader is not supported in the browser + */ +module.exports.getBase = function () { + throw unsupportedError; +}; + +/** + * The file loader is not supported in the browser. + */ +module.exports.load = function () { + var fn = arguments[arguments.length - 1]; + + if (typeof fn === 'function') { + fn(unsupportedError); + } else { + throw unsupportedError; + } +}; + +},{}],7:[function(require,module,exports){ +/* eslint-env node, browser */ + +/* + * The MIT License (MIT) + * + * Copyright (c) 2015 Jeremy Whitlock + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +'use strict'; + +var request = require('superagent'); + +var supportedHttpMethods = ['delete', 'get', 'head', 'patch', 'post', 'put']; + +/** + * Loads a file from an http or https URL. + * + * @param {string} location - The document URL (If relative, location is relative to window.location.origin). + * @param {object} options - The loader options + * @param {string} [options.method=get] - The HTTP method to use for the request + * @param {module:PathLoader~PrepareRequestCallback} [options.prepareRequest] - The callback used to prepare a request + * @param {module:PathLoader~ProcessResponseCallback} [options.processContent] - The callback used to process the + * response + * @param {function} callback - The error-first callback + */ +module.exports.load = function (location, options, callback) { + var realMethod = options.method ? options.method.toLowerCase() : 'get'; + var err; + var realRequest; + + function makeRequest (err, req) { + if (err) { + callback(err); + } else { + // buffer() is only available in Node.js + if (typeof req.buffer === 'function') { + req.buffer(true); + } + + req + .end(function (err2, res) { + if (err2) { + callback(err2); + } else { + callback(undefined, res); + } + }); + } + } + + if (typeof options.method !== 'undefined') { + if (typeof options.method !== 'string') { + err = new TypeError('options.method must be a string'); + } else if (supportedHttpMethods.indexOf(options.method) === -1) { + err = new TypeError('options.method must be one of the following: ' + + supportedHttpMethods.slice(0, supportedHttpMethods.length - 1).join(', ') + ' or ' + + supportedHttpMethods[supportedHttpMethods.length - 1]); + } + } else if (typeof options.prepareRequest !== 'undefined' && typeof options.prepareRequest !== 'function') { + err = new TypeError('options.prepareRequest must be a function'); + } + + if (!err) { + realRequest = request[realMethod === 'delete' ? 'del' : realMethod](location); + + if (options.prepareRequest) { + try { + options.prepareRequest(realRequest, makeRequest); + } catch (err2) { + callback(err2); + } + } else { + makeRequest(undefined, realRequest); + } + } else { + callback(err); + } +}; + +},{"superagent":14}],8:[function(require,module,exports){ +// shim for using process in browser + +var process = module.exports = {}; +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = setTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + clearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + setTimeout(drainQueue, 0); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],9:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +// If obj.hasOwnProperty has been overridden, then calling +// obj.hasOwnProperty(prop) will break. +// See: https://github.com/joyent/node/issues/1707 +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +module.exports = function(qs, sep, eq, options) { + sep = sep || '&'; + eq = eq || '='; + var obj = {}; + + if (typeof qs !== 'string' || qs.length === 0) { + return obj; + } + + var regexp = /\+/g; + qs = qs.split(sep); + + var maxKeys = 1000; + if (options && typeof options.maxKeys === 'number') { + maxKeys = options.maxKeys; + } + + var len = qs.length; + // maxKeys <= 0 means that we should not limit keys count + if (maxKeys > 0 && len > maxKeys) { + len = maxKeys; + } + + for (var i = 0; i < len; ++i) { + var x = qs[i].replace(regexp, '%20'), + idx = x.indexOf(eq), + kstr, vstr, k, v; + + if (idx >= 0) { + kstr = x.substr(0, idx); + vstr = x.substr(idx + 1); + } else { + kstr = x; + vstr = ''; + } + + k = decodeURIComponent(kstr); + v = decodeURIComponent(vstr); + + if (!hasOwnProperty(obj, k)) { + obj[k] = v; + } else if (isArray(obj[k])) { + obj[k].push(v); + } else { + obj[k] = [obj[k], v]; + } + } + + return obj; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +},{}],10:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +var stringifyPrimitive = function(v) { + switch (typeof v) { + case 'string': + return v; + + case 'boolean': + return v ? 'true' : 'false'; + + case 'number': + return isFinite(v) ? v : ''; + + default: + return ''; + } +}; + +module.exports = function(obj, sep, eq, name) { + sep = sep || '&'; + eq = eq || '='; + if (obj === null) { + obj = undefined; + } + + if (typeof obj === 'object') { + return map(objectKeys(obj), function(k) { + var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; + if (isArray(obj[k])) { + return map(obj[k], function(v) { + return ks + encodeURIComponent(stringifyPrimitive(v)); + }).join(sep); + } else { + return ks + encodeURIComponent(stringifyPrimitive(obj[k])); + } + }).join(sep); + + } + + if (!name) return ''; + return encodeURIComponent(stringifyPrimitive(name)) + eq + + encodeURIComponent(stringifyPrimitive(obj)); +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +function map (xs, f) { + if (xs.map) return xs.map(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + res.push(f(xs[i], i)); + } + return res; +} + +var objectKeys = Object.keys || function (obj) { + var res = []; + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); + } + return res; +}; + +},{}],11:[function(require,module,exports){ +'use strict'; + +exports.decode = exports.parse = require('./decode'); +exports.encode = exports.stringify = require('./encode'); + +},{"./decode":9,"./encode":10}],12:[function(require,module,exports){ + +/** + * Reduce `arr` with `fn`. + * + * @param {Array} arr + * @param {Function} fn + * @param {Mixed} initial + * + * TODO: combatible error handling? + */ + +module.exports = function(arr, fn, initial){ + var idx = 0; + var len = arr.length; + var curr = arguments.length == 3 + ? initial + : arr[idx++]; + + while (idx < len) { + curr = fn.call(null, curr, arr[idx], ++idx, arr); + } + + return curr; +}; +},{}],13:[function(require,module,exports){ +'use strict'; +module.exports = function (str) { + var isExtendedLengthPath = /^\\\\\?\\/.test(str); + var hasNonAscii = /[^\x00-\x80]+/.test(str); + + if (isExtendedLengthPath || hasNonAscii) { + return str; + } + + return str.replace(/\\/g, '/'); +}; + +},{}],14:[function(require,module,exports){ +/** + * Module dependencies. + */ + +var Emitter = require('emitter'); +var reduce = require('reduce'); +var requestBase = require('./request-base'); +var isObject = require('./is-object'); + +/** + * Root reference for iframes. + */ + +var root; +if (typeof window !== 'undefined') { // Browser window + root = window; +} else if (typeof self !== 'undefined') { // Web Worker + root = self; +} else { // Other environments + root = this; +} + +/** + * Noop. + */ + +function noop(){}; + +/** + * Check if `obj` is a host object, + * we don't want to serialize these :) + * + * TODO: future proof, move to compoent land + * + * @param {Object} obj + * @return {Boolean} + * @api private + */ + +function isHost(obj) { + var str = {}.toString.call(obj); + + switch (str) { + case '[object File]': + case '[object Blob]': + case '[object FormData]': + return true; + default: + return false; + } +} + +/** + * Expose `request`. + */ + +var request = module.exports = require('./request').bind(null, Request); + +/** + * Determine XHR. + */ + +request.getXHR = function () { + if (root.XMLHttpRequest + && (!root.location || 'file:' != root.location.protocol + || !root.ActiveXObject)) { + return new XMLHttpRequest; + } else { + try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {} + try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {} + try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {} + try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {} + } + return false; +}; + +/** + * Removes leading and trailing whitespace, added to support IE. + * + * @param {String} s + * @return {String} + * @api private + */ + +var trim = ''.trim + ? function(s) { return s.trim(); } + : function(s) { return s.replace(/(^\s*|\s*$)/g, ''); }; + +/** + * Serialize the given `obj`. + * + * @param {Object} obj + * @return {String} + * @api private + */ + +function serialize(obj) { + if (!isObject(obj)) return obj; + var pairs = []; + for (var key in obj) { + if (null != obj[key]) { + pushEncodedKeyValuePair(pairs, key, obj[key]); + } + } + return pairs.join('&'); +} + +/** + * Helps 'serialize' with serializing arrays. + * Mutates the pairs array. + * + * @param {Array} pairs + * @param {String} key + * @param {Mixed} val + */ + +function pushEncodedKeyValuePair(pairs, key, val) { + if (Array.isArray(val)) { + return val.forEach(function(v) { + pushEncodedKeyValuePair(pairs, key, v); + }); + } + pairs.push(encodeURIComponent(key) + + '=' + encodeURIComponent(val)); +} + +/** + * Expose serialization method. + */ + + request.serializeObject = serialize; + + /** + * Parse the given x-www-form-urlencoded `str`. + * + * @param {String} str + * @return {Object} + * @api private + */ + +function parseString(str) { + var obj = {}; + var pairs = str.split('&'); + var parts; + var pair; + + for (var i = 0, len = pairs.length; i < len; ++i) { + pair = pairs[i]; + parts = pair.split('='); + obj[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]); + } + + return obj; +} + +/** + * Expose parser. + */ + +request.parseString = parseString; + +/** + * Default MIME type map. + * + * superagent.types.xml = 'application/xml'; + * + */ + +request.types = { + html: 'text/html', + json: 'application/json', + xml: 'application/xml', + urlencoded: 'application/x-www-form-urlencoded', + 'form': 'application/x-www-form-urlencoded', + 'form-data': 'application/x-www-form-urlencoded' +}; + +/** + * Default serialization map. + * + * superagent.serialize['application/xml'] = function(obj){ + * return 'generated xml here'; + * }; + * + */ + + request.serialize = { + 'application/x-www-form-urlencoded': serialize, + 'application/json': JSON.stringify + }; + + /** + * Default parsers. + * + * superagent.parse['application/xml'] = function(str){ + * return { object parsed from str }; + * }; + * + */ + +request.parse = { + 'application/x-www-form-urlencoded': parseString, + 'application/json': JSON.parse +}; + +/** + * Parse the given header `str` into + * an object containing the mapped fields. + * + * @param {String} str + * @return {Object} + * @api private + */ + +function parseHeader(str) { + var lines = str.split(/\r?\n/); + var fields = {}; + var index; + var line; + var field; + var val; + + lines.pop(); // trailing CRLF + + for (var i = 0, len = lines.length; i < len; ++i) { + line = lines[i]; + index = line.indexOf(':'); + field = line.slice(0, index).toLowerCase(); + val = trim(line.slice(index + 1)); + fields[field] = val; + } + + return fields; +} + +/** + * Check if `mime` is json or has +json structured syntax suffix. + * + * @param {String} mime + * @return {Boolean} + * @api private + */ + +function isJSON(mime) { + return /[\/+]json\b/.test(mime); +} + +/** + * Return the mime type for the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +function type(str){ + return str.split(/ *; */).shift(); +}; + +/** + * Return header field parameters. + * + * @param {String} str + * @return {Object} + * @api private + */ + +function params(str){ + return reduce(str.split(/ *; */), function(obj, str){ + var parts = str.split(/ *= */) + , key = parts.shift() + , val = parts.shift(); + + if (key && val) obj[key] = val; + return obj; + }, {}); +}; + +/** + * Initialize a new `Response` with the given `xhr`. + * + * - set flags (.ok, .error, etc) + * - parse header + * + * Examples: + * + * Aliasing `superagent` as `request` is nice: + * + * request = superagent; + * + * We can use the promise-like API, or pass callbacks: + * + * request.get('/').end(function(res){}); + * request.get('/', function(res){}); + * + * Sending data can be chained: + * + * request + * .post('/user') + * .send({ name: 'tj' }) + * .end(function(res){}); + * + * Or passed to `.send()`: + * + * request + * .post('/user') + * .send({ name: 'tj' }, function(res){}); + * + * Or passed to `.post()`: + * + * request + * .post('/user', { name: 'tj' }) + * .end(function(res){}); + * + * Or further reduced to a single call for simple cases: + * + * request + * .post('/user', { name: 'tj' }, function(res){}); + * + * @param {XMLHTTPRequest} xhr + * @param {Object} options + * @api private + */ + +function Response(req, options) { + options = options || {}; + this.req = req; + this.xhr = this.req.xhr; + // responseText is accessible only if responseType is '' or 'text' and on older browsers + this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined') + ? this.xhr.responseText + : null; + this.statusText = this.req.xhr.statusText; + this.setStatusProperties(this.xhr.status); + this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders()); + // getAllResponseHeaders sometimes falsely returns "" for CORS requests, but + // getResponseHeader still works. so we get content-type even if getting + // other headers fails. + this.header['content-type'] = this.xhr.getResponseHeader('content-type'); + this.setHeaderProperties(this.header); + this.body = this.req.method != 'HEAD' + ? this.parseBody(this.text ? this.text : this.xhr.response) + : null; +} + +/** + * Get case-insensitive `field` value. + * + * @param {String} field + * @return {String} + * @api public + */ + +Response.prototype.get = function(field){ + return this.header[field.toLowerCase()]; +}; + +/** + * Set header related properties: + * + * - `.type` the content type without params + * + * A response of "Content-Type: text/plain; charset=utf-8" + * will provide you with a `.type` of "text/plain". + * + * @param {Object} header + * @api private + */ + +Response.prototype.setHeaderProperties = function(header){ + // content-type + var ct = this.header['content-type'] || ''; + this.type = type(ct); + + // params + var obj = params(ct); + for (var key in obj) this[key] = obj[key]; +}; + +/** + * Parse the given body `str`. + * + * Used for auto-parsing of bodies. Parsers + * are defined on the `superagent.parse` object. + * + * @param {String} str + * @return {Mixed} + * @api private + */ + +Response.prototype.parseBody = function(str){ + var parse = request.parse[this.type]; + if (!parse && isJSON(this.type)) { + parse = request.parse['application/json']; + } + return parse && str && (str.length || str instanceof Object) + ? parse(str) + : null; +}; + +/** + * Set flags such as `.ok` based on `status`. + * + * For example a 2xx response will give you a `.ok` of __true__ + * whereas 5xx will be __false__ and `.error` will be __true__. The + * `.clientError` and `.serverError` are also available to be more + * specific, and `.statusType` is the class of error ranging from 1..5 + * sometimes useful for mapping respond colors etc. + * + * "sugar" properties are also defined for common cases. Currently providing: + * + * - .noContent + * - .badRequest + * - .unauthorized + * - .notAcceptable + * - .notFound + * + * @param {Number} status + * @api private + */ + +Response.prototype.setStatusProperties = function(status){ + // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request + if (status === 1223) { + status = 204; + } + + var type = status / 100 | 0; + + // status / class + this.status = this.statusCode = status; + this.statusType = type; + + // basics + this.info = 1 == type; + this.ok = 2 == type; + this.clientError = 4 == type; + this.serverError = 5 == type; + this.error = (4 == type || 5 == type) + ? this.toError() + : false; + + // sugar + this.accepted = 202 == status; + this.noContent = 204 == status; + this.badRequest = 400 == status; + this.unauthorized = 401 == status; + this.notAcceptable = 406 == status; + this.notFound = 404 == status; + this.forbidden = 403 == status; +}; + +/** + * Return an `Error` representative of this response. + * + * @return {Error} + * @api public + */ + +Response.prototype.toError = function(){ + var req = this.req; + var method = req.method; + var url = req.url; + + var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')'; + var err = new Error(msg); + err.status = this.status; + err.method = method; + err.url = url; + + return err; +}; + +/** + * Expose `Response`. + */ + +request.Response = Response; + +/** + * Initialize a new `Request` with the given `method` and `url`. + * + * @param {String} method + * @param {String} url + * @api public + */ + +function Request(method, url) { + var self = this; + this._query = this._query || []; + this.method = method; + this.url = url; + this.header = {}; // preserves header name case + this._header = {}; // coerces header names to lowercase + this.on('end', function(){ + var err = null; + var res = null; + + try { + res = new Response(self); + } catch(e) { + err = new Error('Parser is unable to parse the response'); + err.parse = true; + err.original = e; + // issue #675: return the raw response if the response parsing fails + err.rawResponse = self.xhr && self.xhr.responseText ? self.xhr.responseText : null; + // issue #876: return the http status code if the response parsing fails + err.statusCode = self.xhr && self.xhr.status ? self.xhr.status : null; + return self.callback(err); + } + + self.emit('response', res); + + if (err) { + return self.callback(err, res); + } + + if (res.status >= 200 && res.status < 300) { + return self.callback(err, res); + } + + var new_err = new Error(res.statusText || 'Unsuccessful HTTP response'); + new_err.original = err; + new_err.response = res; + new_err.status = res.status; + + self.callback(new_err, res); + }); +} + +/** + * Mixin `Emitter` and `requestBase`. + */ + +Emitter(Request.prototype); +for (var key in requestBase) { + Request.prototype[key] = requestBase[key]; +} + +/** + * Abort the request, and clear potential timeout. + * + * @return {Request} + * @api public + */ + +Request.prototype.abort = function(){ + if (this.aborted) return; + this.aborted = true; + this.xhr.abort(); + this.clearTimeout(); + this.emit('abort'); + return this; +}; + +/** + * Set Content-Type to `type`, mapping values from `request.types`. + * + * Examples: + * + * superagent.types.xml = 'application/xml'; + * + * request.post('/') + * .type('xml') + * .send(xmlstring) + * .end(callback); + * + * request.post('/') + * .type('application/xml') + * .send(xmlstring) + * .end(callback); + * + * @param {String} type + * @return {Request} for chaining + * @api public + */ + +Request.prototype.type = function(type){ + this.set('Content-Type', request.types[type] || type); + return this; +}; + +/** + * Set responseType to `val`. Presently valid responseTypes are 'blob' and + * 'arraybuffer'. + * + * Examples: + * + * req.get('/') + * .responseType('blob') + * .end(callback); + * + * @param {String} val + * @return {Request} for chaining + * @api public + */ + +Request.prototype.responseType = function(val){ + this._responseType = val; + return this; +}; + +/** + * Set Accept to `type`, mapping values from `request.types`. + * + * Examples: + * + * superagent.types.json = 'application/json'; + * + * request.get('/agent') + * .accept('json') + * .end(callback); + * + * request.get('/agent') + * .accept('application/json') + * .end(callback); + * + * @param {String} accept + * @return {Request} for chaining + * @api public + */ + +Request.prototype.accept = function(type){ + this.set('Accept', request.types[type] || type); + return this; +}; + +/** + * Set Authorization field value with `user` and `pass`. + * + * @param {String} user + * @param {String} pass + * @param {Object} options with 'type' property 'auto' or 'basic' (default 'basic') + * @return {Request} for chaining + * @api public + */ + +Request.prototype.auth = function(user, pass, options){ + if (!options) { + options = { + type: 'basic' + } + } + + switch (options.type) { + case 'basic': + var str = btoa(user + ':' + pass); + this.set('Authorization', 'Basic ' + str); + break; + + case 'auto': + this.username = user; + this.password = pass; + break; + } + return this; +}; + +/** +* Add query-string `val`. +* +* Examples: +* +* request.get('/shoes') +* .query('size=10') +* .query({ color: 'blue' }) +* +* @param {Object|String} val +* @return {Request} for chaining +* @api public +*/ + +Request.prototype.query = function(val){ + if ('string' != typeof val) val = serialize(val); + if (val) this._query.push(val); + return this; +}; + +/** + * Queue the given `file` as an attachment to the specified `field`, + * with optional `filename`. + * + * ``` js + * request.post('/upload') + * .attach(new Blob(['hey!'], { type: "text/html"})) + * .end(callback); + * ``` + * + * @param {String} field + * @param {Blob|File} file + * @param {String} filename + * @return {Request} for chaining + * @api public + */ + +Request.prototype.attach = function(field, file, filename){ + this._getFormData().append(field, file, filename || file.name); + return this; +}; + +Request.prototype._getFormData = function(){ + if (!this._formData) { + this._formData = new root.FormData(); + } + return this._formData; +}; + +/** + * Send `data` as the request body, defaulting the `.type()` to "json" when + * an object is given. + * + * Examples: + * + * // manual json + * request.post('/user') + * .type('json') + * .send('{"name":"tj"}') + * .end(callback) + * + * // auto json + * request.post('/user') + * .send({ name: 'tj' }) + * .end(callback) + * + * // manual x-www-form-urlencoded + * request.post('/user') + * .type('form') + * .send('name=tj') + * .end(callback) + * + * // auto x-www-form-urlencoded + * request.post('/user') + * .type('form') + * .send({ name: 'tj' }) + * .end(callback) + * + * // defaults to x-www-form-urlencoded + * request.post('/user') + * .send('name=tobi') + * .send('species=ferret') + * .end(callback) + * + * @param {String|Object} data + * @return {Request} for chaining + * @api public + */ + +Request.prototype.send = function(data){ + var obj = isObject(data); + var type = this._header['content-type']; + + // merge + if (obj && isObject(this._data)) { + for (var key in data) { + this._data[key] = data[key]; + } + } else if ('string' == typeof data) { + if (!type) this.type('form'); + type = this._header['content-type']; + if ('application/x-www-form-urlencoded' == type) { + this._data = this._data + ? this._data + '&' + data + : data; + } else { + this._data = (this._data || '') + data; + } + } else { + this._data = data; + } + + if (!obj || isHost(data)) return this; + if (!type) this.type('json'); + return this; +}; + +/** + * @deprecated + */ +Response.prototype.parse = function serialize(fn){ + if (root.console) { + console.warn("Client-side parse() method has been renamed to serialize(). This method is not compatible with superagent v2.0"); + } + this.serialize(fn); + return this; +}; + +Response.prototype.serialize = function serialize(fn){ + this._parser = fn; + return this; +}; + +/** + * Invoke the callback with `err` and `res` + * and handle arity check. + * + * @param {Error} err + * @param {Response} res + * @api private + */ + +Request.prototype.callback = function(err, res){ + var fn = this._callback; + this.clearTimeout(); + fn(err, res); +}; + +/** + * Invoke callback with x-domain error. + * + * @api private + */ + +Request.prototype.crossDomainError = function(){ + var err = new Error('Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.'); + err.crossDomain = true; + + err.status = this.status; + err.method = this.method; + err.url = this.url; + + this.callback(err); +}; + +/** + * Invoke callback with timeout error. + * + * @api private + */ + +Request.prototype.timeoutError = function(){ + var timeout = this._timeout; + var err = new Error('timeout of ' + timeout + 'ms exceeded'); + err.timeout = timeout; + this.callback(err); +}; + +/** + * Enable transmission of cookies with x-domain requests. + * + * Note that for this to work the origin must not be + * using "Access-Control-Allow-Origin" with a wildcard, + * and also must set "Access-Control-Allow-Credentials" + * to "true". + * + * @api public + */ + +Request.prototype.withCredentials = function(){ + this._withCredentials = true; + return this; +}; + +/** + * Initiate request, invoking callback `fn(res)` + * with an instanceof `Response`. + * + * @param {Function} fn + * @return {Request} for chaining + * @api public + */ + +Request.prototype.end = function(fn){ + var self = this; + var xhr = this.xhr = request.getXHR(); + var query = this._query.join('&'); + var timeout = this._timeout; + var data = this._formData || this._data; + + // store callback + this._callback = fn || noop; + + // state change + xhr.onreadystatechange = function(){ + if (4 != xhr.readyState) return; + + // In IE9, reads to any property (e.g. status) off of an aborted XHR will + // result in the error "Could not complete the operation due to error c00c023f" + var status; + try { status = xhr.status } catch(e) { status = 0; } + + if (0 == status) { + if (self.timedout) return self.timeoutError(); + if (self.aborted) return; + return self.crossDomainError(); + } + self.emit('end'); + }; + + // progress + var handleProgress = function(e){ + if (e.total > 0) { + e.percent = e.loaded / e.total * 100; + } + e.direction = 'download'; + self.emit('progress', e); + }; + if (this.hasListeners('progress')) { + xhr.onprogress = handleProgress; + } + try { + if (xhr.upload && this.hasListeners('progress')) { + xhr.upload.onprogress = handleProgress; + } + } catch(e) { + // Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist. + // Reported here: + // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context + } + + // timeout + if (timeout && !this._timer) { + this._timer = setTimeout(function(){ + self.timedout = true; + self.abort(); + }, timeout); + } + + // querystring + if (query) { + query = request.serializeObject(query); + this.url += ~this.url.indexOf('?') + ? '&' + query + : '?' + query; + } + + // initiate request + if (this.username && this.password) { + xhr.open(this.method, this.url, true, this.username, this.password); + } else { + xhr.open(this.method, this.url, true); + } + + // CORS + if (this._withCredentials) xhr.withCredentials = true; + + // body + if ('GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !isHost(data)) { + // serialize stuff + var contentType = this._header['content-type']; + var serialize = this._parser || request.serialize[contentType ? contentType.split(';')[0] : '']; + if (!serialize && isJSON(contentType)) serialize = request.serialize['application/json']; + if (serialize) data = serialize(data); + } + + // set header fields + for (var field in this.header) { + if (null == this.header[field]) continue; + xhr.setRequestHeader(field, this.header[field]); + } + + if (this._responseType) { + xhr.responseType = this._responseType; + } + + // send stuff + this.emit('request', this); + + // IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing) + // We need null here if data is undefined + xhr.send(typeof data !== 'undefined' ? data : null); + return this; +}; + + +/** + * Expose `Request`. + */ + +request.Request = Request; + +/** + * GET `url` with optional callback `fn(res)`. + * + * @param {String} url + * @param {Mixed|Function} data or fn + * @param {Function} fn + * @return {Request} + * @api public + */ + +request.get = function(url, data, fn){ + var req = request('GET', url); + if ('function' == typeof data) fn = data, data = null; + if (data) req.query(data); + if (fn) req.end(fn); + return req; +}; + +/** + * HEAD `url` with optional callback `fn(res)`. + * + * @param {String} url + * @param {Mixed|Function} data or fn + * @param {Function} fn + * @return {Request} + * @api public + */ + +request.head = function(url, data, fn){ + var req = request('HEAD', url); + if ('function' == typeof data) fn = data, data = null; + if (data) req.send(data); + if (fn) req.end(fn); + return req; +}; + +/** + * DELETE `url` with optional callback `fn(res)`. + * + * @param {String} url + * @param {Function} fn + * @return {Request} + * @api public + */ + +function del(url, fn){ + var req = request('DELETE', url); + if (fn) req.end(fn); + return req; +}; + +request['del'] = del; +request['delete'] = del; + +/** + * PATCH `url` with optional `data` and callback `fn(res)`. + * + * @param {String} url + * @param {Mixed} data + * @param {Function} fn + * @return {Request} + * @api public + */ + +request.patch = function(url, data, fn){ + var req = request('PATCH', url); + if ('function' == typeof data) fn = data, data = null; + if (data) req.send(data); + if (fn) req.end(fn); + return req; +}; + +/** + * POST `url` with optional `data` and callback `fn(res)`. + * + * @param {String} url + * @param {Mixed} data + * @param {Function} fn + * @return {Request} + * @api public + */ + +request.post = function(url, data, fn){ + var req = request('POST', url); + if ('function' == typeof data) fn = data, data = null; + if (data) req.send(data); + if (fn) req.end(fn); + return req; +}; + +/** + * PUT `url` with optional `data` and callback `fn(res)`. + * + * @param {String} url + * @param {Mixed|Function} data or fn + * @param {Function} fn + * @return {Request} + * @api public + */ + +request.put = function(url, data, fn){ + var req = request('PUT', url); + if ('function' == typeof data) fn = data, data = null; + if (data) req.send(data); + if (fn) req.end(fn); + return req; +}; + +},{"./is-object":15,"./request":17,"./request-base":16,"emitter":2,"reduce":12}],15:[function(require,module,exports){ +/** + * Check if `obj` is an object. + * + * @param {Object} obj + * @return {Boolean} + * @api private + */ + +function isObject(obj) { + return null != obj && 'object' == typeof obj; +} + +module.exports = isObject; + +},{}],16:[function(require,module,exports){ +/** + * Module of mixed-in functions shared between node and client code + */ +var isObject = require('./is-object'); + +/** + * Clear previous timeout. + * + * @return {Request} for chaining + * @api public + */ + +exports.clearTimeout = function _clearTimeout(){ + this._timeout = 0; + clearTimeout(this._timer); + return this; +}; + +/** + * Force given parser + * + * Sets the body parser no matter type. + * + * @param {Function} + * @api public + */ + +exports.parse = function parse(fn){ + this._parser = fn; + return this; +}; + +/** + * Set timeout to `ms`. + * + * @param {Number} ms + * @return {Request} for chaining + * @api public + */ + +exports.timeout = function timeout(ms){ + this._timeout = ms; + return this; +}; + +/** + * Faux promise support + * + * @param {Function} fulfill + * @param {Function} reject + * @return {Request} + */ + +exports.then = function then(fulfill, reject) { + return this.end(function(err, res) { + err ? reject(err) : fulfill(res); + }); +} + +/** + * Allow for extension + */ + +exports.use = function use(fn) { + fn(this); + return this; +} + + +/** + * Get request header `field`. + * Case-insensitive. + * + * @param {String} field + * @return {String} + * @api public + */ + +exports.get = function(field){ + return this._header[field.toLowerCase()]; +}; + +/** + * Get case-insensitive header `field` value. + * This is a deprecated internal API. Use `.get(field)` instead. + * + * (getHeader is no longer used internally by the superagent code base) + * + * @param {String} field + * @return {String} + * @api private + * @deprecated + */ + +exports.getHeader = exports.get; + +/** + * Set header `field` to `val`, or multiple fields with one object. + * Case-insensitive. + * + * Examples: + * + * req.get('/') + * .set('Accept', 'application/json') + * .set('X-API-Key', 'foobar') + * .end(callback); + * + * req.get('/') + * .set({ Accept: 'application/json', 'X-API-Key': 'foobar' }) + * .end(callback); + * + * @param {String|Object} field + * @param {String} val + * @return {Request} for chaining + * @api public + */ + +exports.set = function(field, val){ + if (isObject(field)) { + for (var key in field) { + this.set(key, field[key]); + } + return this; + } + this._header[field.toLowerCase()] = val; + this.header[field] = val; + return this; +}; + +/** + * Remove header `field`. + * Case-insensitive. + * + * Example: + * + * req.get('/') + * .unset('User-Agent') + * .end(callback); + * + * @param {String} field + */ +exports.unset = function(field){ + delete this._header[field.toLowerCase()]; + delete this.header[field]; + return this; +}; + +/** + * Write the field `name` and `val` for "multipart/form-data" + * request bodies. + * + * ``` js + * request.post('/upload') + * .field('foo', 'bar') + * .end(callback); + * ``` + * + * @param {String} name + * @param {String|Blob|File|Buffer|fs.ReadStream} val + * @return {Request} for chaining + * @api public + */ +exports.field = function(name, val) { + this._getFormData().append(name, val); + return this; +}; + +},{"./is-object":15}],17:[function(require,module,exports){ +// The node and browser modules expose versions of this with the +// appropriate constructor function bound as first argument +/** + * Issue a request: + * + * Examples: + * + * request('GET', '/users').end(callback) + * request('/users').end(callback) + * request('/users', callback) + * + * @param {String} method + * @param {String|Function} url or callback + * @return {Request} + * @api public + */ + +function request(RequestConstructor, method, url) { + // callback + if ('function' == typeof url) { + return new RequestConstructor('GET', method).end(url); + } + + // url first + if (2 == arguments.length) { + return new RequestConstructor('GET', method); + } + + return new RequestConstructor(method, url); +} + +module.exports = request; + +},{}],18:[function(require,module,exports){ +/*! https://mths.be/punycode v1.3.2 by @mathias, modified for URI.js */ + +var punycode = (function () { + + /** + * The `punycode` object. + * @name punycode + * @type Object + */ + var punycode, + + /** Highest positive signed 32-bit float value */ + maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 + + /** Bootstring parameters */ + base = 36, + tMin = 1, + tMax = 26, + skew = 38, + damp = 700, + initialBias = 72, + initialN = 128, // 0x80 + delimiter = '-', // '\x2D' + + /** Regular expressions */ + regexPunycode = /^xn--/, + regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars + regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators + + /** Error messages */ + errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' + }, + + /** Convenience shortcuts */ + baseMinusTMin = base - tMin, + floor = Math.floor, + stringFromCharCode = String.fromCharCode, + + /** Temporary variable */ + key; + + /*--------------------------------------------------------------------------*/ + + /** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ + function error(type) { + throw new RangeError(errors[type]); + } + + /** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ + function map(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + + /** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ + function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; + } + + /** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ + function ucs2decode(string) { + var output = [], + counter = 0, + length = string.length, + value, + extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // low surrogate + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + + /** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ + function ucs2encode(array) { + return map(array, function(value) { + var output = ''; + if (value > 0xFFFF) { + value -= 0x10000; + output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); + value = 0xDC00 | value & 0x3FF; + } + output += stringFromCharCode(value); + return output; + }).join(''); + } + + /** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base; + } + + /** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ + function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + + /** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + + /** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ + function decode(input) { + // Don't use UCS-2 + var output = [], + inputLength = input.length, + out, + i = 0, + n = initialN, + bias = initialBias, + basic, + j, + index, + oldi, + w, + k, + digit, + t, + /** Cached calculation results */ + baseMinusT; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + for (oldi = i, w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output + output.splice(i++, 0, n); + + } + + return ucs2encode(output); + } + + /** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ + function encode(input) { + var n, + delta, + handledCPCount, + basicLength, + bias, + j, + m, + q, + k, + t, + currentValue, + output = [], + /** `inputLength` will hold the number of code points in `input`. */ + inputLength, + /** Cached calculation results */ + handledCPCountPlusOne, + baseMinusT, + qMinusT; + + // Convert the input in UCS-2 to Unicode + input = ucs2decode(input); + + // Cache the length + inputLength = input.length; + + // Initialize the state + n = initialN; + delta = 0; + bias = initialBias; + + // Handle the basic code points + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + handledCPCount = basicLength = output.length; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string - if it is not empty - with a delimiter + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer + for (q = delta, k = base; /* no condition */; k += base) { + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); + } + + /** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ + function toUnicode(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); + } + + /** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ + function toASCII(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); + } + + /*--------------------------------------------------------------------------*/ + + /** Define the public API */ + punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + version: '1.3.2', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + ucs2: { + decode: ucs2decode, + encode: ucs2encode + }, + decode: decode, + encode: encode, + toASCII: toASCII, + toUnicode: toUnicode + }; + + return punycode; +}()); + +if (typeof COMPILED === "undefined" && typeof module !== "undefined") module.exports = punycode; +},{}],19:[function(require,module,exports){ +/// +require("./schemes/http"); +require("./schemes/urn"); +require("./schemes/mailto"); + +},{"./schemes/http":20,"./schemes/mailto":21,"./schemes/urn":22}],20:[function(require,module,exports){ +/// +if (typeof COMPILED === "undefined" && typeof URI === "undefined" && typeof require === "function") + var URI = require("../uri"); +URI.SCHEMES["http"] = URI.SCHEMES["https"] = { + domainHost: true, + parse: function (components, options) { + //report missing host + if (!components.host) { + components.error = components.error || "HTTP URIs must have a host."; + } + return components; + }, + serialize: function (components, options) { + //normalize the default port + if (components.port === (String(components.scheme).toLowerCase() !== "https" ? 80 : 443) || components.port === "") { + components.port = undefined; + } + //normalize the empty path + if (!components.path) { + components.path = "/"; + } + //NOTE: We do not parse query strings for HTTP URIs + //as WWW Form Url Encoded query strings are part of the HTML4+ spec, + //and not the HTTP spec. + return components; + } +}; + +},{"../uri":23}],21:[function(require,module,exports){ +/// +if (typeof COMPILED === "undefined" && typeof URI === "undefined" && typeof require === "function") { + var URI = require("../uri"), punycode = require("../punycode"); +} +(function () { + function merge() { + var sets = []; + for (var _i = 0; _i < arguments.length; _i++) { + sets[_i - 0] = arguments[_i]; + } + if (sets.length > 1) { + sets[0] = sets[0].slice(0, -1); + var xl = sets.length - 1; + for (var x = 1; x < xl; ++x) { + sets[x] = sets[x].slice(1, -1); + } + sets[xl] = sets[xl].slice(1); + return sets.join(''); + } + else { + return sets[0]; + } + } + function subexp(str) { + return "(?:" + str + ")"; + } + var O = {}, isIRI = URI.IRI_SUPPORT, + //RFC 3986 + UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]", HEXDIG$$ = "[0-9A-Fa-f]", PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)), + //RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; = + //ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]", + //WSP$$ = "[\\x20\\x09]", + //OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]", //(%d1-8 / %d11-12 / %d14-31 / %d127) + //QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$), //%d33 / %d35-91 / %d93-126 / obs-qtext + //VCHAR$$ = "[\\x21-\\x7E]", + //WSP$$ = "[\\x20\\x09]", + //OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$)), //%d0 / CR / LF / obs-qtext + //FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+"), + //QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$), + //QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"'), + ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]", QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]", VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]"), DOT_ATOM_TEXT$ = subexp(ATEXT$$ + "+" + subexp("\\." + ATEXT$$ + "+") + "*"), QUOTED_PAIR$ = subexp("\\\\" + VCHAR$$), QCONTENT$ = subexp(QTEXT$$ + "|" + QUOTED_PAIR$), QUOTED_STRING$ = subexp('\\"' + QCONTENT$ + "*" + '\\"'), + //RFC 6068 + DTEXT_NO_OBS$$ = "[\\x21-\\x5A\\x5E-\\x7E]", SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]", QCHAR$ = subexp(UNRESERVED$$ + "|" + PCT_ENCODED$ + "|" + SOME_DELIMS$$), DOMAIN$ = subexp(DOT_ATOM_TEXT$ + "|" + "\\[" + DTEXT_NO_OBS$$ + "*" + "\\]"), LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + "|" + QUOTED_STRING$), ADDR_SPEC$ = subexp(LOCAL_PART$ + "\\@" + DOMAIN$), TO$ = subexp(ADDR_SPEC$ + subexp("\\," + ADDR_SPEC$) + "*"), HFNAME$ = subexp(QCHAR$ + "*"), HFVALUE$ = HFNAME$, HFIELD$ = subexp(HFNAME$ + "\\=" + HFVALUE$), HFIELDS2$ = subexp(HFIELD$ + subexp("\\&" + HFIELD$) + "*"), HFIELDS$ = subexp("\\?" + HFIELDS2$), MAILTO_URI = URI.VALIDATE_SUPPORT && new RegExp("^mailto\\:" + TO$ + "?" + HFIELDS$ + "?$"), UNRESERVED = new RegExp(UNRESERVED$$, "g"), PCT_ENCODED = new RegExp(PCT_ENCODED$, "g"), NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g"), NOT_DOMAIN = new RegExp(merge("[^]", ATEXT$$, "[\\.]", "[\\[]", DTEXT_NO_OBS$$, "[\\]]"), "g"), NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g"), NOT_HFVALUE = NOT_HFNAME, TO = URI.VALIDATE_SUPPORT && new RegExp("^" + TO$ + "$"), HFIELDS = URI.VALIDATE_SUPPORT && new RegExp("^" + HFIELDS2$ + "$"); + function toUpperCase(str) { + return str.toUpperCase(); + } + function decodeUnreserved(str) { + var decStr = URI.pctDecChars(str); + return (!decStr.match(UNRESERVED) ? str : decStr); + } + function toArray(obj) { + return obj !== undefined && obj !== null ? (obj instanceof Array && !obj.callee ? obj : (typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : []; + } + URI.SCHEMES["mailto"] = { + parse: function (components, options) { + if (URI.VALIDATE_SUPPORT && !components.error) { + if (components.path && !TO.test(components.path)) { + components.error = "Email address is not valid"; + } + else if (components.query && !HFIELDS.test(components.query)) { + components.error = "Header fields are invalid"; + } + } + var to = components.to = (components.path ? components.path.split(",") : []); + components.path = undefined; + if (components.query) { + var unknownHeaders = false, headers = {}; + var hfields = components.query.split("&"); + for (var x = 0, xl = hfields.length; x < xl; ++x) { + var hfield = hfields[x].split("="); + switch (hfield[0]) { + case "to": + var toAddrs = hfield[1].split(","); + for (var x_1 = 0, xl_1 = toAddrs.length; x_1 < xl_1; ++x_1) { + to.push(toAddrs[x_1]); + } + break; + case "subject": + components.subject = URI.unescapeComponent(hfield[1], options); + break; + case "body": + components.body = URI.unescapeComponent(hfield[1], options); + break; + default: + unknownHeaders = true; + headers[URI.unescapeComponent(hfield[0], options)] = URI.unescapeComponent(hfield[1], options); + break; + } + } + if (unknownHeaders) + components.headers = headers; + } + components.query = undefined; + for (var x = 0, xl = to.length; x < xl; ++x) { + var addr = to[x].split("@"); + addr[0] = URI.unescapeComponent(addr[0]); + if (typeof punycode !== "undefined" && !options.unicodeSupport) { + //convert Unicode IDN -> ASCII IDN + try { + addr[1] = punycode.toASCII(URI.unescapeComponent(addr[1], options).toLowerCase()); + } + catch (e) { + components.error = components.error || "Email address's domain name can not be converted to ASCII via punycode: " + e; + } + } + else { + addr[1] = URI.unescapeComponent(addr[1], options).toLowerCase(); + } + to[x] = addr.join("@"); + } + return components; + }, + serialize: function (components, options) { + var to = toArray(components.to); + if (to) { + for (var x = 0, xl = to.length; x < xl; ++x) { + var toAddr = String(to[x]); + var atIdx = toAddr.lastIndexOf("@"); + var localPart = toAddr.slice(0, atIdx); + var domain = toAddr.slice(atIdx + 1); + localPart = localPart.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, URI.pctEncChar); + if (typeof punycode !== "undefined") { + //convert IDN via punycode + try { + domain = (!options.iri ? punycode.toASCII(URI.unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain)); + } + catch (e) { + components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + } + else { + domain = domain.replace(PCT_ENCODED, decodeUnreserved).toLowerCase().replace(PCT_ENCODED, toUpperCase).replace(NOT_DOMAIN, URI.pctEncChar); + } + to[x] = localPart + "@" + domain; + } + components.path = to.join(","); + } + var headers = components.headers = components.headers || {}; + if (components.subject) + headers["subject"] = components.subject; + if (components.body) + headers["body"] = components.body; + var fields = []; + for (var name_1 in headers) { + if (headers[name_1] !== O[name_1]) { + fields.push(name_1.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, URI.pctEncChar) + + "=" + + headers[name_1].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, URI.pctEncChar)); + } + } + if (fields.length) { + components.query = fields.join("&"); + } + return components; + } + }; +})(); + +},{"../punycode":18,"../uri":23}],22:[function(require,module,exports){ +/// +if (typeof COMPILED === "undefined" && typeof URI === "undefined" && typeof require === "function") + var URI = require("../uri"); +(function () { + var pctEncChar = URI.pctEncChar, NID$ = "(?:[0-9A-Za-z][0-9A-Za-z\\-]{1,31})", PCT_ENCODED$ = "(?:\\%[0-9A-Fa-f]{2})", TRANS$$ = "[0-9A-Za-z\\(\\)\\+\\,\\-\\.\\:\\=\\@\\;\\$\\_\\!\\*\\'\\/\\?\\#]", NSS$ = "(?:(?:" + PCT_ENCODED$ + "|" + TRANS$$ + ")+)", URN_SCHEME = new RegExp("^urn\\:(" + NID$ + ")$"), URN_PATH = new RegExp("^(" + NID$ + ")\\:(" + NSS$ + ")$"), URN_PARSE = /^([^\:]+)\:(.*)/, URN_EXCLUDED = /[\x00-\x20\\\"\&\<\>\[\]\^\`\{\|\}\~\x7F-\xFF]/g, UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/; + //RFC 2141 + URI.SCHEMES["urn"] = { + parse: function (components, options) { + var matches = components.path.match(URN_PATH), scheme, schemeHandler; + if (!matches) { + if (!options.tolerant) { + components.error = components.error || "URN is not strictly valid."; + } + matches = components.path.match(URN_PARSE); + } + if (matches) { + scheme = "urn:" + matches[1].toLowerCase(); + schemeHandler = URI.SCHEMES[scheme]; + //in order to serialize properly, + //every URN must have a serializer that calls the URN serializer + if (!schemeHandler) { + //create fake scheme handler + schemeHandler = URI.SCHEMES[scheme] = { + parse: function (components, options) { + return components; + }, + serialize: URI.SCHEMES["urn"].serialize + }; + } + components.scheme = scheme; + components.path = matches[2]; + components = schemeHandler.parse(components, options); + } + else { + components.error = components.error || "URN can not be parsed."; + } + return components; + }, + serialize: function (components, options) { + var scheme = components.scheme || options.scheme, matches; + if (scheme && scheme !== "urn") { + var matches = scheme.match(URN_SCHEME); + if (!matches) { + matches = ["urn:" + scheme, scheme]; + } + components.scheme = "urn"; + components.path = matches[1] + ":" + (components.path ? components.path.replace(URN_EXCLUDED, pctEncChar) : ""); + } + return components; + } + }; + //RFC 4122 + URI.SCHEMES["urn:uuid"] = { + parse: function (components, options) { + if (!options.tolerant && (!components.path || !components.path.match(UUID))) { + components.error = components.error || "UUID is not valid."; + } + return components; + }, + serialize: function (components, options) { + //ensure UUID is valid + if (!options.tolerant && (!components.path || !components.path.match(UUID))) { + //invalid UUIDs can not have this scheme + components.scheme = undefined; + } + else { + //normalize UUID + components.path = (components.path || "").toLowerCase(); + } + return URI.SCHEMES["urn"].serialize(components, options); + } + }; +}()); + +},{"../uri":23}],23:[function(require,module,exports){ +/** + * URI.js + * + * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript. + * @author Gary Court + * @version 2.0.0 + * @see http://github.com/garycourt/uri-js + * @license URI.js v2.0.0 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js + */ +/** + * Copyright 2011 Gary Court. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gary Court. + */ +/// +/// +/** + * Compiler switch for indicating code is compiled + * @define {boolean} + */ +var COMPILED = false; +/** + * Compiler switch for supporting IRI URIs + * @define {boolean} + */ +var URI__IRI_SUPPORT = true; +/** + * Compiler switch for supporting URI validation + * @define {boolean} + */ +var URI__VALIDATE_SUPPORT = true; +var URI = (function () { + function merge() { + var sets = []; + for (var _i = 0; _i < arguments.length; _i++) { + sets[_i - 0] = arguments[_i]; + } + if (sets.length > 1) { + sets[0] = sets[0].slice(0, -1); + var xl = sets.length - 1; + for (var x = 1; x < xl; ++x) { + sets[x] = sets[x].slice(1, -1); + } + sets[xl] = sets[xl].slice(1); + return sets.join(''); + } + else { + return sets[0]; + } + } + function subexp(str) { + return "(?:" + str + ")"; + } + function buildExps(isIRI) { + var ALPHA$$ = "[A-Za-z]", CR$ = "[\\x0D]", DIGIT$$ = "[0-9]", DQUOTE$$ = "[\\x22]", HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"), LF$$ = "[\\x0A]", SP$$ = "[\\x20]", PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)), GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]", UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"), DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), IPV4ADDRESS$ = subexp(DEC_OCTET$ + "\\." + DEC_OCTET$ + "\\." + DEC_OCTET$ + "\\." + DEC_OCTET$), H16$ = subexp(HEXDIG$$ + "{1,4}"), LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), IPV6ADDRESS$ = subexp(merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), IPVFUTURE$ = subexp("v" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"), HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$), PORT$ = subexp(DIGIT$$ + "*"), AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")), SEGMENT$ = subexp(PCHAR$ + "*"), SEGMENT_NZ$ = subexp(PCHAR$ + "+"), SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"), PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), PATH_EMPTY$ = "(?!" + PCHAR$ + ")", PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$"; + return { + URI_REF: URI__VALIDATE_SUPPORT && new RegExp("(" + GENERIC_REF$ + ")|(" + RELATIVE_REF$ + ")"), + NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"), + NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_HOST: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"), + NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"), + ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"), + UNRESERVED: new RegExp(UNRESERVED$$, "g"), + OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"), + PCT_ENCODED: new RegExp(PCT_ENCODED$, "g") + }; + } + var URI_PROTOCOL = buildExps(false), IRI_PROTOCOL = URI__IRI_SUPPORT ? buildExps(true) : undefined, URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?([^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n)*))?/i, RDS1 = /^\.\.?\//, RDS2 = /^\/\.(\/|$)/, RDS3 = /^\/\.\.(\/|$)/, RDS4 = /^\.\.?$/, RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/, NO_MATCH_IS_UNDEFINED = ("").match(/(){0}/)[1] === undefined; + function pctEncChar(chr) { + var c = chr.charCodeAt(0), e; + if (c < 16) + e = "%0" + c.toString(16).toUpperCase(); + else if (c < 128) + e = "%" + c.toString(16).toUpperCase(); + else if (c < 2048) + e = "%" + ((c >> 6) | 192).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase(); + else + e = "%" + ((c >> 12) | 224).toString(16).toUpperCase() + "%" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase(); + return e; + } + function pctDecChars(str) { + var newStr = "", i = 0, il = str.length, c, c2, c3; + while (i < il) { + c = parseInt(str.substr(i + 1, 2), 16); + if (c < 128) { + newStr += String.fromCharCode(c); + i += 3; + } + else if (c >= 194 && c < 224) { + if ((il - i) >= 6) { + c2 = parseInt(str.substr(i + 4, 2), 16); + newStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + } + else { + newStr += str.substr(i, 6); + } + i += 6; + } + else if (c >= 224) { + if ((il - i) >= 9) { + c2 = parseInt(str.substr(i + 4, 2), 16); + c3 = parseInt(str.substr(i + 7, 2), 16); + newStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + } + else { + newStr += str.substr(i, 9); + } + i += 9; + } + else { + newStr += str.substr(i, 3); + i += 3; + } + } + return newStr; + } + function typeOf(o) { + return o === undefined ? "undefined" : (o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase()); + } + function toUpperCase(str) { + return str.toUpperCase(); + } + var SCHEMES = {}; + function _normalizeComponentEncoding(components, protocol) { + function decodeUnreserved(str) { + var decStr = pctDecChars(str); + return (!decStr.match(protocol.UNRESERVED) ? str : decStr); + } + if (components.scheme) + components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, ""); + if (components.userinfo !== undefined) + components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.host !== undefined) + components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.path !== undefined) + components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.query !== undefined) + components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.fragment !== undefined) + components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + return components; + } + ; + function parse(uriString, options) { + if (options === void 0) { options = {}; } + var protocol = (URI__IRI_SUPPORT && options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL), matches, parseError = false, components = {}, schemeHandler; + if (options.reference === "suffix") + uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString; + if (URI__VALIDATE_SUPPORT) { + matches = uriString.match(protocol.URI_REF); + if (matches) { + if (matches[1]) { + //generic URI + matches = matches.slice(1, 10); + } + else { + //relative URI + matches = matches.slice(10, 19); + } + } + if (!matches) { + parseError = true; + if (!options.tolerant) + components.error = components.error || "URI is not strictly valid."; + matches = uriString.match(URI_PARSE); + } + } + else { + matches = uriString.match(URI_PARSE); + } + if (matches) { + if (NO_MATCH_IS_UNDEFINED) { + //store each component + components.scheme = matches[1]; + //components.authority = matches[2]; + components.userinfo = matches[3]; + components.host = matches[4]; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = matches[7]; + components.fragment = matches[8]; + //fix port number + if (isNaN(components.port)) { + components.port = matches[5]; + } + } + else { + //store each component + components.scheme = matches[1] || undefined; + //components.authority = (uriString.indexOf("//") !== -1 ? matches[2] : undefined); + components.userinfo = (uriString.indexOf("@") !== -1 ? matches[3] : undefined); + components.host = (uriString.indexOf("//") !== -1 ? matches[4] : undefined); + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = (uriString.indexOf("?") !== -1 ? matches[7] : undefined); + components.fragment = (uriString.indexOf("#") !== -1 ? matches[8] : undefined); + //fix port number + if (isNaN(components.port)) { + components.port = (uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined); + } + } + //determine reference type + if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) { + components.reference = "same-document"; + } + else if (components.scheme === undefined) { + components.reference = "relative"; + } + else if (components.fragment === undefined) { + components.reference = "absolute"; + } + else { + components.reference = "uri"; + } + //check for reference errors + if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) { + components.error = components.error || "URI is not a " + options.reference + " reference."; + } + //find scheme handler + schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //check if scheme can't handle IRIs + if (URI__IRI_SUPPORT && typeof punycode !== "undefined" && !options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) { + //if host component is a domain name + if (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) { + //convert Unicode IDN -> ASCII IDN + try { + components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()); + } + catch (e) { + components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e; + } + } + //convert IRI -> URI + _normalizeComponentEncoding(components, URI_PROTOCOL); + } + else { + //normalize encodings + _normalizeComponentEncoding(components, protocol); + } + //perform scheme specific parsing + if (schemeHandler && schemeHandler.parse) { + schemeHandler.parse(components, options); + } + } + else { + parseError = true; + components.error = components.error || "URI can not be parsed."; + } + return components; + } + ; + function _recomposeAuthority(components, options) { + var uriTokens = []; + if (components.userinfo !== undefined) { + uriTokens.push(components.userinfo); + uriTokens.push("@"); + } + if (components.host !== undefined) { + uriTokens.push(components.host); + } + if (typeof components.port === "number") { + uriTokens.push(":"); + uriTokens.push(components.port.toString(10)); + } + return uriTokens.length ? uriTokens.join("") : undefined; + } + ; + function removeDotSegments(input) { + var output = [], s; + while (input.length) { + if (input.match(RDS1)) { + input = input.replace(RDS1, ""); + } + else if (input.match(RDS2)) { + input = input.replace(RDS2, "/"); + } + else if (input.match(RDS3)) { + input = input.replace(RDS3, "/"); + output.pop(); + } + else if (input === "." || input === "..") { + input = ""; + } + else { + s = input.match(RDS5)[0]; + input = input.slice(s.length); + output.push(s); + } + } + return output.join(""); + } + ; + function serialize(components, options) { + if (options === void 0) { options = {}; } + var protocol = (URI__IRI_SUPPORT && options.iri ? IRI_PROTOCOL : URI_PROTOCOL), uriTokens = [], schemeHandler, authority, s; + //find scheme handler + schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //perform scheme specific serialization + if (schemeHandler && schemeHandler.serialize) + schemeHandler.serialize(components, options); + //if host component is a domain name + if (URI__IRI_SUPPORT && typeof punycode !== "undefined" && components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) { + //convert IDN via punycode + try { + components.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host)); + } + catch (e) { + components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + } + //normalize encoding + _normalizeComponentEncoding(components, protocol); + if (options.reference !== "suffix" && components.scheme) { + uriTokens.push(components.scheme); + uriTokens.push(":"); + } + authority = _recomposeAuthority(components, options); + if (authority !== undefined) { + if (options.reference !== "suffix") { + uriTokens.push("//"); + } + uriTokens.push(authority); + if (components.path && components.path.charAt(0) !== "/") { + uriTokens.push("/"); + } + } + if (components.path !== undefined) { + s = components.path; + if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) { + s = removeDotSegments(s); + } + if (authority === undefined) { + s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//" + } + uriTokens.push(s); + } + if (components.query !== undefined) { + uriTokens.push("?"); + uriTokens.push(components.query); + } + if (components.fragment !== undefined) { + uriTokens.push("#"); + uriTokens.push(components.fragment); + } + return uriTokens.join(''); //merge tokens into a string + } + ; + function resolveComponents(base, relative, options, skipNormalization) { + if (options === void 0) { options = {}; } + var target = {}; + if (!skipNormalization) { + base = parse(serialize(base, options), options); //normalize base components + relative = parse(serialize(relative, options), options); //normalize relative components + } + options = options || {}; + if (!options.tolerant && relative.scheme) { + target.scheme = relative.scheme; + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path); + target.query = relative.query; + } + else { + if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) { + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path); + target.query = relative.query; + } + else { + if (!relative.path) { + target.path = base.path; + if (relative.query !== undefined) { + target.query = relative.query; + } + else { + target.query = base.query; + } + } + else { + if (relative.path.charAt(0) === "/") { + target.path = removeDotSegments(relative.path); + } + else { + if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) { + target.path = "/" + relative.path; + } + else if (!base.path) { + target.path = relative.path; + } + else { + target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path; + } + target.path = removeDotSegments(target.path); + } + target.query = relative.query; + } + //target.authority = base.authority; + target.userinfo = base.userinfo; + target.host = base.host; + target.port = base.port; + } + target.scheme = base.scheme; + } + target.fragment = relative.fragment; + return target; + } + ; + function resolve(baseURI, relativeURI, options) { + return serialize(resolveComponents(parse(baseURI, options), parse(relativeURI, options), options, true), options); + } + ; + function normalize(uri, options) { + if (typeof uri === "string") { + uri = serialize(parse(uri, options), options); + } + else if (typeOf(uri) === "object") { + uri = parse(serialize(uri, options), options); + } + return uri; + } + ; + function equal(uriA, uriB, options) { + if (typeof uriA === "string") { + uriA = serialize(parse(uriA, options), options); + } + else if (typeOf(uriA) === "object") { + uriA = serialize(uriA, options); + } + if (typeof uriB === "string") { + uriB = serialize(parse(uriB, options), options); + } + else if (typeOf(uriB) === "object") { + uriB = serialize(uriB, options); + } + return uriA === uriB; + } + ; + function escapeComponent(str, options) { + return str && str.toString().replace((!URI__IRI_SUPPORT || !options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar); + } + ; + function unescapeComponent(str, options) { + return str && str.toString().replace((!URI__IRI_SUPPORT || !options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars); + } + ; + return { + IRI_SUPPORT: URI__IRI_SUPPORT, + VALIDATE_SUPPORT: URI__VALIDATE_SUPPORT, + pctEncChar: pctEncChar, + pctDecChars: pctDecChars, + SCHEMES: SCHEMES, + parse: parse, + _recomposeAuthority: _recomposeAuthority, + removeDotSegments: removeDotSegments, + serialize: serialize, + resolveComponents: resolveComponents, + resolve: resolve, + normalize: normalize, + equal: equal, + escapeComponent: escapeComponent, + unescapeComponent: unescapeComponent + }; +})(); +if (!COMPILED && typeof module !== "undefined" && typeof require === "function") { + var punycode = require("./punycode"); + module.exports = URI; + require("./schemes"); +} + +},{"./punycode":18,"./schemes":19}]},{},[1])(1) +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJpbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb25lbnQtZW1pdHRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9uYXRpdmUtcHJvbWlzZS1vbmx5L2xpYi9ucG8uc3JjLmpzIiwibm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYXRoLWxvYWRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYXRoLWxvYWRlci9saWIvbG9hZGVycy9maWxlLWJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcGF0aC1sb2FkZXIvbGliL2xvYWRlcnMvaHR0cC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2RlY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZW5jb2RlLmpzIiwibm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWR1Y2UtY29tcG9uZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NsYXNoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL2NsaWVudC5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi9pcy1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvcmVxdWVzdC1iYXNlLmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL3JlcXVlc3QuanMiLCJub2RlX21vZHVsZXMvdXJpLWpzL2J1aWxkL3B1bnljb2RlLmpzIiwibm9kZV9tb2R1bGVzL3VyaS1qcy9idWlsZC9zY2hlbWVzLmpzIiwibm9kZV9tb2R1bGVzL3VyaS1qcy9idWlsZC9zY2hlbWVzL2h0dHAuanMiLCJub2RlX21vZHVsZXMvdXJpLWpzL2J1aWxkL3NjaGVtZXMvbWFpbHRvLmpzIiwibm9kZV9tb2R1bGVzL3VyaS1qcy9idWlsZC9zY2hlbWVzL3Vybi5qcyIsIm5vZGVfbW9kdWxlcy91cmktanMvYnVpbGQvdXJpLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyMkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDclhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2hPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcmpDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLypcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBKZXJlbXkgV2hpdGxvY2tcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBWYXJpb3VzIHV0aWxpdGllcyBmb3IgSlNPTiBSZWZlcmVuY2VzICooaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtcGJyeWFuLXp5cC1qc29uLXJlZi0wMykqIGFuZFxuICogSlNPTiBQb2ludGVycyAqKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2OTAxKSouXG4gKlxuICogQG1vZHVsZSBKc29uUmVmc1xuICovXG5cbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIFBhdGhMb2FkZXIgPSByZXF1aXJlKCdwYXRoLWxvYWRlcicpO1xudmFyIHFzID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKTtcbnZhciBzbGFzaCA9IHJlcXVpcmUoJ3NsYXNoJyk7XG52YXIgVVJJID0gcmVxdWlyZSgndXJpLWpzJyk7XG5cbnZhciBiYWRQdHJUb2tlblJlZ2V4ID0gL34oPzpbXjAxXXwkKS9nO1xudmFyIHJlbW90ZUNhY2hlID0ge307XG52YXIgcmVtb3RlVHlwZXMgPSBbJ3JlbGF0aXZlJywgJ3JlbW90ZSddO1xudmFyIHJlbW90ZVVyaVR5cGVzID0gWydhYnNvbHV0ZScsICd1cmknXTtcbnZhciB1cmlEZXRhaWxzQ2FjaGUgPSB7fTtcblxuLy8gTG9hZCBwcm9taXNlcyBwb2x5ZmlsbCBpZiBuZWNlc3Nhcnlcbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJykge1xuICByZXF1aXJlKCduYXRpdmUtcHJvbWlzZS1vbmx5Jyk7XG59XG5cbi8qIEludGVybmFsIEZ1bmN0aW9ucyAqL1xuXG4vLyBUaGlzIGlzIGEgdmVyeSBzaW1wbGlzdGljIGNsb25lIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgbm9uLUpTT04gdHlwZXMuICBGb3IgdGhlc2UgdHlwZXMgdGhlXG4vLyBvcmlnaW5hbCB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBjbG9uZS4gIFNvIHdoaWxlIGl0J3Mgbm90IGEgY29tcGxldGUgZGVlcCBjbG9uZSwgZm9yIHRoZSBuZWVkcyBvZiB0aGlzIHByb2plY3Rcbi8vIHRoaXMgc2hvdWxkIGJlIHN1ZmZpY2llbnQuXG5mdW5jdGlvbiBjbG9uZSAob2JqKSB7XG4gIHZhciBjbG9uZWQ7XG5cbiAgaWYgKGlzVHlwZShvYmosICdBcnJheScpKSB7XG4gICAgY2xvbmVkID0gW107XG5cbiAgICBvYmouZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7XG4gICAgICBjbG9uZWRbaW5kZXhdID0gY2xvbmUodmFsdWUpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzVHlwZShvYmosICdPYmplY3QnKSkge1xuICAgIGNsb25lZCA9IHt9O1xuXG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGNsb25lZFtrZXldID0gY2xvbmUob2JqW2tleV0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNsb25lZCA9IG9iajtcbiAgfVxuXG4gIHJldHVybiBjbG9uZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVRdWVyeVBhcmFtcyAocXMxLCBxczIpIHtcbiAgdmFyIGNvbWJpbmVkID0ge307XG5cbiAgZnVuY3Rpb24gbWVyZ2VRdWVyeVBhcmFtcyAob2JqKSB7XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGNvbWJpbmVkW2tleV0gPSBvYmpba2V5XTtcbiAgICB9KTtcbiAgfVxuXG4gIG1lcmdlUXVlcnlQYXJhbXMocXMucGFyc2UocXMxIHx8ICcnKSk7XG4gIG1lcmdlUXVlcnlQYXJhbXMocXMucGFyc2UocXMyIHx8ICcnKSk7XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbWJpbmVkKS5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiBxcy5zdHJpbmdpZnkoY29tYmluZWQpO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lVVJJcyAodTEsIHUyKSB7XG4gIC8vIENvbnZlcnQgV2luZG93cyBwYXRoc1xuICBpZiAoaXNUeXBlKHUxLCAnU3RyaW5nJykpIHtcbiAgICB1MSA9IHNsYXNoKHUxKTtcbiAgfVxuXG4gIGlmIChpc1R5cGUodTIsICdTdHJpbmcnKSkge1xuICAgIHUyID0gc2xhc2godTIpO1xuICB9XG5cbiAgdmFyIHUyRGV0YWlscyA9IHBhcnNlVVJJKGlzVHlwZSh1MiwgJ1VuZGVmaW5lZCcpID8gJycgOiB1Mik7XG4gIHZhciB1MURldGFpbHM7XG4gIHZhciBjb21iaW5lZERldGFpbHM7XG5cbiAgaWYgKHJlbW90ZVVyaVR5cGVzLmluZGV4T2YodTJEZXRhaWxzLnJlZmVyZW5jZSkgPiAtMSkge1xuICAgIGNvbWJpbmVkRGV0YWlscyA9IHUyRGV0YWlscztcbiAgfSBlbHNlIHtcbiAgICB1MURldGFpbHMgPSBpc1R5cGUodTEsICdVbmRlZmluZWQnKSA/IHVuZGVmaW5lZCA6IHBhcnNlVVJJKHUxKTtcblxuICAgIGlmICghaXNUeXBlKHUxRGV0YWlscywgJ1VuZGVmaW5lZCcpKSB7XG4gICAgICBjb21iaW5lZERldGFpbHMgPSB1MURldGFpbHM7XG5cbiAgICAgIC8vIEpvaW4gdGhlIHBhdGhzXG4gICAgICBjb21iaW5lZERldGFpbHMucGF0aCA9IHNsYXNoKHBhdGguam9pbih1MURldGFpbHMucGF0aCwgdTJEZXRhaWxzLnBhdGgpKTtcblxuICAgICAgLy8gSm9pbiBxdWVyeSBwYXJhbWV0ZXJzXG4gICAgICBjb21iaW5lZERldGFpbHMucXVlcnkgPSBjb21iaW5lUXVlcnlQYXJhbXModTFEZXRhaWxzLnF1ZXJ5LCB1MkRldGFpbHMucXVlcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21iaW5lZERldGFpbHMgPSB1MkRldGFpbHM7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVtb3ZlIHRoZSBmcmFnbWVudFxuICBjb21iaW5lZERldGFpbHMuZnJhZ21lbnQgPSB1bmRlZmluZWQ7XG5cbiAgLy8gRm9yIHJlbGF0aXZlIFVSSXMsIGFkZCBiYWNrIHRoZSAnLi4nIHNpbmNlIGl0IHdhcyByZW1vdmVkIGFib3ZlXG4gIHJldHVybiAocmVtb3RlVXJpVHlwZXMuaW5kZXhPZihjb21iaW5lZERldGFpbHMucmVmZXJlbmNlKSA9PT0gLTEgJiZcbiAgICAgICAgICBjb21iaW5lZERldGFpbHMucGF0aC5pbmRleE9mKCcuLi8nKSA9PT0gMCA/ICcuLi8nIDogJycpICsgVVJJLnNlcmlhbGl6ZShjb21iaW5lZERldGFpbHMpO1xufVxuXG5mdW5jdGlvbiBmaW5kQW5jZXN0b3JzIChvYmosIHBhdGgpIHtcbiAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICB2YXIgbm9kZTtcblxuICBpZiAocGF0aC5sZW5ndGggPiAwKSB7XG4gICAgbm9kZSA9IG9iajtcblxuICAgIHBhdGguc2xpY2UoMCwgcGF0aC5sZW5ndGggLSAxKS5mb3JFYWNoKGZ1bmN0aW9uIChzZWcpIHtcbiAgICAgIGlmIChzZWcgaW4gbm9kZSkge1xuICAgICAgICBub2RlID0gbm9kZVtzZWddO1xuXG4gICAgICAgIGFuY2VzdG9ycy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGFuY2VzdG9ycztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1N1YkRvY3VtZW50IChtb2RlLCBkb2MsIHN1YkRvY1BhdGgsIHJlZkRldGFpbHMsIG9wdGlvbnMsIHBhcmVudHMsIHBhcmVudFB0cnMsIGFsbFJlZnMsIGluZGlyZWN0KSB7XG4gIHZhciByZWZWYWx1ZTtcbiAgdmFyIHJPcHRpb25zO1xuXG4gIGlmIChzdWJEb2NQYXRoLmxlbmd0aCA+IDApIHtcbiAgICB0cnkge1xuICAgICAgcmVmVmFsdWUgPSBmaW5kVmFsdWUoZG9jLCBzdWJEb2NQYXRoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIFdlIG9ubHkgbWFyayBtaXNzaW5nIHJlbW90ZSByZWZlcmVuY2VzIGFzIG1pc3NpbmcgYmVjYXVzZSBsb2NhbCByZWZlcmVuY2VzIGNhbiBoYXZlIGRlZmVycmVkIHZhbHVlc1xuICAgICAgaWYgKG1vZGUgPT09ICdyZW1vdGUnKSB7XG4gICAgICAgIHJlZkRldGFpbHMuZXJyb3IgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgcmVmRGV0YWlscy5taXNzaW5nID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVmVmFsdWUgPSBkb2M7XG4gIH1cblxuICBpZiAoIWlzVHlwZShyZWZWYWx1ZSwgJ1VuZGVmaW5lZCcpKSB7XG4gICAgcmVmRGV0YWlscy52YWx1ZSA9IHJlZlZhbHVlO1xuICB9XG5cbiAgaWYgKGlzVHlwZShyZWZWYWx1ZSwgJ0FycmF5JykgfHwgaXNUeXBlKHJlZlZhbHVlLCAnT2JqZWN0JykpIHtcbiAgICByT3B0aW9ucyA9IGNsb25lKG9wdGlvbnMpO1xuXG4gICAgaWYgKG1vZGUgPT09ICdsb2NhbCcpIHtcbiAgICAgIGRlbGV0ZSByT3B0aW9ucy5zdWJEb2NQYXRoO1xuXG4gICAgICAvLyBUcmF2ZXJzZSB0aGUgZGVyZWZlcmVuY2VkIHZhbHVlXG4gICAgICBkb2MgPSByZWZWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgck9wdGlvbnMucmVsYXRpdmVCYXNlID0gcGF0aC5kaXJuYW1lKHBhcmVudHNbcGFyZW50cy5sZW5ndGggLSAxXSk7XG5cbiAgICAgIGlmIChzdWJEb2NQYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUgck9wdGlvbnMuc3ViRG9jUGF0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJPcHRpb25zLnN1YkRvY1BhdGggPSBzdWJEb2NQYXRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaW5kUmVmc1JlY3Vyc2l2ZShkb2MsIHJPcHRpb25zLCBwYXJlbnRzLCBwYXJlbnRQdHJzLCBhbGxSZWZzLCBpbmRpcmVjdCk7XG4gIH1cbn1cblxuLy8gU2hvdWxkIHRoaXMgYmUgaXRzIG93biBleHBvcnRlZCBBUEk/XG5mdW5jdGlvbiBmaW5kUmVmc1JlY3Vyc2l2ZSAob2JqLCBvcHRpb25zLCBwYXJlbnRzLCBwYXJlbnRQdHJzLCBhbGxSZWZzLCBpbmRpcmVjdCkge1xuICB2YXIgYWxsVGFza3MgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgdmFyIHBhcmVudFBhdGggPSBwYXJlbnRQdHJzLmxlbmd0aCA/IHBhdGhGcm9tUHRyKHBhcmVudFB0cnNbcGFyZW50UHRycy5sZW5ndGggLSAxXSkgOiBbXTtcbiAgdmFyIHJlZnMgPSBmaW5kUmVmcyhvYmosIG9wdGlvbnMpO1xuICB2YXIgc3ViRG9jUGF0aCA9IG9wdGlvbnMuc3ViRG9jUGF0aCB8fCBbXTtcbiAgdmFyIHN1YkRvY1B0ciA9IHBhdGhUb1B0cihzdWJEb2NQYXRoKTtcbiAgdmFyIGFuY2VzdG9yUHRycyA9IFsnIyddO1xuXG4gIHBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAocGFyZW50LCBpbmRleCkge1xuICAgIGlmIChwYXJlbnQuY2hhckF0KDApICE9PSAnIycpIHtcbiAgICAgIGFuY2VzdG9yUHRycy5wdXNoKHBhcmVudFB0cnNbaW5kZXhdKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFJldmVyc2UgdGhlIG9yZGVyIHNvIHdlIHNlYXJjaCB0aGVtIGluIHRoZSBwcm9wZXIgb3JkZXJcbiAgYW5jZXN0b3JQdHJzLnJldmVyc2UoKTtcblxuICBpZiAoKHBhcmVudHNbcGFyZW50cy5sZW5ndGggLSAxXSB8fCAnJykuY2hhckF0KDApICE9PSAnIycpIHtcbiAgICBhbGxSZWZzLmRvY3VtZW50c1twYXRoVG9QdHIocGFyZW50UGF0aCldID0gb2JqO1xuICB9XG5cbiAgT2JqZWN0LmtleXMocmVmcykuZm9yRWFjaChmdW5jdGlvbiAocmVmUHRyKSB7XG4gICAgdmFyIHJlZkRldGFpbHMgPSByZWZzW3JlZlB0cl07XG4gICAgdmFyIGxvY2F0aW9uO1xuICAgIHZhciBwYXJlbnRJbmRleDtcbiAgICB2YXIgcmVmRnVsbFBhdGg7XG4gICAgdmFyIHJlZkZ1bGxQdHI7XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gcGFyZW50cywgdHJlYXQgdGhlIHJlZmVyZW5jZSBwb2ludGVyIGFzLWlzLiAgT3RoZXJ3aXNlLCB0aGUgcmVmZXJlbmNlIGlzIGEgcmVmZXJlbmNlIHdpdGhpbiBhXG4gICAgLy8gcmVtb3RlIGRvY3VtZW50IGFuZCBpdHMgc3ViIGRvY3VtZW50IHBhdGggcHJlZml4IG11c3QgYmUgcmVtb3ZlZC5cbiAgICBpZiAocGFyZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlZkZ1bGxQYXRoID0gcGFyZW50UGF0aC5jb25jYXQocGF0aEZyb21QdHIocmVmUHRyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZkZ1bGxQYXRoID0gcGFyZW50UGF0aC5jb25jYXQocGF0aEZyb21QdHIocmVmUHRyKS5zbGljZShwYXJlbnRzLmxlbmd0aCA9PT0gMCA/IDAgOiBzdWJEb2NQYXRoLmxlbmd0aCkpO1xuICAgIH1cblxuICAgIHJlZkZ1bGxQdHIgPSBwYXRoVG9QdHIocmVmRnVsbFBhdGgpO1xuXG4gICAgLy8gSXQgaXMgcG9zc2libGUgdG8gcHJvY2VzcyB0aGUgc2FtZSByZWZlcmVuY2UgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGV2ZW50IG9mIGhpZXJhcmNoaWNhbCByZWZlcmVuY2VzIHNvIHdlIGF2b2lkXG4gICAgLy8gcHJvY2Vzc2luZyBhIHJlZmVyZW5jZSBpZiB3ZSd2ZSBhbHJlYWR5IGRvbmUgc28uXG4gICAgaWYgKCFpc1R5cGUoYWxsUmVmc1tyZWZGdWxsUHRyXSwgJ1VuZGVmaW5lZCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVjb3JkIHRoZSByZWZlcmVuY2UgbWV0YWRhdGFcbiAgICBhbGxSZWZzLnJlZnNbcmVmRnVsbFB0cl0gPSByZWZzW3JlZlB0cl07XG5cbiAgICAvLyBEbyBub3QgcHJvY2VzcyBpbnZhbGlkIHJlZmVyZW5jZXNcbiAgICBpZiAoaXNUeXBlKHJlZkRldGFpbHMuZXJyb3IsICdVbmRlZmluZWQnKSAmJiByZWZEZXRhaWxzLnR5cGUgIT09ICdpbnZhbGlkJykge1xuICAgICAgaWYgKHJlbW90ZVR5cGVzLmluZGV4T2YocmVmRGV0YWlscy50eXBlKSA+IC0xKSB7XG4gICAgICAgIGxvY2F0aW9uID0gY29tYmluZVVSSXMob3B0aW9ucy5yZWxhdGl2ZUJhc2UsIHJlZkRldGFpbHMudXJpKTtcbiAgICAgICAgcGFyZW50SW5kZXggPSBwYXJlbnRzLmluZGV4T2YobG9jYXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYXRpb24gPSByZWZEZXRhaWxzLnVyaTtcbiAgICAgICAgcGFyZW50SW5kZXggPSBwYXJlbnRQdHJzLmluZGV4T2YobG9jYXRpb24pO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWNvcmQgYW5jZXN0b3IgcGF0aHNcbiAgICAgIHJlZkRldGFpbHMuYW5jZXN0b3JQdHJzID0gYW5jZXN0b3JQdHJzO1xuXG4gICAgICAvLyBSZWNvcmQgaWYgdGhlIHJlZmVyZW5jZSBpcyBpbmRpcmVjdCBiYXNlZCBvbiBpdHMgcGFyZW50XG4gICAgICByZWZEZXRhaWxzLmluZGlyZWN0ID0gaW5kaXJlY3Q7XG5cbiAgICAgIC8vIE9ubHkgcHJvY2VzcyBub24tY2lyY3VsYXIgcmVmZXJlbmNlcyBmdXJ0aGVyXG4gICAgICBpZiAocGFyZW50SW5kZXggPT09IC0xKSB7XG4gICAgICAgIGlmIChyZW1vdGVUeXBlcy5pbmRleE9mKHJlZkRldGFpbHMudHlwZSkgPiAtMSkge1xuICAgICAgICAgIGFsbFRhc2tzID0gYWxsVGFza3NcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFJlbW90ZURvY3VtZW50KGxvY2F0aW9uLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzU3ViRG9jdW1lbnQoJ3JlbW90ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUeXBlKHJlZkRldGFpbHMudXJpRGV0YWlscy5mcmFnbWVudCwgJ1VuZGVmaW5lZCcpID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aEZyb21QdHIoZGVjb2RlVVJJKHJlZkRldGFpbHMudXJpRGV0YWlscy5mcmFnbWVudCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZEZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLmNvbmNhdChsb2NhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFB0cnMuY29uY2F0KHJlZkZ1bGxQdHIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxSZWZzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpcmVjdCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgcmVmRGV0YWlscy5lcnJvciA9IGVyci5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgcmVmRGV0YWlscy5taXNzaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChyZWZGdWxsUHRyLmluZGV4T2YobG9jYXRpb24gKyAnLycpICE9PSAwICYmIHJlZkZ1bGxQdHIgIT09IGxvY2F0aW9uICYmXG4gICAgICAgICAgICAgIHN1YkRvY1B0ci5pbmRleE9mKGxvY2F0aW9uICsgJy8nKSAhPT0gMCAmJiBzdWJEb2NQdHIgIT09IGxvY2F0aW9uKSB7XG4gICAgICAgICAgICBpZiAobG9jYXRpb24uaW5kZXhPZihzdWJEb2NQdHIgKyAnLycpICE9PSAwKSB7XG4gICAgICAgICAgICAgIGFsbFRhc2tzID0gYWxsVGFza3NcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1N1YkRvY3VtZW50KCdsb2NhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aEZyb21QdHIobG9jYXRpb24pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZEZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLmNvbmNhdChsb2NhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFB0cnMuY29uY2F0KHJlZkZ1bGxQdHIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxSZWZzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpcmVjdCB8fCAobG9jYXRpb24uaW5kZXhPZihzdWJEb2NQdHIgKyAnLycpID09PSAtMSAmJiBsb2NhdGlvbiAhPT0gc3ViRG9jUHRyKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlZkRldGFpbHMuY2lyY3VsYXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTWFyayBzZWVuIGFuY2VzdG9ycyBhcyBjaXJjdWxhclxuICAgICAgICBwYXJlbnRQdHJzLnNsaWNlKHBhcmVudEluZGV4KS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJlbnRQdHIpIHtcbiAgICAgICAgICBhbGxSZWZzLnJlZnNbcGFyZW50UHRyXS5jaXJjdWxhciA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlZkRldGFpbHMuY2lyY3VsYXIgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgYWxsVGFza3MgPSBhbGxUYXNrc1xuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIElkZW50aWZ5IGluZGlyZWN0LCBsb2NhbCBjaXJjdWxhciByZWZlcmVuY2VzIChJc3N1ZSA4MilcbiAgICAgIHZhciBjaXJjdWxhcnMgPSBbXTtcbiAgICAgIHZhciBwcm9jZXNzZWRSZWZQdHJzID0gW107XG4gICAgICB2YXIgcHJvY2Vzc2VkUmVmcyA9IFtdO1xuXG4gICAgICBmdW5jdGlvbiB3YWxrUmVmcyAocGFyZW50UHRycywgcGFyZW50UmVmcywgcmVmUHRyLCByZWYpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoYWxsUmVmcy5yZWZzKS5mb3JFYWNoKGZ1bmN0aW9uIChkUmVmUHRyKSB7XG4gICAgICAgICAgdmFyIGRSZWZEZXRhaWxzID0gYWxsUmVmcy5yZWZzW2RSZWZQdHJdO1xuXG4gICAgICAgICAgLy8gRG8gbm90IHByb2Nlc3MgYWxyZWFkeSBwcm9jZXNzZWQgcmVmZXJlbmNlcyBvciByZWZlcmVuY2VzIHRoYXQgYXJlIG5vdCBhIG5lc3RlZCByZWZlcmVuY2VzXG4gICAgICAgICAgaWYgKHByb2Nlc3NlZFJlZnMuaW5kZXhPZihyZWYpID09PSAtMSAmJiBwcm9jZXNzZWRSZWZQdHJzLmluZGV4T2YocmVmUHRyKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgY2lyY3VsYXJzLmluZGV4T2YocmVmKSA9PT0gLTEgJiYgZFJlZlB0ciAhPT0gcmVmUHRyICYmIGRSZWZQdHIuaW5kZXhPZihyZWYgKyAnLycpID09PSAwKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50UmVmcy5pbmRleE9mKHJlZikgPiAtMSkge1xuICAgICAgICAgICAgICBwYXJlbnRSZWZzLmZvckVhY2goZnVuY3Rpb24gKHBhcmVudFJlZikge1xuICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcnMuaW5kZXhPZihyZWYpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgY2lyY3VsYXJzLnB1c2gocGFyZW50UmVmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd2Fsa1JlZnMocGFyZW50UHRycy5jb25jYXQocmVmUHRyKSwgcGFyZW50UmVmcy5jb25jYXQocmVmKSwgZFJlZlB0ciwgZFJlZkRldGFpbHMudXJpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJvY2Vzc2VkUmVmUHRycy5wdXNoKHJlZlB0cik7XG4gICAgICAgICAgICBwcm9jZXNzZWRSZWZzLnB1c2gocmVmKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBPYmplY3Qua2V5cyhhbGxSZWZzLnJlZnMpLmZvckVhY2goZnVuY3Rpb24gKHJlZlB0cikge1xuICAgICAgICB2YXIgcmVmRGV0YWlscyA9IGFsbFJlZnMucmVmc1tyZWZQdHJdO1xuXG4gICAgICAgIC8vIE9ubHkgcHJvY2VzcyBsb2NhbCwgbm9uLWNpcmN1bGFyIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKHJlZkRldGFpbHMudHlwZSA9PT0gJ2xvY2FsJyAmJiAhcmVmRGV0YWlscy5jaXJjdWxhciAmJiBjaXJjdWxhcnMuaW5kZXhPZihyZWZEZXRhaWxzLnVyaSkgPT09IC0xKSB7XG4gICAgICAgICAgd2Fsa1JlZnMoW10sIFtdLCByZWZQdHIsIHJlZkRldGFpbHMudXJpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIE9iamVjdC5rZXlzKGFsbFJlZnMucmVmcykuZm9yRWFjaChmdW5jdGlvbiAocmVmUHRyKSB7XG4gICAgICAgIHZhciByZWZEZXRhaWxzID0gYWxsUmVmcy5yZWZzW3JlZlB0cl07XG5cbiAgICAgICAgaWYgKGNpcmN1bGFycy5pbmRleE9mKHJlZkRldGFpbHMudXJpKSA+IC0xKSB7XG4gICAgICAgICAgcmVmRGV0YWlscy5jaXJjdWxhciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGFsbFJlZnM7XG4gICAgfSk7XG5cbiAgcmV0dXJuIGFsbFRhc2tzO1xufVxuXG5mdW5jdGlvbiBmaW5kVmFsdWUgKG9iaiwgcGF0aCkge1xuICB2YXIgdmFsdWUgPSBvYmo7XG5cbiAgcGF0aC5mb3JFYWNoKGZ1bmN0aW9uIChzZWcpIHtcbiAgICBzZWcgPSBkZWNvZGVVUkkoc2VnKTtcblxuICAgIGlmIChzZWcgaW4gdmFsdWUpIHtcbiAgICAgIHZhbHVlID0gdmFsdWVbc2VnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgRXJyb3IoJ0pTT04gUG9pbnRlciBwb2ludHMgdG8gbWlzc2luZyBsb2NhdGlvbjogJyArIHBhdGhUb1B0cihwYXRoKSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGdldEV4dHJhUmVmS2V5cyAocmVmKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhyZWYpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGtleSAhPT0gJyRyZWYnO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVmVHlwZSAocmVmRGV0YWlscykge1xuICB2YXIgdHlwZTtcblxuICAvLyBDb252ZXJ0IHRoZSBVUkkgcmVmZXJlbmNlIHRvIG9uZSBvZiBvdXIgdHlwZXNcbiAgc3dpdGNoIChyZWZEZXRhaWxzLnVyaURldGFpbHMucmVmZXJlbmNlKSB7XG4gIGNhc2UgJ2Fic29sdXRlJzpcbiAgY2FzZSAndXJpJzpcbiAgICB0eXBlID0gJ3JlbW90ZSc7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ3NhbWUtZG9jdW1lbnQnOlxuICAgIHR5cGUgPSAnbG9jYWwnO1xuICAgIGJyZWFrO1xuICBkZWZhdWx0OlxuICAgIHR5cGUgPSByZWZEZXRhaWxzLnVyaURldGFpbHMucmVmZXJlbmNlO1xuICB9XG5cbiAgcmV0dXJuIHR5cGU7XG59XG5cbmZ1bmN0aW9uIGdldFJlbW90ZURvY3VtZW50ICh1cmwsIG9wdGlvbnMpIHtcbiAgdmFyIGNhY2hlRW50cnkgPSByZW1vdGVDYWNoZVt1cmxdO1xuICB2YXIgYWxsVGFza3MgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgdmFyIGxvYWRlck9wdGlvbnMgPSBjbG9uZShvcHRpb25zLmxvYWRlck9wdGlvbnMgfHwge30pO1xuXG4gIGlmIChpc1R5cGUoY2FjaGVFbnRyeSwgJ1VuZGVmaW5lZCcpKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gY29udGVudCBwcm9jZXNzb3IsIGRlZmF1bHQgdG8gcHJvY2Vzc2luZyB0aGUgcmF3IHJlc3BvbnNlIGFzIEpTT05cbiAgICBpZiAoaXNUeXBlKGxvYWRlck9wdGlvbnMucHJvY2Vzc0NvbnRlbnQsICdVbmRlZmluZWQnKSkge1xuICAgICAgbG9hZGVyT3B0aW9ucy5wcm9jZXNzQ29udGVudCA9IGZ1bmN0aW9uIChyZXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgSlNPTi5wYXJzZShyZXMudGV4dCkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHJlc291cmNlIHVzaW5nIHBhdGgtbG9hZGVyXG4gICAgYWxsVGFza3MgPSBQYXRoTG9hZGVyLmxvYWQoZGVjb2RlVVJJKHVybCksIGxvYWRlck9wdGlvbnMpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjYWNoZVxuICAgIGFsbFRhc2tzID0gYWxsVGFza3NcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgcmVtb3RlQ2FjaGVbdXJsXSA9IHtcbiAgICAgICAgICB2YWx1ZTogcmVzXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICByZW1vdGVDYWNoZVt1cmxdID0ge1xuICAgICAgICAgIGVycm9yOiBlcnJcbiAgICAgICAgfTtcblxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBSZXR1cm4gdGhlIGNhY2hlZCB2ZXJzaW9uXG4gICAgYWxsVGFza3MgPSBhbGxUYXNrcy50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjYWNoZUVudHJ5LnZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gUmV0dXJuIGEgY2xvbmVkIHZlcnNpb24gdG8gYXZvaWQgdXBkYXRpbmcgdGhlIGNhY2hlXG4gIGFsbFRhc2tzID0gYWxsVGFza3MudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgcmV0dXJuIGNsb25lKHJlcyk7XG4gIH0pO1xuXG4gIHJldHVybiBhbGxUYXNrcztcbn1cblxuZnVuY3Rpb24gaXNSZWZMaWtlIChvYmosIHRocm93V2l0aERldGFpbHMpIHtcbiAgdmFyIHJlZkxpa2UgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgaWYgKCFpc1R5cGUob2JqLCAnT2JqZWN0JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb2JqIGlzIG5vdCBhbiBPYmplY3QnKTtcbiAgICB9IGVsc2UgaWYgKCFpc1R5cGUob2JqLiRyZWYsICdTdHJpbmcnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvYmouJHJlZiBpcyBub3QgYSBTdHJpbmcnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0aHJvd1dpdGhEZXRhaWxzKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgcmVmTGlrZSA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHJlZkxpa2U7XG59XG5cbmZ1bmN0aW9uIGlzVHlwZSAob2JqLCB0eXBlKSB7XG4gIC8vIEEgUGhhbnRvbUpTIGJ1ZyAoaHR0cHM6Ly9naXRodWIuY29tL2FyaXlhL3BoYW50b21qcy9pc3N1ZXMvMTE3MjIpIHByb2hpYml0cyB1cyBmcm9tIHVzaW5nIHRoZSBzYW1lIGFwcHJvYWNoIGZvclxuICAvLyB1bmRlZmluZWQgY2hlY2tpbmcgdGhhdCB3ZSB1c2UgZm9yIG90aGVyIHR5cGVzLlxuICBpZiAodHlwZSA9PT0gJ1VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCAnICsgdHlwZSArICddJztcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlUmVmRmlsdGVyIChvcHRpb25zKSB7XG4gIHZhciByZWZGaWx0ZXI7XG4gIHZhciB2YWxpZFR5cGVzO1xuXG4gIGlmIChpc1R5cGUob3B0aW9ucy5maWx0ZXIsICdBcnJheScpIHx8IGlzVHlwZShvcHRpb25zLmZpbHRlciwgJ1N0cmluZycpKSB7XG4gICAgdmFsaWRUeXBlcyA9IGlzVHlwZShvcHRpb25zLmZpbHRlciwgJ1N0cmluZycpID8gW29wdGlvbnMuZmlsdGVyXSA6IG9wdGlvbnMuZmlsdGVyO1xuICAgIHJlZkZpbHRlciA9IGZ1bmN0aW9uIChyZWZEZXRhaWxzKSB7XG4gICAgICAvLyBDaGVjayB0aGUgZXhhY3QgdHlwZSBvciBmb3IgaW52YWxpZCBVUklzLCBjaGVjayBpdHMgb3JpZ2luYWwgdHlwZVxuICAgICAgcmV0dXJuIHZhbGlkVHlwZXMuaW5kZXhPZihyZWZEZXRhaWxzLnR5cGUpID4gLTEgfHwgdmFsaWRUeXBlcy5pbmRleE9mKGdldFJlZlR5cGUocmVmRGV0YWlscykpID4gLTE7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChpc1R5cGUob3B0aW9ucy5maWx0ZXIsICdGdW5jdGlvbicpKSB7XG4gICAgcmVmRmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gIH0gZWxzZSBpZiAoaXNUeXBlKG9wdGlvbnMuZmlsdGVyLCAnVW5kZWZpbmVkJykpIHtcbiAgICByZWZGaWx0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChyZWZEZXRhaWxzLCBwYXRoKSB7XG4gICAgcmV0dXJuIChyZWZEZXRhaWxzLnR5cGUgIT09ICdpbnZhbGlkJyB8fCBvcHRpb25zLmluY2x1ZGVJbnZhbGlkID09PSB0cnVlKSAmJiByZWZGaWx0ZXIocmVmRGV0YWlscywgcGF0aCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG1ha2VTdWJEb2NQYXRoIChvcHRpb25zKSB7XG4gIHZhciBzdWJEb2NQYXRoO1xuXG4gIGlmIChpc1R5cGUob3B0aW9ucy5zdWJEb2NQYXRoLCAnQXJyYXknKSkge1xuICAgIHN1YkRvY1BhdGggPSBvcHRpb25zLnN1YkRvY1BhdGg7XG4gIH0gZWxzZSBpZiAoaXNUeXBlKG9wdGlvbnMuc3ViRG9jUGF0aCwgJ1N0cmluZycpKSB7XG4gICAgc3ViRG9jUGF0aCA9IHBhdGhGcm9tUHRyKG9wdGlvbnMuc3ViRG9jUGF0aCk7XG4gIH0gZWxzZSBpZiAoaXNUeXBlKG9wdGlvbnMuc3ViRG9jUGF0aCwgJ1VuZGVmaW5lZCcpKSB7XG4gICAgc3ViRG9jUGF0aCA9IFtdO1xuICB9XG5cbiAgcmV0dXJuIHN1YkRvY1BhdGg7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVVJJICh1cmkpIHtcbiAgLy8gV2UgZGVjb2RlIGZpcnN0IHRvIGF2b2lkIGRvdWJseSBlbmNvZGluZ1xuICByZXR1cm4gVVJJLnBhcnNlKGVuY29kZVVSSShkZWNvZGVVUkkodXJpKSkpO1xufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZSAob2JqLCByZWZQYXRoLCB2YWx1ZSkge1xuICBmaW5kVmFsdWUob2JqLCByZWZQYXRoLnNsaWNlKDAsIHJlZlBhdGgubGVuZ3RoIC0gMSkpW2RlY29kZVVSSShyZWZQYXRoW3JlZlBhdGgubGVuZ3RoIC0gMV0pXSA9IHZhbHVlO1xufVxuXG5mdW5jdGlvbiB3YWxrIChhbmNlc3RvcnMsIG5vZGUsIHBhdGgsIGZuKSB7XG4gIHZhciBwcm9jZXNzQ2hpbGRyZW4gPSB0cnVlO1xuXG4gIGZ1bmN0aW9uIHdhbGtJdGVtIChpdGVtLCBzZWdtZW50KSB7XG4gICAgcGF0aC5wdXNoKHNlZ21lbnQpO1xuICAgIHdhbGsoYW5jZXN0b3JzLCBpdGVtLCBwYXRoLCBmbik7XG4gICAgcGF0aC5wb3AoKTtcbiAgfVxuXG4gIC8vIENhbGwgdGhlIGl0ZXJhdGVlXG4gIGlmIChpc1R5cGUoZm4sICdGdW5jdGlvbicpKSB7XG4gICAgcHJvY2Vzc0NoaWxkcmVuID0gZm4oYW5jZXN0b3JzLCBub2RlLCBwYXRoKTtcbiAgfVxuXG4gIC8vIFdlIGRvIG5vdCBwcm9jZXNzIGNpcmN1bGFyIG9iamVjdHMgYWdhaW5cbiAgaWYgKGFuY2VzdG9ycy5pbmRleE9mKG5vZGUpID09PSAtMSkge1xuICAgIGFuY2VzdG9ycy5wdXNoKG5vZGUpO1xuXG4gICAgaWYgKHByb2Nlc3NDaGlsZHJlbiAhPT0gZmFsc2UpIHtcbiAgICAgIGlmIChpc1R5cGUobm9kZSwgJ0FycmF5JykpIHtcbiAgICAgICAgbm9kZS5mb3JFYWNoKGZ1bmN0aW9uIChtZW1iZXIsIGluZGV4KSB7XG4gICAgICAgICAgd2Fsa0l0ZW0obWVtYmVyLCBpbmRleC50b1N0cmluZygpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzVHlwZShub2RlLCAnT2JqZWN0JykpIHtcbiAgICAgICAgT2JqZWN0LmtleXMobm9kZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgd2Fsa0l0ZW0obm9kZVtrZXldLCBrZXkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhbmNlc3RvcnMucG9wKCk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT3B0aW9ucyAob3B0aW9ucywgb2JqKSB7XG4gIGlmIChpc1R5cGUob3B0aW9ucywgJ1VuZGVmaW5lZCcpKSB7XG4gICAgLy8gRGVmYXVsdCB0byBhbiBlbXB0eSBvcHRpb25zIG9iamVjdFxuICAgIG9wdGlvbnMgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDbG9uZSB0aGUgb3B0aW9ucyBzbyB3ZSBkbyBub3QgYWx0ZXIgdGhlIG9uZXMgcGFzc2VkIGluXG4gICAgb3B0aW9ucyA9IGNsb25lKG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKCFpc1R5cGUob3B0aW9ucywgJ09iamVjdCcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucyBtdXN0IGJlIGFuIE9iamVjdCcpO1xuICB9IGVsc2UgaWYgKCFpc1R5cGUob3B0aW9ucy5maWx0ZXIsICdVbmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICFpc1R5cGUob3B0aW9ucy5maWx0ZXIsICdBcnJheScpICYmXG4gICAgICAgICAgICAgIWlzVHlwZShvcHRpb25zLmZpbHRlciwgJ0Z1bmN0aW9uJykgJiZcbiAgICAgICAgICAgICAhaXNUeXBlKG9wdGlvbnMuZmlsdGVyLCAnU3RyaW5nJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLmZpbHRlciBtdXN0IGJlIGFuIEFycmF5LCBhIEZ1bmN0aW9uIG9mIGEgU3RyaW5nJyk7XG4gIH0gZWxzZSBpZiAoIWlzVHlwZShvcHRpb25zLmluY2x1ZGVJbnZhbGlkLCAnVW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAhaXNUeXBlKG9wdGlvbnMuaW5jbHVkZUludmFsaWQsICdCb29sZWFuJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLmluY2x1ZGVJbnZhbGlkIG11c3QgYmUgYSBCb29sZWFuJyk7XG4gIH0gZWxzZSBpZiAoIWlzVHlwZShvcHRpb25zLnJlZlByZVByb2Nlc3NvciwgJ1VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgIWlzVHlwZShvcHRpb25zLnJlZlByZVByb2Nlc3NvciwgJ0Z1bmN0aW9uJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLnJlZlByZVByb2Nlc3NvciBtdXN0IGJlIGEgRnVuY3Rpb24nKTtcbiAgfSBlbHNlIGlmICghaXNUeXBlKG9wdGlvbnMucmVmUG9zdFByb2Nlc3NvciwgJ1VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgIWlzVHlwZShvcHRpb25zLnJlZlBvc3RQcm9jZXNzb3IsICdGdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucy5yZWZQb3N0UHJvY2Vzc29yIG11c3QgYmUgYSBGdW5jdGlvbicpO1xuICB9IGVsc2UgaWYgKCFpc1R5cGUob3B0aW9ucy5zdWJEb2NQYXRoLCAnVW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAhaXNUeXBlKG9wdGlvbnMuc3ViRG9jUGF0aCwgJ0FycmF5JykgJiZcbiAgICAgICAgICAgICAhaXNQdHIob3B0aW9ucy5zdWJEb2NQYXRoKSkge1xuICAgIC8vIElmIGEgcG9pbnRlciBpcyBwcm92aWRlZCwgdGhyb3cgYW4gZXJyb3IgaWYgaXQncyBub3QgdGhlIHByb3BlciB0eXBlXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucy5zdWJEb2NQYXRoIG11c3QgYmUgYW4gQXJyYXkgb2YgcGF0aCBzZWdtZW50cyBvciBhIHZhbGlkIEpTT04gUG9pbnRlcicpO1xuICB9XG5cbiAgb3B0aW9ucy5maWx0ZXIgPSBtYWtlUmVmRmlsdGVyKG9wdGlvbnMpO1xuXG4gIC8vIFNldCB0aGUgc3ViRG9jUGF0aCB0byBhdm9pZCBldmVyeW9uZSBlbHNlIGhhdmluZyB0byBjb21wdXRlIGl0XG4gIG9wdGlvbnMuc3ViRG9jUGF0aCA9IG1ha2VTdWJEb2NQYXRoKG9wdGlvbnMpO1xuXG4gIGlmICghaXNUeXBlKG9iaiwgJ1VuZGVmaW5lZCcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZpbmRWYWx1ZShvYmosIG9wdGlvbnMuc3ViRG9jUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlLnJlcGxhY2UoJ0pTT04gUG9pbnRlcicsICdvcHRpb25zLnN1YkRvY1BhdGgnKTtcblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG4vKiBNb2R1bGUgTWVtYmVycyAqL1xuXG4vKlxuICogRWFjaCBvZiB0aGUgZnVuY3Rpb25zIGJlbG93IGFyZSBkZWZpbmVkIGFzIGZ1bmN0aW9uIHN0YXRlbWVudHMgYW5kICp0aGVuKiBleHBvcnRlZCBpbiB0d28gc3RlcHMgaW5zdGVhZCBvZiBvbmUgZHVlXG4gKiB0byBhIGJ1ZyBpbiBqc2RvYyAoaHR0cHM6Ly9naXRodWIuY29tL2pzZG9jMm1kL2pzZG9jLXBhcnNlL2lzc3Vlcy8xOCkgdGhhdCBjYXVzZXMgb3VyIGRvY3VtZW50YXRpb24gdG8gYmVcbiAqIGdlbmVyYXRlZCBpbXByb3Blcmx5LiAgVGhlIGltcGFjdCB0byB0aGUgdXNlciBpcyBzaWduaWZpY2FudCBlbm91Z2ggZm9yIHVzIHRvIHdhcnJhbnQgd29ya2luZyBhcm91bmQgaXQgdW50aWwgdGhpc1xuICogaXMgZml4ZWQuXG4gKi9cblxuLyoqXG4gKiBUaGUgb3B0aW9ucyB1c2VkIGZvciB2YXJpb3VzIEpzb25SZWZzIEFQSXMuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSnNvblJlZnNPcHRpb25zXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW118ZnVuY3Rpb259IFtmaWx0ZXI9ZnVuY3Rpb24gKCkge3JldHVybiB0cnVlO31dIC0gVGhlIGZpbHRlciB0byB1c2Ugd2hlbiBnYXRoZXJpbmcgSlNPTlxuICogUmVmZXJlbmNlcyAqKElmIHRoaXMgdmFsdWUgaXMgYSBzaW5nbGUgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MsIHRoZSB2YWx1ZShzKSBhcmUgZXhwZWN0ZWQgdG8gYmUgdGhlIGB0eXBlKHMpYFxuICogeW91IGFyZSBpbnRlcmVzdGVkIGluIGNvbGxlY3RpbmcgYXMgZGVzY3JpYmVkIGluIHtAbGluayBtb2R1bGU6SnNvblJlZnMuZ2V0UmVmRGV0YWlsc30uICBJZiBpdCBpcyBhIGZ1bmN0aW9uLCBpdCBpc1xuICogZXhwZWN0ZWQgdGhhdCB0aGUgZnVuY3Rpb24gYmVoYXZlcyBsaWtlIHtAbGluayBtb2R1bGU6SnNvblJlZnN+UmVmRGV0YWlsc0ZpbHRlcn0uKSpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVJbnZhbGlkPWZhbHNlXSAtIFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgaW52YWxpZCBKU09OIFJlZmVyZW5jZSBkZXRhaWxzICooVGhpcyB3aWxsIG1ha2VcbiAqIGl0IHNvIHRoYXQgb2JqZWN0cyB0aGF0IGFyZSBsaWtlIEpTT04gUmVmZXJlbmNlIG9iamVjdHMsIGFzIGluIHRoZXkgYXJlIGFuIGBPYmplY3RgIGFuZCB0aGUgaGF2ZSBhIGAkcmVmYCBwcm9wZXJ0eSxcbiAqIGJ1dCBmYWlsIHZhbGlkYXRpb24gd2lsbCBiZSBpbmNsdWRlZC4gIFRoaXMgaXMgdmVyeSB1c2VmdWwgZm9yIHdoZW4geW91IHdhbnQgdG8ga25vdyBpZiB5b3UgaGF2ZSBpbnZhbGlkIEpTT05cbiAqIFJlZmVyZW5jZSBkZWZpbml0aW9ucy4gIFRoaXMgd2lsbCBub3QgbWVhbiB0aGF0IEFQSXMgd2lsbCBwcm9jZXNzIGludmFsaWQgSlNPTiBSZWZlcmVuY2VzIGJ1dCB0aGUgcmVhc29ucyBhcyB0byB3aHlcbiAqIHRoZSBKU09OIFJlZmVyZW5jZXMgYXJlIGludmFsaWQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmV0dXJuZWQgbWV0YWRhdGEuKSpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbbG9hZGVyT3B0aW9uc10gLSBUaGUgb3B0aW9ucyB0byBwYXNzIHRvXG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3doaXRsb2NramMvcGF0aC1sb2FkZXIvYmxvYi9tYXN0ZXIvZG9jcy9BUEkubWQjbW9kdWxlX1BhdGhMb2FkZXIubG9hZHxQYXRoTG9hZGVyfmxvYWR9XG4gKiBAcGFyYW0ge21vZHVsZTpKc29uUmVmc35SZWZQcmVQcm9jZXNzb3J9IFtyZWZQcmVQcm9jZXNzb3JdIC0gVGhlIGNhbGxiYWNrIHVzZWQgdG8gcHJlLXByb2Nlc3MgYSBKU09OIFJlZmVyZW5jZSBsaWtlXG4gKiBvYmplY3QgKihUaGlzIGlzIGNhbGxlZCBwcmlvciB0byB2YWxpZGF0aW5nIHRoZSBKU09OIFJlZmVyZW5jZSBsaWtlIG9iamVjdCBhbmQgZ2V0dGluZyBpdHMgZGV0YWlscykqXG4gKiBAcGFyYW0ge21vZHVsZTpKc29uUmVmc35SZWZQb3N0UHJvY2Vzc29yfSBbcmVmUG9zdFByb2Nlc3Nvcl0gLSBUaGUgY2FsbGJhY2sgdXNlZCB0byBwb3N0LXByb2Nlc3MgdGhlIEpTT04gUmVmZXJlbmNlXG4gKiBtZXRhZGF0YSAqKFRoaXMgaXMgY2FsbGVkIHByaW9yIGZpbHRlcmluZyB0aGUgcmVmZXJlbmNlcykqXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucmVsYXRpdmVCYXNlXSAtIFRoZSBiYXNlIGxvY2F0aW9uIHRvIHVzZSB3aGVuIHJlc29sdmluZyByZWxhdGl2ZSByZWZlcmVuY2VzICooT25seSB1c2VmdWxcbiAqIGZvciBBUElzIHRoYXQgZG8gcmVtb3RlIHJlZmVyZW5jZSByZXNvbHV0aW9uLiAgSWYgdGhpcyB2YWx1ZSBpcyBub3QgZGVmaW5lZCxcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vd2hpdGxvY2tqYy9wYXRoLWxvYWRlcnxwYXRoLWxvYWRlcn0gd2lsbCB1c2UgYHdpbmRvdy5sb2NhdGlvbi5ocmVmYCBmb3IgdGhlIGJyb3dzZXIgYW5kXG4gKiBgcHJvY2Vzcy5jd2QoKWAgZm9yIE5vZGUuanMuKSpcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbb3B0aW9ucy5zdWJEb2NQYXRoPVtdXSAtIFRoZSBKU09OIFBvaW50ZXIgb3IgYXJyYXkgb2YgcGF0aCBzZWdtZW50cyB0byB0aGUgc3ViIGRvY3VtZW50XG4gKiBsb2NhdGlvbiB0byBzZWFyY2ggZnJvbVxuICovXG5cbi8qKlxuICogU2ltcGxlIGZ1bmN0aW9uIHVzZWQgdG8gZmlsdGVyIG91dCBKU09OIFJlZmVyZW5jZXMuXG4gKlxuICogQHR5cGVkZWYge2Z1bmN0aW9ufSBSZWZEZXRhaWxzRmlsdGVyXG4gKlxuICogQHBhcmFtIHttb2R1bGU6SnNvblJlZnN+VW5yZXNvbHZlZFJlZkRldGFpbHN9IHJlZkRldGFpbHMgLSBUaGUgSlNPTiBSZWZlcmVuY2UgZGV0YWlscyB0byB0ZXN0XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIEpTT04gUmVmZXJlbmNlXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIEpTT04gUmVmZXJlbmNlIHNob3VsZCBiZSBmaWx0ZXJlZCAqKG91dCkqIG9yIG5vdFxuICovXG5cbi8qKlxuICogU2ltcGxlIGZ1bmN0aW9uIHVzZWQgdG8gcHJlLXByb2Nlc3MgYSBKU09OIFJlZmVyZW5jZSBsaWtlIG9iamVjdC5cbiAqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb259IFJlZlByZVByb2Nlc3NvclxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmogLSBUaGUgSlNPTiBSZWZlcmVuY2UgbGlrZSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgSlNPTiBSZWZlcmVuY2UgbGlrZSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgcHJvY2Vzc2VkIEpTT04gUmVmZXJlbmNlIGxpa2Ugb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBTaW1wbGUgZnVuY3Rpb24gdXNlZCB0byBwb3N0LXByb2Nlc3MgYSBKU09OIFJlZmVyZW5jZSBkZXRhaWxzLlxuICpcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbn0gUmVmUG9zdFByb2Nlc3NvclxuICpcbiAqIEBwYXJhbSB7bW9kdWxlOkpzb25SZWZzflVucmVzb2x2ZWRSZWZEZXRhaWxzfSByZWZEZXRhaWxzIC0gVGhlIEpTT04gUmVmZXJlbmNlIGRldGFpbHMgdG8gdGVzdFxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBKU09OIFJlZmVyZW5jZVxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9IHRoZSBwcm9jZXNzZWQgSlNPTiBSZWZlcmVuY2UgZGV0YWlscyBvYmplY3RcbiAqL1xuXG4vKipcbiAqIERldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHJlc29sdmVkIEpTT04gUmVmZXJlbmNlcy5cbiAqXG4gKiBAdHlwZWRlZiB7bW9kdWxlOkpzb25SZWZzflVucmVzb2x2ZWRSZWZEZXRhaWxzfSBSZXNvbHZlZFJlZkRldGFpbHNcbiAqXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjaXJjdWxhcl0gLSBXaGV0aGVyIG9yIG5vdCB0aGUgSlNPTiBSZWZlcmVuY2UgaXMgY2lyY3VsYXIgKihXaWxsIG5vdCBiZSBzZXQgaWYgdGhlIEpTT05cbiAqIFJlZmVyZW5jZSBpcyBub3QgY2lyY3VsYXIpKlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbWlzc2luZ10gLSBXaGV0aGVyIG9yIG5vdCB0aGUgcmVmZXJlbmNlZCB2YWx1ZSB3YXMgbWlzc2luZyBvciBub3QgKihXaWxsIG5vdCBiZSBzZXQgaWYgdGhlXG4gKiByZWZlcmVuY2VkIHZhbHVlIGlzIG5vdCBtaXNzaW5nKSpcbiAqIEBwcm9wZXJ0eSB7Kn0gW3ZhbHVlXSAtIFRoZSByZWZlcmVuY2VkIHZhbHVlICooV2lsbCBub3QgYmUgc2V0IGlmIHRoZSByZWZlcmVuY2VkIHZhbHVlIGlzIG1pc3NpbmcpKlxuICovXG5cbi8qKlxuICogVGhlIHJlc3VsdHMgb2YgcmVzb2x2aW5nIHRoZSBKU09OIFJlZmVyZW5jZXMgb2YgYW4gYXJyYXkvb2JqZWN0LlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlc29sdmVkUmVmc1Jlc3VsdHNcbiAqXG4gKiBAcHJvcGVydHkge21vZHVsZTpKc29uUmVmc35SZXNvbHZlZFJlZkRldGFpbHN9IHJlZnMgLSBBbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgSlNPTiBQb2ludGVycyAqKGZyYWdtZW50IHZlcnNpb24pKlxuICogdG8gd2hlcmUgdGhlIEpTT04gUmVmZXJlbmNlIGlzIGRlZmluZWQgYW5kIHdob3NlIHZhbHVlcyBhcmUge0BsaW5rIG1vZHVsZTpKc29uUmVmc35SZXNvbHZlZFJlZkRldGFpbHN9XG4gKiBAcHJvcGVydHkge29iamVjdH0gcmVzb2x2ZWQgLSBUaGUgYXJyYXkvb2JqZWN0IHdpdGggaXRzIEpTT04gUmVmZXJlbmNlcyBmdWxseSByZXNvbHZlZFxuICovXG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJldHJpZXZlZCBkb2N1bWVudCBhbmQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgaXRzIEpTT04gUmVmZXJlbmNlcy5cbiAqXG4gKiBAdHlwZWRlZiB7bW9kdWxlOkpzb25SZWZzflJlc29sdmVkUmVmc1Jlc3VsdHN9IFJldHJpZXZlZFJlZnNSZXN1bHRzXG4gKlxuICogQHByb3BlcnR5IHtvYmplY3R9IHZhbHVlIC0gVGhlIHJldHJpZXZlZCBkb2N1bWVudFxuICovXG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJldHJpZXZlZCBkb2N1bWVudCwgdGhlIGRvY3VtZW50IHdpdGggaXRzIHJlZmVyZW5jZXMgcmVzb2x2ZWQgYW5kICBkZXRhaWxlZCBpbmZvcm1hdGlvblxuICogYWJvdXQgaXRzIEpTT04gUmVmZXJlbmNlcy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZXRyaWV2ZWRSZXNvbHZlZFJlZnNSZXN1bHRzXG4gKlxuICogQHByb3BlcnR5IHttb2R1bGU6SnNvblJlZnN+VW5yZXNvbHZlZFJlZkRldGFpbHN9IHJlZnMgLSBBbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgSlNPTiBQb2ludGVycyAqKGZyYWdtZW50IHZlcnNpb24pKlxuICogdG8gd2hlcmUgdGhlIEpTT04gUmVmZXJlbmNlIGlzIGRlZmluZWQgYW5kIHdob3NlIHZhbHVlcyBhcmUge0BsaW5rIG1vZHVsZTpKc29uUmVmc35VbnJlc29sdmVkUmVmRGV0YWlsc31cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRSZWZzUmVzdWx0c30gLSBBbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgSlNPTiBQb2ludGVycyAqKGZyYWdtZW50IHZlcnNpb24pKlxuICogdG8gd2hlcmUgdGhlIEpTT04gUmVmZXJlbmNlIGlzIGRlZmluZWQgYW5kIHdob3NlIHZhbHVlcyBhcmUge0BsaW5rIG1vZHVsZTpKc29uUmVmc35SZXNvbHZlZFJlZkRldGFpbHN9XG4gKiBAcHJvcGVydHkge29iamVjdH0gdmFsdWUgLSBUaGUgcmV0cmlldmVkIGRvY3VtZW50XG4gKi9cblxuLyoqXG4gKiBEZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB1bnJlc29sdmVkIEpTT04gUmVmZXJlbmNlcy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVbnJlc29sdmVkUmVmRGV0YWlsc1xuICpcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBkZWYgLSBUaGUgSlNPTiBSZWZlcmVuY2UgZGVmaW5pdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlcnJvcl0gLSBUaGUgZXJyb3IgaW5mb3JtYXRpb24gZm9yIGludmFsaWQgSlNPTiBSZWZlcmVuY2UgZGVmaW5pdGlvbiAqKE9ubHkgcHJlc2VudCB3aGVuIHRoZVxuICogSlNPTiBSZWZlcmVuY2UgZGVmaW5pdGlvbiBpcyBpbnZhbGlkIG9yIHRoZXJlIHdhcyBhIHByb2JsZW0gcmV0cmlldmluZyBhIHJlbW90ZSByZWZlcmVuY2UgZHVyaW5nIHJlc29sdXRpb24pKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVyaSAtIFRoZSBVUkkgcG9ydGlvbiBvZiB0aGUgSlNPTiBSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSB1cmlEZXRhaWxzIC0gRGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFVSSSBhcyBwcm92aWRlZCBieVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9nYXJ5Y291cnQvdXJpLWpzfFVSSS5wYXJzZX0uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSAtIFRoZSBKU09OIFJlZmVyZW5jZSB0eXBlICooVGhpcyB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6IGBpbnZhbGlkYCwgYGxvY2FsYCxcbiAqIGByZWxhdGl2ZWAgb3IgYHJlbW90ZWAuKSpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbd2FybmluZ10gLSBUaGUgd2FybmluZyBpbmZvcm1hdGlvbiAqKE9ubHkgcHJlc2VudCB3aGVuIHRoZSBKU09OIFJlZmVyZW5jZSBkZWZpbml0aW9uIHByb2R1Y2VzIGFcbiAqIHdhcm5pbmcpKlxuICovXG5cbi8qKlxuICogQ2xlYXJzIHRoZSBpbnRlcm5hbCBjYWNoZSBvZiByZW1vdGUgZG9jdW1lbnRzLCByZWZlcmVuY2UgZGV0YWlscywgZXRjLlxuICpcbiAqIEBhbGlhcyBtb2R1bGU6SnNvblJlZnMuY2xlYXJDYWNoZVxuICovXG5mdW5jdGlvbiBjbGVhckNhY2hlICgpIHtcbiAgcmVtb3RlQ2FjaGUgPSB7fTtcbn1cblxuLyoqXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBwYXRoIHNlZ21lbnRzIGFuZCBkZWNvZGVzIHRoZSBKU09OIFBvaW50ZXIgdG9rZW5zIGluIHRoZW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aCAtIFRoZSBhcnJheSBvZiBwYXRoIHNlZ21lbnRzXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGFycmF5IG9mIHBhdGggc2VnbWVudHMgd2l0aCB0aGVpciBKU09OIFBvaW50ZXIgdG9rZW5zIGRlY29kZWRcbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHBhdGggaXMgbm90IGFuIGBBcnJheWBcbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjkwMSNzZWN0aW9uLTN9XG4gKlxuICogQGFsaWFzIG1vZHVsZTpKc29uUmVmcy5kZWNvZGVQYXRoXG4gKi9cbmZ1bmN0aW9uIGRlY29kZVBhdGggKHBhdGgpIHtcbiAgaWYgKCFpc1R5cGUocGF0aCwgJ0FycmF5JykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXRoIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgfVxuXG4gIHJldHVybiBwYXRoLm1hcChmdW5jdGlvbiAoc2VnKSB7XG4gICAgaWYgKCFpc1R5cGUoc2VnLCAnU3RyaW5nJykpIHtcbiAgICAgIHNlZyA9IEpTT04uc3RyaW5naWZ5KHNlZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlY29kZVVSSShzZWcucmVwbGFjZSgvfjEvZywgJy8nKS5yZXBsYWNlKC9+MC9nLCAnficpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGFrZXMgYW4gYXJyYXkgb2YgcGF0aCBzZWdtZW50cyBhbmQgZW5jb2RlcyB0aGUgc3BlY2lhbCBKU09OIFBvaW50ZXIgY2hhcmFjdGVycyBpbiB0aGVtLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGggLSBUaGUgYXJyYXkgb2YgcGF0aCBzZWdtZW50c1xuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBhcnJheSBvZiBwYXRoIHNlZ21lbnRzIHdpdGggdGhlaXIgSlNPTiBQb2ludGVyIHRva2VucyBlbmNvZGVkXG4gKlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBwYXRoIGlzIG5vdCBhbiBgQXJyYXlgXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY5MDEjc2VjdGlvbi0zfVxuICpcbiAqIEBhbGlhcyBtb2R1bGU6SnNvblJlZnMuZW5jb2RlUGF0aFxuICovXG5mdW5jdGlvbiBlbmNvZGVQYXRoIChwYXRoKSB7XG4gIGlmICghaXNUeXBlKHBhdGgsICdBcnJheScpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGF0aCBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gIH1cblxuICByZXR1cm4gcGF0aC5tYXAoZnVuY3Rpb24gKHNlZykge1xuICAgIGlmICghaXNUeXBlKHNlZywgJ1N0cmluZycpKSB7XG4gICAgICBzZWcgPSBKU09OLnN0cmluZ2lmeShzZWcpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWcucmVwbGFjZSgvfi9nLCAnfjAnKS5yZXBsYWNlKC9cXC8vZywgJ34xJyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEZpbmRzIEpTT04gUmVmZXJlbmNlcyBkZWZpbmVkIHdpdGhpbiB0aGUgcHJvdmlkZWQgYXJyYXkvb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7YXJyYXl8b2JqZWN0fSBvYmogLSBUaGUgc3RydWN0dXJlIHRvIGZpbmQgSlNPTiBSZWZlcmVuY2VzIHdpdGhpblxuICogQHBhcmFtIHttb2R1bGU6SnNvblJlZnN+SnNvblJlZnNPcHRpb25zfSBbb3B0aW9uc10gLSBUaGUgSnNvblJlZnMgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9IGFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSBKU09OIFBvaW50ZXJzICooZnJhZ21lbnQgdmVyc2lvbikqIHRvIHdoZXJlIHRoZSBKU09OIFJlZmVyZW5jZSBpcyBkZWZpbmVkXG4gKiBhbmQgd2hvc2UgdmFsdWVzIGFyZSB7QGxpbmsgbW9kdWxlOkpzb25SZWZzflVucmVzb2x2ZWRSZWZEZXRhaWxzfS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gd2hlbiB0aGUgaW5wdXQgYXJndW1lbnRzIGZhaWwgdmFsaWRhdGlvbiBvciBpZiBgb3B0aW9ucy5zdWJEb2NQYXRoYCBwb2ludHMgdG8gYW4gaW52YWxpZCBsb2NhdGlvblxuICpcbiAqIEBhbGlhcyBtb2R1bGU6SnNvblJlZnMuZmluZFJlZnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRmluZGluZyBhbGwgdmFsaWQgcmVmZXJlbmNlc1xuICogdmFyIGFsbFJlZnMgPSBKc29uUmVmcy5maW5kUmVmcyhvYmopO1xuICogLy8gRmluZGluZyBhbGwgcmVtb3RlIHJlZmVyZW5jZXNcbiAqIHZhciByZW1vdGVSZWZzID0gSnNvblJlZnMuZmluZFJlZnMob2JqLCB7ZmlsdGVyOiBbJ3JlbGF0aXZlJywgJ3JlbW90ZSddfSk7XG4gKiAvLyBGaW5kaW5nIGFsbCBpbnZhbGlkIHJlZmVyZW5jZXNcbiAqIHZhciBpbnZhbGlkUmVmcyA9IEpzb25SZWZzLmZpbmRSZWZzKG9iaiwge2ZpbHRlcjogJ2ludmFsaWQnLCBpbmNsdWRlSW52YWxpZDogdHJ1ZX0pO1xuICovXG5mdW5jdGlvbiBmaW5kUmVmcyAob2JqLCBvcHRpb25zKSB7XG4gIHZhciByZWZzID0ge307XG5cbiAgLy8gVmFsaWRhdGUgdGhlIHByb3ZpZGVkIGRvY3VtZW50XG4gIGlmICghaXNUeXBlKG9iaiwgJ0FycmF5JykgJiYgIWlzVHlwZShvYmosICdPYmplY3QnKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29iaiBtdXN0IGJlIGFuIEFycmF5IG9yIGFuIE9iamVjdCcpO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgb3B0aW9uc1xuICBvcHRpb25zID0gdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMsIG9iaik7XG5cbiAgLy8gV2FsayB0aGUgZG9jdW1lbnQgKG9yIHN1YiBkb2N1bWVudCkgYW5kIGZpbmQgYWxsIEpTT04gUmVmZXJlbmNlc1xuICB3YWxrKGZpbmRBbmNlc3RvcnMob2JqLCBvcHRpb25zLnN1YkRvY1BhdGgpLFxuICAgICAgIGZpbmRWYWx1ZShvYmosIG9wdGlvbnMuc3ViRG9jUGF0aCksXG4gICAgICAgY2xvbmUob3B0aW9ucy5zdWJEb2NQYXRoKSxcbiAgICAgICBmdW5jdGlvbiAoYW5jZXN0b3JzLCBub2RlLCBwYXRoKSB7XG4gICAgICAgICB2YXIgcHJvY2Vzc0NoaWxkcmVuID0gdHJ1ZTtcbiAgICAgICAgIHZhciByZWZEZXRhaWxzO1xuXG4gICAgICAgICBpZiAoaXNSZWZMaWtlKG5vZGUpKSB7XG4gICAgICAgICAgIC8vIFByZS1wcm9jZXNzIHRoZSBub2RlIHdoZW4gbmVjZXNzYXJ5XG4gICAgICAgICAgIGlmICghaXNUeXBlKG9wdGlvbnMucmVmUHJlUHJvY2Vzc29yLCAnVW5kZWZpbmVkJykpIHtcbiAgICAgICAgICAgICBub2RlID0gb3B0aW9ucy5yZWZQcmVQcm9jZXNzb3IoY2xvbmUobm9kZSksIHBhdGgpO1xuICAgICAgICAgICB9XG5cbiAgICAgICAgICAgcmVmRGV0YWlscyA9IGdldFJlZkRldGFpbHMobm9kZSk7XG5cbiAgICAgICAgICAgLy8gUG9zdC1wcm9jZXNzIHRoZSByZWZlcmVuY2UgZGV0YWlsc1xuICAgICAgICAgICBpZiAoIWlzVHlwZShvcHRpb25zLnJlZlBvc3RQcm9jZXNzb3IsICdVbmRlZmluZWQnKSkge1xuICAgICAgICAgICAgIHJlZkRldGFpbHMgPSBvcHRpb25zLnJlZlBvc3RQcm9jZXNzb3IocmVmRGV0YWlscywgcGF0aCk7XG4gICAgICAgICAgIH1cblxuICAgICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXIocmVmRGV0YWlscywgcGF0aCkpIHtcbiAgICAgICAgICAgICByZWZzW3BhdGhUb1B0cihwYXRoKV0gPSByZWZEZXRhaWxzO1xuICAgICAgICAgICB9XG5cbiAgICAgICAgICAgLy8gV2hlbmV2ZXIgYSBKU09OIFJlZmVyZW5jZSBoYXMgZXh0cmEgY2hpbGRyZW4sIGl0cyBjaGlsZHJlbiBzaG91bGQgbm90IGJlIHByb2Nlc3NlZC5cbiAgICAgICAgICAgLy8gICBTZWU6IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LXBicnlhbi16eXAtanNvbi1yZWYtMDMjc2VjdGlvbi0zXG4gICAgICAgICAgIGlmIChnZXRFeHRyYVJlZktleXMobm9kZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgIHByb2Nlc3NDaGlsZHJlbiA9IGZhbHNlO1xuICAgICAgICAgICB9XG4gICAgICAgICB9XG5cbiAgICAgICAgIHJldHVybiBwcm9jZXNzQ2hpbGRyZW47XG4gICAgICAgfSk7XG5cbiAgcmV0dXJuIHJlZnM7XG59XG5cbi8qKlxuICogRmluZHMgSlNPTiBSZWZlcmVuY2VzIGRlZmluZWQgd2l0aGluIHRoZSBkb2N1bWVudCBhdCB0aGUgcHJvdmlkZWQgbG9jYXRpb24uXG4gKlxuICogVGhpcyBBUEkgaXMgaWRlbnRpY2FsIHRvIHtAbGluayBtb2R1bGU6SnNvblJlZnMuZmluZFJlZnN9IGV4Y2VwdCB0aGlzIEFQSSB3aWxsIHJldHJpZXZlIGEgcmVtb3RlIGRvY3VtZW50IGFuZCB0aGVuXG4gKiByZXR1cm4gdGhlIHJlc3VsdCBvZiB7QGxpbmsgbW9kdWxlOkpzb25SZWZzLmZpbmRSZWZzfSBvbiB0aGUgcmV0cmlldmVkIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiAtIFRoZSBsb2NhdGlvbiB0byByZXRyaWV2ZSAqKENhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSwganVzdCBtYWtlIHN1cmUgeW91IGxvb2sgYXQgdGhlXG4gKiB7QGxpbmsgbW9kdWxlOkpzb25SZWZzfkpzb25SZWZzT3B0aW9uc3xvcHRpb25zIGRvY3VtZW50YXRpb259IHRvIHNlZSBob3cgcmVsYXRpdmUgcmVmZXJlbmNlcyBhcmUgaGFuZGxlZC4pKlxuICogQHBhcmFtIHttb2R1bGU6SnNvblJlZnN+SnNvblJlZnNPcHRpb25zfSBbb3B0aW9uc10gLSBUaGUgSnNvblJlZnMgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhIHtAbGluayBtb2R1bGU6SnNvblJlZnN+UmV0cmlldmVkUmVmc1Jlc3VsdHN9IGFuZCByZWplY3RzIHdpdGggYW5cbiAqIGBFcnJvcmAgd2hlbiB0aGUgaW5wdXQgYXJndW1lbnRzIGZhaWwgdmFsaWRhdGlvbiwgd2hlbiBgb3B0aW9ucy5zdWJEb2NQYXRoYCBwb2ludHMgdG8gYW4gaW52YWxpZCBsb2NhdGlvbiBvciB3aGVuXG4gKiAgdGhlIGxvY2F0aW9uIGFyZ3VtZW50IHBvaW50cyB0byBhbiB1bmxvYWRhYmxlIHJlc291cmNlXG4gKlxuICogQGFsaWFzIG1vZHVsZTpKc29uUmVmcy5maW5kUmVmc0F0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgdGhhdCBvbmx5IHJlc29sdmVzIHJlZmVyZW5jZXMgd2l0aGluIGEgc3ViIGRvY3VtZW50XG4gKiBKc29uUmVmcy5maW5kUmVmc0F0KCdodHRwOi8vcGV0c3RvcmUuc3dhZ2dlci5pby92Mi9zd2FnZ2VyLmpzb24nLCB7XG4gKiAgICAgc3ViRG9jUGF0aDogJyMvZGVmaW5pdGlvbnMnXG4gKiAgIH0pXG4gKiAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAqICAgICAgLy8gRG8gc29tZXRoaW5nIHdpdGggdGhlIHJlc3BvbnNlXG4gKiAgICAgIC8vXG4gKiAgICAgIC8vIHJlcy5yZWZzOiBKU09OIFJlZmVyZW5jZSBsb2NhdGlvbnMgYW5kIGRldGFpbHNcbiAqICAgICAgLy8gcmVzLnZhbHVlOiBUaGUgcmV0cmlldmVkIGRvY3VtZW50XG4gKiAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAqICAgICBjb25zb2xlLmxvZyhlcnIuc3RhY2spO1xuICogICB9KTtcbiAqL1xuZnVuY3Rpb24gZmluZFJlZnNBdCAobG9jYXRpb24sIG9wdGlvbnMpIHtcbiAgdmFyIGFsbFRhc2tzID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgYWxsVGFza3MgPSBhbGxUYXNrc1xuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBwcm92aWRlZCBsb2NhdGlvblxuICAgICAgaWYgKCFpc1R5cGUobG9jYXRpb24sICdTdHJpbmcnKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdsb2NhdGlvbiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG9wdGlvbnNcbiAgICAgIG9wdGlvbnMgPSB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICAgIC8vIENvbWJpbmUgdGhlIGxvY2F0aW9uIGFuZCB0aGUgb3B0aW9uYWwgcmVsYXRpdmUgYmFzZVxuICAgICAgbG9jYXRpb24gPSBjb21iaW5lVVJJcyhvcHRpb25zLnJlbGF0aXZlQmFzZSwgbG9jYXRpb24pO1xuXG4gICAgICByZXR1cm4gZ2V0UmVtb3RlRG9jdW1lbnQobG9jYXRpb24sIG9wdGlvbnMpO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgdmFyIGNhY2hlRW50cnkgPSBjbG9uZShyZW1vdGVDYWNoZVtsb2NhdGlvbl0pO1xuICAgICAgdmFyIGNPcHRpb25zID0gY2xvbmUob3B0aW9ucyk7XG4gICAgICB2YXIgdXJpRGV0YWlscyA9IHBhcnNlVVJJKGxvY2F0aW9uKTtcblxuICAgICAgaWYgKGlzVHlwZShjYWNoZUVudHJ5LnJlZnMsICdVbmRlZmluZWQnKSkge1xuICAgICAgICAvLyBEbyBub3QgZmlsdGVyIGFueSByZWZlcmVuY2VzIHNvIHRoZSBjYWNoZSBpcyBjb21wbGV0ZVxuICAgICAgICBkZWxldGUgY09wdGlvbnMuZmlsdGVyO1xuICAgICAgICBkZWxldGUgY09wdGlvbnMuc3ViRG9jUGF0aDtcblxuICAgICAgICBjT3B0aW9ucy5pbmNsdWRlSW52YWxpZCA9IHRydWU7XG5cbiAgICAgICAgcmVtb3RlQ2FjaGVbbG9jYXRpb25dLnJlZnMgPSBmaW5kUmVmcyhyZXMsIGNPcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHRoZSBmaWx0ZXIgb3B0aW9ucyBiYWNrXG4gICAgICBpZiAoIWlzVHlwZShvcHRpb25zLmZpbHRlciwgJ1VuZGVmaW5lZCcpKSB7XG4gICAgICAgIGNPcHRpb25zLmZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzVHlwZSh1cmlEZXRhaWxzLmZyYWdtZW50LCAnVW5kZWZpbmVkJykpIHtcbiAgICAgICAgY09wdGlvbnMuc3ViRG9jUGF0aCA9IHBhdGhGcm9tUHRyKGRlY29kZVVSSSh1cmlEZXRhaWxzLmZyYWdtZW50KSk7XG4gICAgICB9IGVsc2UgaWYgKCFpc1R5cGUodXJpRGV0YWlscy5zdWJEb2NQYXRoLCAnVW5kZWZpbmVkJykpIHtcbiAgICAgICAgY09wdGlvbnMuc3ViRG9jUGF0aCA9IG9wdGlvbnMuc3ViRG9jUGF0aDtcbiAgICAgIH1cblxuICAgICAgLy8gVGhpcyB3aWxsIHVzZSB0aGUgY2FjaGUgc28gZG9uJ3Qgd29ycnkgYWJvdXQgY2FsbGluZyBpdCB0d2ljZVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVmczogZmluZFJlZnMocmVzLCBjT3B0aW9ucyksXG4gICAgICAgIHZhbHVlOiByZXNcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgcmV0dXJuIGFsbFRhc2tzO1xufVxuXG4vKipcbiAqIFJldHVybnMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEpTT04gUmVmZXJlbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmogLSBUaGUgSlNPTiBSZWZlcmVuY2UgZGVmaW5pdGlvblxuICpcbiAqIEByZXR1cm5zIHttb2R1bGU6SnNvblJlZnN+VW5yZXNvbHZlZFJlZkRldGFpbHN9IHRoZSBkZXRhaWxlZCBpbmZvcm1hdGlvblxuICpcbiAqIEBhbGlhcyBtb2R1bGU6SnNvblJlZnMuZ2V0UmVmRGV0YWlsc1xuICovXG5mdW5jdGlvbiBnZXRSZWZEZXRhaWxzIChvYmopIHtcbiAgdmFyIGRldGFpbHMgPSB7XG4gICAgZGVmOiBvYmpcbiAgfTtcbiAgdmFyIGNhY2hlS2V5O1xuICB2YXIgZXh0cmFLZXlzO1xuICB2YXIgdXJpRGV0YWlscztcblxuICB0cnkge1xuICAgIGlmIChpc1JlZkxpa2Uob2JqLCB0cnVlKSkge1xuICAgICAgY2FjaGVLZXkgPSBvYmouJHJlZjtcbiAgICAgIHVyaURldGFpbHMgPSB1cmlEZXRhaWxzQ2FjaGVbY2FjaGVLZXldO1xuXG4gICAgICBpZiAoaXNUeXBlKHVyaURldGFpbHMsICdVbmRlZmluZWQnKSkge1xuICAgICAgICB1cmlEZXRhaWxzID0gdXJpRGV0YWlsc0NhY2hlW2NhY2hlS2V5XSA9IHBhcnNlVVJJKGNhY2hlS2V5KTtcbiAgICAgIH1cblxuICAgICAgZGV0YWlscy51cmkgPSBjYWNoZUtleTtcbiAgICAgIGRldGFpbHMudXJpRGV0YWlscyA9IHVyaURldGFpbHM7XG5cbiAgICAgIGlmIChpc1R5cGUodXJpRGV0YWlscy5lcnJvciwgJ1VuZGVmaW5lZCcpKSB7XG4gICAgICAgIGRldGFpbHMudHlwZSA9IGdldFJlZlR5cGUoZGV0YWlscyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXRhaWxzLmVycm9yID0gZGV0YWlscy51cmlEZXRhaWxzLmVycm9yO1xuICAgICAgICBkZXRhaWxzLnR5cGUgPSAnaW52YWxpZCc7XG4gICAgICB9XG5cbiAgICAgIC8vIElkZW50aWZ5IHdhcm5pbmdcbiAgICAgIGV4dHJhS2V5cyA9IGdldEV4dHJhUmVmS2V5cyhvYmopO1xuXG4gICAgICBpZiAoZXh0cmFLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGV0YWlscy53YXJuaW5nID0gJ0V4dHJhIEpTT04gUmVmZXJlbmNlIHByb3BlcnRpZXMgd2lsbCBiZSBpZ25vcmVkOiAnICsgZXh0cmFLZXlzLmpvaW4oJywgJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldGFpbHMudHlwZSA9ICdpbnZhbGlkJztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRldGFpbHMuZXJyb3IgPSBlcnIubWVzc2FnZTtcbiAgICBkZXRhaWxzLnR5cGUgPSAnaW52YWxpZCc7XG4gIH1cblxuICByZXR1cm4gZGV0YWlscztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFyZ3VtZW50IHJlcHJlc2VudHMgYSBKU09OIFBvaW50ZXIuXG4gKlxuICogQSBzdHJpbmcgaXMgYSBKU09OIFBvaW50ZXIgaWYgdGhlIGZvbGxvd2luZyBhcmUgYWxsIHRydWU6XG4gKlxuICogICAqIFRoZSBzdHJpbmcgaXMgb2YgdHlwZSBgU3RyaW5nYFxuICogICAqIFRoZSBzdHJpbmcgbXVzdCBiZSBlbXB0eSwgYCNgIG9yIHN0YXJ0IHdpdGggYSBgL2Agb3IgYCMvYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwdHIgLSBUaGUgc3RyaW5nIHRvIGNoZWNrXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aHJvd1dpdGhEZXRhaWxzPWZhbHNlXSAtIFdoZXRoZXIgb3Igbm90IHRvIHRocm93IGFuIGBFcnJvcmAgd2l0aCB0aGUgZGV0YWlscyBhcyB0byB3aHkgdGhlIHZhbHVlXG4gKiBwcm92aWRlZCBpcyBpbnZhbGlkXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IHRoZSByZXN1bHQgb2YgdGhlIGNoZWNrXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IHdoZW4gdGhlIHByb3ZpZGVkIHZhbHVlIGlzIGludmFsaWQgYW5kIHRoZSBgdGhyb3dXaXRoRGV0YWlsc2AgYXJndW1lbnQgaXMgYHRydWVgXG4gKlxuICogQGFsaWFzIG1vZHVsZTpKc29uUmVmcy5pc1B0clxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2OTAxI3NlY3Rpb24tM31cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2VwYXJhdGluZyB0aGUgZGlmZmVyZW50IHdheXMgdG8gaW52b2tlIGlzUHRyIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzXG4gKiBpZiAoaXNQdHIoc3RyKSkge1xuICogICAvLyBIYW5kbGUgYSB2YWxpZCBKU09OIFBvaW50ZXJcbiAqIH0gZWxzZSB7XG4gKiAgIC8vIEdldCB0aGUgcmVhc29uIGFzIHRvIHdoeSB0aGUgdmFsdWUgaXMgbm90IGEgSlNPTiBQb2ludGVyIHNvIHlvdSBjYW4gZml4L3JlcG9ydCBpdFxuICogICB0cnkge1xuICogICAgIGlzUHRyKHN0ciwgdHJ1ZSk7XG4gKiAgIH0gY2F0Y2ggKGVycikge1xuICogICAgIC8vIFRoZSBlcnJvciBtZXNzYWdlIGNvbnRhaW5zIHRoZSBkZXRhaWxzIGFzIHRvIHdoeSB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgbm90IGEgSlNPTiBQb2ludGVyXG4gKiAgIH1cbiAqIH1cbiAqL1xuZnVuY3Rpb24gaXNQdHIgKHB0ciwgdGhyb3dXaXRoRGV0YWlscykge1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuICB2YXIgZmlyc3RDaGFyO1xuXG4gIHRyeSB7XG4gICAgaWYgKGlzVHlwZShwdHIsICdTdHJpbmcnKSkge1xuICAgICAgaWYgKHB0ciAhPT0gJycpIHtcbiAgICAgICAgZmlyc3RDaGFyID0gcHRyLmNoYXJBdCgwKTtcblxuICAgICAgICBpZiAoWycjJywgJy8nXS5pbmRleE9mKGZpcnN0Q2hhcikgPT09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdHIgbXVzdCBzdGFydCB3aXRoIGEgLyBvciAjLycpO1xuICAgICAgICB9IGVsc2UgaWYgKGZpcnN0Q2hhciA9PT0gJyMnICYmIHB0ciAhPT0gJyMnICYmIHB0ci5jaGFyQXQoMSkgIT09ICcvJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHRyIG11c3Qgc3RhcnQgd2l0aCBhIC8gb3IgIy8nKTtcbiAgICAgICAgfSBlbHNlIGlmIChwdHIubWF0Y2goYmFkUHRyVG9rZW5SZWdleCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B0ciBoYXMgaW52YWxpZCB0b2tlbihzKScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHRyIGlzIG5vdCBhIFN0cmluZycpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHRocm93V2l0aERldGFpbHMgPT09IHRydWUpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgYXJndW1lbnQgcmVwcmVzZW50cyBhIEpTT04gUmVmZXJlbmNlLlxuICpcbiAqIEFuIG9iamVjdCBpcyBhIEpTT04gUmVmZXJlbmNlIG9ubHkgaWYgdGhlIGZvbGxvd2luZyBhcmUgYWxsIHRydWU6XG4gKlxuICogICAqIFRoZSBvYmplY3QgaXMgb2YgdHlwZSBgT2JqZWN0YFxuICogICAqIFRoZSBvYmplY3QgaGFzIGEgYCRyZWZgIHByb3BlcnR5XG4gKiAgICogVGhlIGAkcmVmYCBwcm9wZXJ0eSBpcyBhIHZhbGlkIFVSSSAqKFdlIGRvIG5vdCByZXF1aXJlIDEwMCUgc3RyaWN0IFVSSXMgYW5kIHdpbGwgaGFuZGxlIHVuZXNjYXBlZCBzcGVjaWFsXG4gKiAgICAgY2hhcmFjdGVycy4pKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmogLSBUaGUgb2JqZWN0IHRvIGNoZWNrXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aHJvd1dpdGhEZXRhaWxzPWZhbHNlXSAtIFdoZXRoZXIgb3Igbm90IHRvIHRocm93IGFuIGBFcnJvcmAgd2l0aCB0aGUgZGV0YWlscyBhcyB0byB3aHkgdGhlIHZhbHVlXG4gKiBwcm92aWRlZCBpcyBpbnZhbGlkXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IHRoZSByZXN1bHQgb2YgdGhlIGNoZWNrXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IHdoZW4gdGhlIHByb3ZpZGVkIHZhbHVlIGlzIGludmFsaWQgYW5kIHRoZSBgdGhyb3dXaXRoRGV0YWlsc2AgYXJndW1lbnQgaXMgYHRydWVgXG4gKlxuICogQGFsaWFzIG1vZHVsZTpKc29uUmVmcy5pc1JlZlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LXBicnlhbi16eXAtanNvbi1yZWYtMDMjc2VjdGlvbi0zfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXBhcmF0aW5nIHRoZSBkaWZmZXJlbnQgd2F5cyB0byBpbnZva2UgaXNSZWYgZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXNcbiAqIGlmIChpc1JlZihvYmopKSB7XG4gKiAgIC8vIEhhbmRsZSBhIHZhbGlkIEpTT04gUmVmZXJlbmNlXG4gKiB9IGVsc2Uge1xuICogICAvLyBHZXQgdGhlIHJlYXNvbiBhcyB0byB3aHkgdGhlIHZhbHVlIGlzIG5vdCBhIEpTT04gUmVmZXJlbmNlIHNvIHlvdSBjYW4gZml4L3JlcG9ydCBpdFxuICogICB0cnkge1xuICogICAgIGlzUmVmKHN0ciwgdHJ1ZSk7XG4gKiAgIH0gY2F0Y2ggKGVycikge1xuICogICAgIC8vIFRoZSBlcnJvciBtZXNzYWdlIGNvbnRhaW5zIHRoZSBkZXRhaWxzIGFzIHRvIHdoeSB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgbm90IGEgSlNPTiBSZWZlcmVuY2VcbiAqICAgfVxuICogfVxuICovXG5mdW5jdGlvbiBpc1JlZiAob2JqLCB0aHJvd1dpdGhEZXRhaWxzKSB7XG4gIHJldHVybiBpc1JlZkxpa2Uob2JqLCB0aHJvd1dpdGhEZXRhaWxzKSAmJiBnZXRSZWZEZXRhaWxzKG9iaiwgdGhyb3dXaXRoRGV0YWlscykudHlwZSAhPT0gJ2ludmFsaWQnO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGF0aCBzZWdtZW50cyBmb3IgdGhlIHByb3ZpZGVkIEpTT04gUG9pbnRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHRyIC0gVGhlIEpTT04gUG9pbnRlclxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gdGhlIHBhdGggc2VnbWVudHNcbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHByb3ZpZGVkIGBwdHJgIGFyZ3VtZW50IGlzIG5vdCBhIEpTT04gUG9pbnRlclxuICpcbiAqIEBhbGlhcyBtb2R1bGU6SnNvblJlZnMucGF0aEZyb21QdHJcbiAqL1xuZnVuY3Rpb24gcGF0aEZyb21QdHIgKHB0cikge1xuICBpZiAoIWlzUHRyKHB0cikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3B0ciBtdXN0IGJlIGEgSlNPTiBQb2ludGVyJyk7XG4gIH1cblxuICB2YXIgc2VnbWVudHMgPSBwdHIuc3BsaXQoJy8nKTtcblxuICAvLyBSZW1vdmUgdGhlIGZpcnN0IHNlZ21lbnRcbiAgc2VnbWVudHMuc2hpZnQoKTtcblxuICByZXR1cm4gZGVjb2RlUGF0aChzZWdtZW50cyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEpTT04gUG9pbnRlciBmb3IgdGhlIHByb3ZpZGVkIGFycmF5IG9mIHBhdGggc2VnbWVudHMuXG4gKlxuICogKipOb3RlOioqIElmIGEgcGF0aCBzZWdtZW50IGluIGBwYXRoYCBpcyBub3QgYSBgU3RyaW5nYCwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gb25lIHVzaW5nIGBKU09OLnN0cmluZ2lmeWAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aCAtIFRoZSBhcnJheSBvZiBwYXRoIHNlZ21lbnRzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtoYXNoUHJlZml4PXRydWVdIC0gV2hldGhlciBvciBub3QgY3JlYXRlIGEgaGFzaC1wcmVmaXhlZCBKU09OIFBvaW50ZXJcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgY29ycmVzcG9uZGluZyBKU09OIFBvaW50ZXJcbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGBwYXRoYCBhcmd1bWVudCBpcyBub3QgYW4gYXJyYXlcbiAqXG4gKiBAYWxpYXMgbW9kdWxlOkpzb25SZWZzLnBhdGhUb1B0clxuICovXG5mdW5jdGlvbiBwYXRoVG9QdHIgKHBhdGgsIGhhc2hQcmVmaXgpIHtcbiAgaWYgKCFpc1R5cGUocGF0aCwgJ0FycmF5JykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhdGggbXVzdCBiZSBhbiBBcnJheScpO1xuICB9XG5cbiAgLy8gRW5jb2RlIGVhY2ggc2VnbWVudCBhbmQgcmV0dXJuXG4gIHJldHVybiAoaGFzaFByZWZpeCAhPT0gZmFsc2UgPyAnIycgOiAnJykgKyAocGF0aC5sZW5ndGggPiAwID8gJy8nIDogJycpICsgZW5jb2RlUGF0aChwYXRoKS5qb2luKCcvJyk7XG59XG5cbi8qKlxuICogRmluZHMgSlNPTiBSZWZlcmVuY2VzIGRlZmluZWQgd2l0aGluIHRoZSBwcm92aWRlZCBhcnJheS9vYmplY3QgYW5kIHJlc29sdmVzIHRoZW0uXG4gKlxuICogQHBhcmFtIHthcnJheXxvYmplY3R9IG9iaiAtIFRoZSBzdHJ1Y3R1cmUgdG8gZmluZCBKU09OIFJlZmVyZW5jZXMgd2l0aGluXG4gKiBAcGFyYW0ge21vZHVsZTpKc29uUmVmc35Kc29uUmVmc09wdGlvbnN9IFtvcHRpb25zXSAtIFRoZSBKc29uUmVmcyBvcHRpb25zXG4gKlxuICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGEge0BsaW5rIG1vZHVsZTpKc29uUmVmc35SZXNvbHZlZFJlZnNSZXN1bHRzfSBhbmQgcmVqZWN0cyB3aXRoIGFuXG4gKiBgRXJyb3JgIHdoZW4gdGhlIGlucHV0IGFyZ3VtZW50cyBmYWlsIHZhbGlkYXRpb24sIHdoZW4gYG9wdGlvbnMuc3ViRG9jUGF0aGAgcG9pbnRzIHRvIGFuIGludmFsaWQgbG9jYXRpb24gb3Igd2hlblxuICogIHRoZSBsb2NhdGlvbiBhcmd1bWVudCBwb2ludHMgdG8gYW4gdW5sb2FkYWJsZSByZXNvdXJjZVxuICpcbiAqIEBhbGlhcyBtb2R1bGU6SnNvblJlZnMucmVzb2x2ZVJlZnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSB0aGF0IG9ubHkgcmVzb2x2ZXMgcmVsYXRpdmUgYW5kIHJlbW90ZSByZWZlcmVuY2VzXG4gKiBKc29uUmVmcy5yZXNvbHZlUmVmcyhzd2FnZ2VyT2JqLCB7XG4gKiAgICAgZmlsdGVyOiBbJ3JlbGF0aXZlJywgJ3JlbW90ZSddXG4gKiAgIH0pXG4gKiAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAqICAgICAgLy8gRG8gc29tZXRoaW5nIHdpdGggdGhlIHJlc3BvbnNlXG4gKiAgICAgIC8vXG4gKiAgICAgIC8vIHJlcy5yZWZzOiBKU09OIFJlZmVyZW5jZSBsb2NhdGlvbnMgYW5kIGRldGFpbHNcbiAqICAgICAgLy8gcmVzLnJlc29sdmVkOiBUaGUgZG9jdW1lbnQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgSlNPTiBSZWZlcmVuY2VzIHJlc29sdmVkXG4gKiAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAqICAgICBjb25zb2xlLmxvZyhlcnIuc3RhY2spO1xuICogICB9KTtcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlZnMgKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYWxsVGFza3MgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICBhbGxUYXNrcyA9IGFsbFRhc2tzXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVmFsaWRhdGUgdGhlIHByb3ZpZGVkIGRvY3VtZW50XG4gICAgICBpZiAoIWlzVHlwZShvYmosICdBcnJheScpICYmICFpc1R5cGUob2JqLCAnT2JqZWN0JykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb2JqIG11c3QgYmUgYW4gQXJyYXkgb3IgYW4gT2JqZWN0Jyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG9wdGlvbnNcbiAgICAgIG9wdGlvbnMgPSB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucywgb2JqKTtcblxuICAgICAgLy8gQ2xvbmUgdGhlIGlucHV0IHNvIHdlIGRvIG5vdCBhbHRlciBpdFxuICAgICAgb2JqID0gY2xvbmUob2JqKTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmaW5kUmVmc1JlY3Vyc2l2ZShvYmosIG9wdGlvbnMsIFtdLCBbXSwge1xuICAgICAgICBkb2N1bWVudHM6IHt9LFxuICAgICAgICByZWZzOiB7fVxuICAgICAgfSk7XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoYWxsUmVmcykge1xuICAgICAgdmFyIGRlZmVycmVkUmVmcyA9IHt9O1xuICAgICAgdmFyIHJlZnMgPSB7fTtcblxuICAgICAgZnVuY3Rpb24gcGF0aFNvcnRlciAocDEsIHAyKSB7XG4gICAgICAgIHJldHVybiBwYXRoRnJvbVB0cihwMSkubGVuZ3RoIC0gcGF0aEZyb21QdHIocDIpLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzb2x2ZSBhbGwgcmVmZXJlbmNlcyB3aXRoIGEga25vd24gdmFsdWVcbiAgICAgIE9iamVjdC5rZXlzKGFsbFJlZnMucmVmcykuc29ydChwYXRoU29ydGVyKS5mb3JFYWNoKGZ1bmN0aW9uIChyZWZQdHIpIHtcbiAgICAgICAgdmFyIHJlZkRldGFpbHMgPSBhbGxSZWZzLnJlZnNbcmVmUHRyXTtcblxuICAgICAgICAvLyBSZWNvcmQgYWxsIGRpcmVjdCByZWZlcmVuY2VzXG4gICAgICAgIGlmICghcmVmRGV0YWlscy5pbmRpcmVjdCkge1xuICAgICAgICAgIHJlZnNbcmVmUHRyXSA9IHJlZkRldGFpbHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWxldGUgaGVscGVyIHByb3BlcnR5XG4gICAgICAgIGRlbGV0ZSByZWZEZXRhaWxzLmluZGlyZWN0O1xuXG4gICAgICAgIGlmIChpc1R5cGUocmVmRGV0YWlscy5lcnJvciwgJ1VuZGVmaW5lZCcpICYmIHJlZkRldGFpbHMudHlwZSAhPT0gJ2ludmFsaWQnKSB7XG4gICAgICAgICAgaWYgKGlzVHlwZShyZWZEZXRhaWxzLnZhbHVlLCAnVW5kZWZpbmVkJykgJiYgcmVmRGV0YWlscy5jaXJjdWxhcikge1xuICAgICAgICAgICAgcmVmRGV0YWlscy52YWx1ZSA9IHJlZkRldGFpbHMuZGVmO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFdlIGRlZmVyIHByb2Nlc3NpbmcgYWxsIHJlZmVyZW5jZXMgd2l0aG91dCBhIHZhbHVlIHVudGlsIGxhdGVyXG4gICAgICAgICAgaWYgKGlzVHlwZShyZWZEZXRhaWxzLnZhbHVlLCAnVW5kZWZpbmVkJykpIHtcbiAgICAgICAgICAgIGRlZmVycmVkUmVmc1tyZWZQdHJdID0gcmVmRGV0YWlscztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHJlZlB0ciA9PT0gJyMnKSB7XG4gICAgICAgICAgICAgIG9iaiA9IHJlZkRldGFpbHMudmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZXRWYWx1ZShvYmosIHBhdGhGcm9tUHRyKHJlZlB0ciksIHJlZkRldGFpbHMudmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZWxldGUgaGVscGVyIHByb3BlcnR5XG4gICAgICAgICAgICBkZWxldGUgcmVmRGV0YWlscy5hbmNlc3RvclB0cnM7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERlbGV0ZSBoZWxwZXIgcHJvcGVydHlcbiAgICAgICAgICBkZWxldGUgcmVmRGV0YWlscy5hbmNlc3RvclB0cnM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZXNvbHZlIGFsbCBkZWZlcnJlZCByZWZlcmVuY2VzXG4gICAgICBPYmplY3Qua2V5cyhkZWZlcnJlZFJlZnMpLmZvckVhY2goZnVuY3Rpb24gKHJlZlB0cikge1xuICAgICAgICB2YXIgcmVmRGV0YWlscyA9IGRlZmVycmVkUmVmc1tyZWZQdHJdO1xuXG4gICAgICAgIC8vIEF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgdmFsdWUgYWdhaW5zdCBhbGwgaWYgaXRzIGFuY2VzdG9ycyBpbiBvcmRlclxuICAgICAgICByZWZEZXRhaWxzLmFuY2VzdG9yUHRycy5mb3JFYWNoKGZ1bmN0aW9uIChhbmNlc3RvclB0ciwgaW5kZXgpIHtcbiAgICAgICAgICBpZiAoaXNUeXBlKHJlZkRldGFpbHMudmFsdWUsICdVbmRlZmluZWQnKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmVmRGV0YWlscy52YWx1ZSA9IGZpbmRWYWx1ZShhbGxSZWZzLmRvY3VtZW50c1thbmNlc3RvclB0cl0sIHBhdGhGcm9tUHRyKHJlZkRldGFpbHMudXJpKSk7XG5cbiAgICAgICAgICAgICAgLy8gRGVsZXRlIGhlbHBlciBwcm9wZXJ0eVxuICAgICAgICAgICAgICBkZWxldGUgcmVmRGV0YWlscy5hbmNlc3RvclB0cnM7XG5cbiAgICAgICAgICAgICAgc2V0VmFsdWUob2JqLCBwYXRoRnJvbVB0cihyZWZQdHIpLCByZWZEZXRhaWxzLnZhbHVlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IHJlZkRldGFpbHMuYW5jZXN0b3JQdHJzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICByZWZEZXRhaWxzLmVycm9yID0gZXJyLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVmRGV0YWlscy5taXNzaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBoZWxwZXIgcHJvcGVydHlcbiAgICAgICAgICAgICAgICBkZWxldGUgcmVmRGV0YWlscy5hbmNlc3RvclB0cnM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZnM6IHJlZnMsXG4gICAgICAgIHJlc29sdmVkOiBvYmpcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgcmV0dXJuIGFsbFRhc2tzO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIEpTT04gUmVmZXJlbmNlcyBkZWZpbmVkIHdpdGhpbiB0aGUgZG9jdW1lbnQgYXQgdGhlIHByb3ZpZGVkIGxvY2F0aW9uLlxuICpcbiAqIFRoaXMgQVBJIGlzIGlkZW50aWNhbCB0byB7QGxpbmsgbW9kdWxlOkpzb25SZWZzLnJlc29sdmVSZWZzfSBleGNlcHQgdGhpcyBBUEkgd2lsbCByZXRyaWV2ZSBhIHJlbW90ZSBkb2N1bWVudCBhbmQgdGhlblxuICogcmV0dXJuIHRoZSByZXN1bHQgb2Yge0BsaW5rIG1vZHVsZTpKc29uUmVmcy5yZXNvbHZlUmVmc30gb24gdGhlIHJldHJpZXZlZCBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gLSBUaGUgbG9jYXRpb24gdG8gcmV0cmlldmUgKihDYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUsIGp1c3QgbWFrZSBzdXJlIHlvdSBsb29rIGF0IHRoZVxuICoge0BsaW5rIG1vZHVsZTpKc29uUmVmc35Kc29uUmVmc09wdGlvbnN8b3B0aW9ucyBkb2N1bWVudGF0aW9ufSB0byBzZWUgaG93IHJlbGF0aXZlIHJlZmVyZW5jZXMgYXJlIGhhbmRsZWQuKSpcbiAqIEBwYXJhbSB7bW9kdWxlOkpzb25SZWZzfkpzb25SZWZzT3B0aW9uc30gW29wdGlvbnNdIC0gVGhlIEpzb25SZWZzIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYSB7QGxpbmsgbW9kdWxlOkpzb25SZWZzflJldHJpZXZlZFJlc29sdmVkUmVmc1Jlc3VsdHN9IGFuZCByZWplY3RzIHdpdGggYW5cbiAqIGBFcnJvcmAgd2hlbiB0aGUgaW5wdXQgYXJndW1lbnRzIGZhaWwgdmFsaWRhdGlvbiwgd2hlbiBgb3B0aW9ucy5zdWJEb2NQYXRoYCBwb2ludHMgdG8gYW4gaW52YWxpZCBsb2NhdGlvbiBvciB3aGVuXG4gKiAgdGhlIGxvY2F0aW9uIGFyZ3VtZW50IHBvaW50cyB0byBhbiB1bmxvYWRhYmxlIHJlc291cmNlXG4gKlxuICogQGFsaWFzIG1vZHVsZTpKc29uUmVmcy5yZXNvbHZlUmVmc0F0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgdGhhdCBsb2FkcyBhIEpTT04gZG9jdW1lbnQgKE5vIG9wdGlvbnMubG9hZGVyT3B0aW9ucy5wcm9jZXNzQ29udGVudCByZXF1aXJlZCkgYW5kIHJlc29sdmVzIGFsbCByZWZlcmVuY2VzXG4gKiBKc29uUmVmcy5yZXNvbHZlUmVmc0F0KCcuL3N3YWdnZXIuanNvbicpXG4gKiAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAqICAgICAgLy8gRG8gc29tZXRoaW5nIHdpdGggdGhlIHJlc3BvbnNlXG4gKiAgICAgIC8vXG4gKiAgICAgIC8vIHJlcy5yZWZzOiBKU09OIFJlZmVyZW5jZSBsb2NhdGlvbnMgYW5kIGRldGFpbHNcbiAqICAgICAgLy8gcmVzLnJlc29sdmVkOiBUaGUgZG9jdW1lbnQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgSlNPTiBSZWZlcmVuY2VzIHJlc29sdmVkXG4gKiAgICAgIC8vIHJlcy52YWx1ZTogVGhlIHJldHJpZXZlZCBkb2N1bWVudFxuICogICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gKiAgICAgY29uc29sZS5sb2coZXJyLnN0YWNrKTtcbiAqICAgfSk7XG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZWZzQXQgKGxvY2F0aW9uLCBvcHRpb25zKSB7XG4gIHZhciBhbGxUYXNrcyA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIGFsbFRhc2tzID0gYWxsVGFza3NcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgcHJvdmlkZWQgbG9jYXRpb25cbiAgICAgIGlmICghaXNUeXBlKGxvY2F0aW9uLCAnU3RyaW5nJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbG9jYXRpb24gbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBvcHRpb25zXG4gICAgICBvcHRpb25zID0gdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgICAvLyBDb21iaW5lIHRoZSBsb2NhdGlvbiBhbmQgdGhlIG9wdGlvbmFsIHJlbGF0aXZlIGJhc2VcbiAgICAgIGxvY2F0aW9uID0gY29tYmluZVVSSXMob3B0aW9ucy5yZWxhdGl2ZUJhc2UsIGxvY2F0aW9uKTtcblxuICAgICAgcmV0dXJuIGdldFJlbW90ZURvY3VtZW50KGxvY2F0aW9uLCBvcHRpb25zKTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHZhciBjT3B0aW9ucyA9IGNsb25lKG9wdGlvbnMpO1xuICAgICAgdmFyIHVyaURldGFpbHMgPSBwYXJzZVVSSShsb2NhdGlvbik7XG5cbiAgICAgIC8vIFNldCB0aGUgc3ViIGRvY3VtZW50IHBhdGggaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAoIWlzVHlwZSh1cmlEZXRhaWxzLmZyYWdtZW50LCAnVW5kZWZpbmVkJykpIHtcbiAgICAgICAgY09wdGlvbnMuc3ViRG9jUGF0aCA9IHBhdGhGcm9tUHRyKGRlY29kZVVSSSh1cmlEZXRhaWxzLmZyYWdtZW50KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcmVsYXRpdmUgYmFzZSBiYXNlZCBvbiB0aGUgcmV0cmlldmVkIGxvY2F0aW9uXG4gICAgICBjT3B0aW9ucy5yZWxhdGl2ZUJhc2UgPSBwYXRoLmRpcm5hbWUobG9jYXRpb24pO1xuXG4gICAgICByZXR1cm4gcmVzb2x2ZVJlZnMocmVzLCBjT3B0aW9ucylcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlczIpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVmczogcmVzMi5yZWZzLFxuICAgICAgICAgICAgcmVzb2x2ZWQ6IHJlczIucmVzb2x2ZWQsXG4gICAgICAgICAgICB2YWx1ZTogcmVzXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgcmV0dXJuIGFsbFRhc2tzO1xufVxuXG4vKiBFeHBvcnQgdGhlIG1vZHVsZSBtZW1iZXJzICovXG5tb2R1bGUuZXhwb3J0cy5jbGVhckNhY2hlID0gY2xlYXJDYWNoZTtcbm1vZHVsZS5leHBvcnRzLmRlY29kZVBhdGggPSBkZWNvZGVQYXRoO1xubW9kdWxlLmV4cG9ydHMuZW5jb2RlUGF0aCA9IGVuY29kZVBhdGg7XG5tb2R1bGUuZXhwb3J0cy5maW5kUmVmcyA9IGZpbmRSZWZzO1xubW9kdWxlLmV4cG9ydHMuZmluZFJlZnNBdCA9IGZpbmRSZWZzQXQ7XG5tb2R1bGUuZXhwb3J0cy5nZXRSZWZEZXRhaWxzID0gZ2V0UmVmRGV0YWlscztcbm1vZHVsZS5leHBvcnRzLmlzUHRyID0gaXNQdHI7XG5tb2R1bGUuZXhwb3J0cy5pc1JlZiA9IGlzUmVmO1xubW9kdWxlLmV4cG9ydHMucGF0aEZyb21QdHIgPSBwYXRoRnJvbVB0cjtcbm1vZHVsZS5leHBvcnRzLnBhdGhUb1B0ciA9IHBhdGhUb1B0cjtcbm1vZHVsZS5leHBvcnRzLnJlc29sdmVSZWZzID0gcmVzb2x2ZVJlZnM7XG5tb2R1bGUuZXhwb3J0cy5yZXNvbHZlUmVmc0F0ID0gcmVzb2x2ZVJlZnNBdDtcbiIsIlxuLyoqXG4gKiBFeHBvc2UgYEVtaXR0ZXJgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gRW1pdHRlcjtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBFbWl0dGVyYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufTtcblxuLyoqXG4gKiBNaXhpbiB0aGUgZW1pdHRlciBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1peGluKG9iaikge1xuICBmb3IgKHZhciBrZXkgaW4gRW1pdHRlci5wcm90b3R5cGUpIHtcbiAgICBvYmpba2V5XSA9IEVtaXR0ZXIucHJvdG90eXBlW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBMaXN0ZW4gb24gdGhlIGdpdmVuIGBldmVudGAgd2l0aCBgZm5gLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLm9uID1cbkVtaXR0ZXIucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG4gICh0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdID0gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSB8fCBbXSlcbiAgICAucHVzaChmbik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBZGRzIGFuIGBldmVudGAgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgYSBzaW5nbGVcbiAqIHRpbWUgdGhlbiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RW1pdHRlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIGZ1bmN0aW9uIG9uKCkge1xuICAgIHRoaXMub2ZmKGV2ZW50LCBvbik7XG4gICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIG9uLmZuID0gZm47XG4gIHRoaXMub24oZXZlbnQsIG9uKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgZ2l2ZW4gY2FsbGJhY2sgZm9yIGBldmVudGAgb3IgYWxsXG4gKiByZWdpc3RlcmVkIGNhbGxiYWNrcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5vZmYgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG5cbiAgLy8gYWxsXG4gIGlmICgwID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICB0aGlzLl9jYWxsYmFja3MgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNwZWNpZmljIGV2ZW50XG4gIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xuICBpZiAoIWNhbGxiYWNrcykgcmV0dXJuIHRoaXM7XG5cbiAgLy8gcmVtb3ZlIGFsbCBoYW5kbGVyc1xuICBpZiAoMSA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyByZW1vdmUgc3BlY2lmaWMgaGFuZGxlclxuICB2YXIgY2I7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2IgPSBjYWxsYmFja3NbaV07XG4gICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHtcbiAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtNaXhlZH0gLi4uXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihldmVudCl7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcbiAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcbiAgICAsIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG5cbiAgaWYgKGNhbGxiYWNrcykge1xuICAgIGNhbGxiYWNrcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBjYWxsYmFja3NbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBhcnJheSBvZiBjYWxsYmFja3MgZm9yIGBldmVudGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG4gIHJldHVybiB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGlzIGVtaXR0ZXIgaGFzIGBldmVudGAgaGFuZGxlcnMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnMgPSBmdW5jdGlvbihldmVudCl7XG4gIHJldHVybiAhISB0aGlzLmxpc3RlbmVycyhldmVudCkubGVuZ3RoO1xufTtcbiIsIi8qISBOYXRpdmUgUHJvbWlzZSBPbmx5XG4gICAgdjAuOC4xIChjKSBLeWxlIFNpbXBzb25cbiAgICBNSVQgTGljZW5zZTogaHR0cDovL2dldGlmeS5taXQtbGljZW5zZS5vcmdcbiovXG5cbihmdW5jdGlvbiBVTUQobmFtZSxjb250ZXh0LGRlZmluaXRpb24pe1xuXHQvLyBzcGVjaWFsIGZvcm0gb2YgVU1EIGZvciBwb2x5ZmlsbGluZyBhY3Jvc3MgZXZpcm9ubWVudHNcblx0Y29udGV4dFtuYW1lXSA9IGNvbnRleHRbbmFtZV0gfHwgZGVmaW5pdGlvbigpO1xuXHRpZiAodHlwZW9mIG1vZHVsZSAhPSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZS5leHBvcnRzKSB7IG1vZHVsZS5leHBvcnRzID0gY29udGV4dFtuYW1lXTsgfVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7IGRlZmluZShmdW5jdGlvbiAkQU1EJCgpeyByZXR1cm4gY29udGV4dFtuYW1lXTsgfSk7IH1cbn0pKFwiUHJvbWlzZVwiLHR5cGVvZiBnbG9iYWwgIT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHRoaXMsZnVuY3Rpb24gREVGKCl7XG5cdC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdHZhciBidWlsdEluUHJvcCwgY3ljbGUsIHNjaGVkdWxpbmdfcXVldWUsXG5cdFx0VG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLFxuXHRcdHRpbWVyID0gKHR5cGVvZiBzZXRJbW1lZGlhdGUgIT0gXCJ1bmRlZmluZWRcIikgP1xuXHRcdFx0ZnVuY3Rpb24gdGltZXIoZm4pIHsgcmV0dXJuIHNldEltbWVkaWF0ZShmbik7IH0gOlxuXHRcdFx0c2V0VGltZW91dFxuXHQ7XG5cblx0Ly8gZGFtbWl0LCBJRTguXG5cdHRyeSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LFwieFwiLHt9KTtcblx0XHRidWlsdEluUHJvcCA9IGZ1bmN0aW9uIGJ1aWx0SW5Qcm9wKG9iaixuYW1lLHZhbCxjb25maWcpIHtcblx0XHRcdHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLG5hbWUse1xuXHRcdFx0XHR2YWx1ZTogdmFsLFxuXHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiBjb25maWcgIT09IGZhbHNlXG5cdFx0XHR9KTtcblx0XHR9O1xuXHR9XG5cdGNhdGNoIChlcnIpIHtcblx0XHRidWlsdEluUHJvcCA9IGZ1bmN0aW9uIGJ1aWx0SW5Qcm9wKG9iaixuYW1lLHZhbCkge1xuXHRcdFx0b2JqW25hbWVdID0gdmFsO1xuXHRcdFx0cmV0dXJuIG9iajtcblx0XHR9O1xuXHR9XG5cblx0Ly8gTm90ZTogdXNpbmcgYSBxdWV1ZSBpbnN0ZWFkIG9mIGFycmF5IGZvciBlZmZpY2llbmN5XG5cdHNjaGVkdWxpbmdfcXVldWUgPSAoZnVuY3Rpb24gUXVldWUoKSB7XG5cdFx0dmFyIGZpcnN0LCBsYXN0LCBpdGVtO1xuXG5cdFx0ZnVuY3Rpb24gSXRlbShmbixzZWxmKSB7XG5cdFx0XHR0aGlzLmZuID0gZm47XG5cdFx0XHR0aGlzLnNlbGYgPSBzZWxmO1xuXHRcdFx0dGhpcy5uZXh0ID0gdm9pZCAwO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRhZGQ6IGZ1bmN0aW9uIGFkZChmbixzZWxmKSB7XG5cdFx0XHRcdGl0ZW0gPSBuZXcgSXRlbShmbixzZWxmKTtcblx0XHRcdFx0aWYgKGxhc3QpIHtcblx0XHRcdFx0XHRsYXN0Lm5leHQgPSBpdGVtO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGZpcnN0ID0gaXRlbTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsYXN0ID0gaXRlbTtcblx0XHRcdFx0aXRlbSA9IHZvaWQgMDtcblx0XHRcdH0sXG5cdFx0XHRkcmFpbjogZnVuY3Rpb24gZHJhaW4oKSB7XG5cdFx0XHRcdHZhciBmID0gZmlyc3Q7XG5cdFx0XHRcdGZpcnN0ID0gbGFzdCA9IGN5Y2xlID0gdm9pZCAwO1xuXG5cdFx0XHRcdHdoaWxlIChmKSB7XG5cdFx0XHRcdFx0Zi5mbi5jYWxsKGYuc2VsZik7XG5cdFx0XHRcdFx0ZiA9IGYubmV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH0pKCk7XG5cblx0ZnVuY3Rpb24gc2NoZWR1bGUoZm4sc2VsZikge1xuXHRcdHNjaGVkdWxpbmdfcXVldWUuYWRkKGZuLHNlbGYpO1xuXHRcdGlmICghY3ljbGUpIHtcblx0XHRcdGN5Y2xlID0gdGltZXIoc2NoZWR1bGluZ19xdWV1ZS5kcmFpbik7XG5cdFx0fVxuXHR9XG5cblx0Ly8gcHJvbWlzZSBkdWNrIHR5cGluZ1xuXHRmdW5jdGlvbiBpc1RoZW5hYmxlKG8pIHtcblx0XHR2YXIgX3RoZW4sIG9fdHlwZSA9IHR5cGVvZiBvO1xuXG5cdFx0aWYgKG8gIT0gbnVsbCAmJlxuXHRcdFx0KFxuXHRcdFx0XHRvX3R5cGUgPT0gXCJvYmplY3RcIiB8fCBvX3R5cGUgPT0gXCJmdW5jdGlvblwiXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRfdGhlbiA9IG8udGhlbjtcblx0XHR9XG5cdFx0cmV0dXJuIHR5cGVvZiBfdGhlbiA9PSBcImZ1bmN0aW9uXCIgPyBfdGhlbiA6IGZhbHNlO1xuXHR9XG5cblx0ZnVuY3Rpb24gbm90aWZ5KCkge1xuXHRcdGZvciAodmFyIGk9MDsgaTx0aGlzLmNoYWluLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRub3RpZnlJc29sYXRlZChcblx0XHRcdFx0dGhpcyxcblx0XHRcdFx0KHRoaXMuc3RhdGUgPT09IDEpID8gdGhpcy5jaGFpbltpXS5zdWNjZXNzIDogdGhpcy5jaGFpbltpXS5mYWlsdXJlLFxuXHRcdFx0XHR0aGlzLmNoYWluW2ldXG5cdFx0XHQpO1xuXHRcdH1cblx0XHR0aGlzLmNoYWluLmxlbmd0aCA9IDA7XG5cdH1cblxuXHQvLyBOT1RFOiBUaGlzIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gdG8gaXNvbGF0ZVxuXHQvLyB0aGUgYHRyeS4uY2F0Y2hgIHNvIHRoYXQgb3RoZXIgY29kZSBjYW4gYmVcblx0Ly8gb3B0aW1pemVkIGJldHRlclxuXHRmdW5jdGlvbiBub3RpZnlJc29sYXRlZChzZWxmLGNiLGNoYWluKSB7XG5cdFx0dmFyIHJldCwgX3RoZW47XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChjYiA9PT0gZmFsc2UpIHtcblx0XHRcdFx0Y2hhaW4ucmVqZWN0KHNlbGYubXNnKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRpZiAoY2IgPT09IHRydWUpIHtcblx0XHRcdFx0XHRyZXQgPSBzZWxmLm1zZztcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRyZXQgPSBjYi5jYWxsKHZvaWQgMCxzZWxmLm1zZyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmV0ID09PSBjaGFpbi5wcm9taXNlKSB7XG5cdFx0XHRcdFx0Y2hhaW4ucmVqZWN0KFR5cGVFcnJvcihcIlByb21pc2UtY2hhaW4gY3ljbGVcIikpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKF90aGVuID0gaXNUaGVuYWJsZShyZXQpKSB7XG5cdFx0XHRcdFx0X3RoZW4uY2FsbChyZXQsY2hhaW4ucmVzb2x2ZSxjaGFpbi5yZWplY3QpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGNoYWluLnJlc29sdmUocmV0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRjYXRjaCAoZXJyKSB7XG5cdFx0XHRjaGFpbi5yZWplY3QoZXJyKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiByZXNvbHZlKG1zZykge1xuXHRcdHZhciBfdGhlbiwgc2VsZiA9IHRoaXM7XG5cblx0XHQvLyBhbHJlYWR5IHRyaWdnZXJlZD9cblx0XHRpZiAoc2VsZi50cmlnZ2VyZWQpIHsgcmV0dXJuOyB9XG5cblx0XHRzZWxmLnRyaWdnZXJlZCA9IHRydWU7XG5cblx0XHQvLyB1bndyYXBcblx0XHRpZiAoc2VsZi5kZWYpIHtcblx0XHRcdHNlbGYgPSBzZWxmLmRlZjtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKF90aGVuID0gaXNUaGVuYWJsZShtc2cpKSB7XG5cdFx0XHRcdHNjaGVkdWxlKGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0dmFyIGRlZl93cmFwcGVyID0gbmV3IE1ha2VEZWZXcmFwcGVyKHNlbGYpO1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRfdGhlbi5jYWxsKG1zZyxcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gJHJlc29sdmUkKCl7IHJlc29sdmUuYXBwbHkoZGVmX3dyYXBwZXIsYXJndW1lbnRzKTsgfSxcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gJHJlamVjdCQoKXsgcmVqZWN0LmFwcGx5KGRlZl93cmFwcGVyLGFyZ3VtZW50cyk7IH1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNhdGNoIChlcnIpIHtcblx0XHRcdFx0XHRcdHJlamVjdC5jYWxsKGRlZl93cmFwcGVyLGVycik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHNlbGYubXNnID0gbXNnO1xuXHRcdFx0XHRzZWxmLnN0YXRlID0gMTtcblx0XHRcdFx0aWYgKHNlbGYuY2hhaW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHNjaGVkdWxlKG5vdGlmeSxzZWxmKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRjYXRjaCAoZXJyKSB7XG5cdFx0XHRyZWplY3QuY2FsbChuZXcgTWFrZURlZldyYXBwZXIoc2VsZiksZXJyKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiByZWplY3QobXNnKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0Ly8gYWxyZWFkeSB0cmlnZ2VyZWQ/XG5cdFx0aWYgKHNlbGYudHJpZ2dlcmVkKSB7IHJldHVybjsgfVxuXG5cdFx0c2VsZi50cmlnZ2VyZWQgPSB0cnVlO1xuXG5cdFx0Ly8gdW53cmFwXG5cdFx0aWYgKHNlbGYuZGVmKSB7XG5cdFx0XHRzZWxmID0gc2VsZi5kZWY7XG5cdFx0fVxuXG5cdFx0c2VsZi5tc2cgPSBtc2c7XG5cdFx0c2VsZi5zdGF0ZSA9IDI7XG5cdFx0aWYgKHNlbGYuY2hhaW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0c2NoZWR1bGUobm90aWZ5LHNlbGYpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGl0ZXJhdGVQcm9taXNlcyhDb25zdHJ1Y3RvcixhcnIscmVzb2x2ZXIscmVqZWN0ZXIpIHtcblx0XHRmb3IgKHZhciBpZHg9MDsgaWR4PGFyci5sZW5ndGg7IGlkeCsrKSB7XG5cdFx0XHQoZnVuY3Rpb24gSUlGRShpZHgpe1xuXHRcdFx0XHRDb25zdHJ1Y3Rvci5yZXNvbHZlKGFycltpZHhdKVxuXHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRmdW5jdGlvbiAkcmVzb2x2ZXIkKG1zZyl7XG5cdFx0XHRcdFx0XHRyZXNvbHZlcihpZHgsbXNnKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHJlamVjdGVyXG5cdFx0XHRcdCk7XG5cdFx0XHR9KShpZHgpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIE1ha2VEZWZXcmFwcGVyKHNlbGYpIHtcblx0XHR0aGlzLmRlZiA9IHNlbGY7XG5cdFx0dGhpcy50cmlnZ2VyZWQgPSBmYWxzZTtcblx0fVxuXG5cdGZ1bmN0aW9uIE1ha2VEZWYoc2VsZikge1xuXHRcdHRoaXMucHJvbWlzZSA9IHNlbGY7XG5cdFx0dGhpcy5zdGF0ZSA9IDA7XG5cdFx0dGhpcy50cmlnZ2VyZWQgPSBmYWxzZTtcblx0XHR0aGlzLmNoYWluID0gW107XG5cdFx0dGhpcy5tc2cgPSB2b2lkIDA7XG5cdH1cblxuXHRmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG5cdFx0aWYgKHR5cGVvZiBleGVjdXRvciAhPSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdHRocm93IFR5cGVFcnJvcihcIk5vdCBhIGZ1bmN0aW9uXCIpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9fTlBPX18gIT09IDApIHtcblx0XHRcdHRocm93IFR5cGVFcnJvcihcIk5vdCBhIHByb21pc2VcIik7XG5cdFx0fVxuXG5cdFx0Ly8gaW5zdGFuY2Ugc2hhZG93aW5nIHRoZSBpbmhlcml0ZWQgXCJicmFuZFwiXG5cdFx0Ly8gdG8gc2lnbmFsIGFuIGFscmVhZHkgXCJpbml0aWFsaXplZFwiIHByb21pc2Vcblx0XHR0aGlzLl9fTlBPX18gPSAxO1xuXG5cdFx0dmFyIGRlZiA9IG5ldyBNYWtlRGVmKHRoaXMpO1xuXG5cdFx0dGhpc1tcInRoZW5cIl0gPSBmdW5jdGlvbiB0aGVuKHN1Y2Nlc3MsZmFpbHVyZSkge1xuXHRcdFx0dmFyIG8gPSB7XG5cdFx0XHRcdHN1Y2Nlc3M6IHR5cGVvZiBzdWNjZXNzID09IFwiZnVuY3Rpb25cIiA/IHN1Y2Nlc3MgOiB0cnVlLFxuXHRcdFx0XHRmYWlsdXJlOiB0eXBlb2YgZmFpbHVyZSA9PSBcImZ1bmN0aW9uXCIgPyBmYWlsdXJlIDogZmFsc2Vcblx0XHRcdH07XG5cdFx0XHQvLyBOb3RlOiBgdGhlbiguLilgIGl0c2VsZiBjYW4gYmUgYm9ycm93ZWQgdG8gYmUgdXNlZCBhZ2FpbnN0XG5cdFx0XHQvLyBhIGRpZmZlcmVudCBwcm9taXNlIGNvbnN0cnVjdG9yIGZvciBtYWtpbmcgdGhlIGNoYWluZWQgcHJvbWlzZSxcblx0XHRcdC8vIGJ5IHN1YnN0aXR1dGluZyBhIGRpZmZlcmVudCBgdGhpc2AgYmluZGluZy5cblx0XHRcdG8ucHJvbWlzZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGZ1bmN0aW9uIGV4dHJhY3RDaGFpbihyZXNvbHZlLHJlamVjdCkge1xuXHRcdFx0XHRpZiAodHlwZW9mIHJlc29sdmUgIT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiByZWplY3QgIT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0dGhyb3cgVHlwZUVycm9yKFwiTm90IGEgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvLnJlc29sdmUgPSByZXNvbHZlO1xuXHRcdFx0XHRvLnJlamVjdCA9IHJlamVjdDtcblx0XHRcdH0pO1xuXHRcdFx0ZGVmLmNoYWluLnB1c2gobyk7XG5cblx0XHRcdGlmIChkZWYuc3RhdGUgIT09IDApIHtcblx0XHRcdFx0c2NoZWR1bGUobm90aWZ5LGRlZik7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvLnByb21pc2U7XG5cdFx0fTtcblx0XHR0aGlzW1wiY2F0Y2hcIl0gPSBmdW5jdGlvbiAkY2F0Y2gkKGZhaWx1cmUpIHtcblx0XHRcdHJldHVybiB0aGlzLnRoZW4odm9pZCAwLGZhaWx1cmUpO1xuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0ZXhlY3V0b3IuY2FsbChcblx0XHRcdFx0dm9pZCAwLFxuXHRcdFx0XHRmdW5jdGlvbiBwdWJsaWNSZXNvbHZlKG1zZyl7XG5cdFx0XHRcdFx0cmVzb2x2ZS5jYWxsKGRlZixtc2cpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRmdW5jdGlvbiBwdWJsaWNSZWplY3QobXNnKSB7XG5cdFx0XHRcdFx0cmVqZWN0LmNhbGwoZGVmLG1zZyk7XG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdFx0fVxuXHRcdGNhdGNoIChlcnIpIHtcblx0XHRcdHJlamVjdC5jYWxsKGRlZixlcnIpO1xuXHRcdH1cblx0fVxuXG5cdHZhciBQcm9taXNlUHJvdG90eXBlID0gYnVpbHRJblByb3Aoe30sXCJjb25zdHJ1Y3RvclwiLFByb21pc2UsXG5cdFx0Lypjb25maWd1cmFibGU9Ki9mYWxzZVxuXHQpO1xuXG5cdC8vIE5vdGU6IEFuZHJvaWQgNCBjYW5ub3QgdXNlIGBPYmplY3QuZGVmaW5lUHJvcGVydHkoLi4pYCBoZXJlXG5cdFByb21pc2UucHJvdG90eXBlID0gUHJvbWlzZVByb3RvdHlwZTtcblxuXHQvLyBidWlsdC1pbiBcImJyYW5kXCIgdG8gc2lnbmFsIGFuIFwidW5pbml0aWFsaXplZFwiIHByb21pc2Vcblx0YnVpbHRJblByb3AoUHJvbWlzZVByb3RvdHlwZSxcIl9fTlBPX19cIiwwLFxuXHRcdC8qY29uZmlndXJhYmxlPSovZmFsc2Vcblx0KTtcblxuXHRidWlsdEluUHJvcChQcm9taXNlLFwicmVzb2x2ZVwiLGZ1bmN0aW9uIFByb21pc2UkcmVzb2x2ZShtc2cpIHtcblx0XHR2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuXG5cdFx0Ly8gc3BlYyBtYW5kYXRlZCBjaGVja3Ncblx0XHQvLyBub3RlOiBiZXN0IFwiaXNQcm9taXNlXCIgY2hlY2sgdGhhdCdzIHByYWN0aWNhbCBmb3Igbm93XG5cdFx0aWYgKG1zZyAmJiB0eXBlb2YgbXNnID09IFwib2JqZWN0XCIgJiYgbXNnLl9fTlBPX18gPT09IDEpIHtcblx0XHRcdHJldHVybiBtc2c7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlLHJlamVjdCl7XG5cdFx0XHRpZiAodHlwZW9mIHJlc29sdmUgIT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiByZWplY3QgIT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IFR5cGVFcnJvcihcIk5vdCBhIGZ1bmN0aW9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNvbHZlKG1zZyk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGJ1aWx0SW5Qcm9wKFByb21pc2UsXCJyZWplY3RcIixmdW5jdGlvbiBQcm9taXNlJHJlamVjdChtc2cpIHtcblx0XHRyZXR1cm4gbmV3IHRoaXMoZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZSxyZWplY3Qpe1xuXHRcdFx0aWYgKHR5cGVvZiByZXNvbHZlICE9IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgcmVqZWN0ICE9IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHR0aHJvdyBUeXBlRXJyb3IoXCJOb3QgYSBmdW5jdGlvblwiKTtcblx0XHRcdH1cblxuXHRcdFx0cmVqZWN0KG1zZyk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGJ1aWx0SW5Qcm9wKFByb21pc2UsXCJhbGxcIixmdW5jdGlvbiBQcm9taXNlJGFsbChhcnIpIHtcblx0XHR2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuXG5cdFx0Ly8gc3BlYyBtYW5kYXRlZCBjaGVja3Ncblx0XHRpZiAoVG9TdHJpbmcuY2FsbChhcnIpICE9IFwiW29iamVjdCBBcnJheV1cIikge1xuXHRcdFx0cmV0dXJuIENvbnN0cnVjdG9yLnJlamVjdChUeXBlRXJyb3IoXCJOb3QgYW4gYXJyYXlcIikpO1xuXHRcdH1cblx0XHRpZiAoYXJyLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIENvbnN0cnVjdG9yLnJlc29sdmUoW10pO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgQ29uc3RydWN0b3IoZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZSxyZWplY3Qpe1xuXHRcdFx0aWYgKHR5cGVvZiByZXNvbHZlICE9IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgcmVqZWN0ICE9IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHR0aHJvdyBUeXBlRXJyb3IoXCJOb3QgYSBmdW5jdGlvblwiKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGxlbiA9IGFyci5sZW5ndGgsIG1zZ3MgPSBBcnJheShsZW4pLCBjb3VudCA9IDA7XG5cblx0XHRcdGl0ZXJhdGVQcm9taXNlcyhDb25zdHJ1Y3RvcixhcnIsZnVuY3Rpb24gcmVzb2x2ZXIoaWR4LG1zZykge1xuXHRcdFx0XHRtc2dzW2lkeF0gPSBtc2c7XG5cdFx0XHRcdGlmICgrK2NvdW50ID09PSBsZW4pIHtcblx0XHRcdFx0XHRyZXNvbHZlKG1zZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LHJlamVjdCk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdGJ1aWx0SW5Qcm9wKFByb21pc2UsXCJyYWNlXCIsZnVuY3Rpb24gUHJvbWlzZSRyYWNlKGFycikge1xuXHRcdHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG5cblx0XHQvLyBzcGVjIG1hbmRhdGVkIGNoZWNrc1xuXHRcdGlmIChUb1N0cmluZy5jYWxsKGFycikgIT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG5cdFx0XHRyZXR1cm4gQ29uc3RydWN0b3IucmVqZWN0KFR5cGVFcnJvcihcIk5vdCBhbiBhcnJheVwiKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlLHJlamVjdCl7XG5cdFx0XHRpZiAodHlwZW9mIHJlc29sdmUgIT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiByZWplY3QgIT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IFR5cGVFcnJvcihcIk5vdCBhIGZ1bmN0aW9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpdGVyYXRlUHJvbWlzZXMoQ29uc3RydWN0b3IsYXJyLGZ1bmN0aW9uIHJlc29sdmVyKGlkeCxtc2cpe1xuXHRcdFx0XHRyZXNvbHZlKG1zZyk7XG5cdFx0XHR9LHJlamVjdCk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdHJldHVybiBQcm9taXNlO1xufSk7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gcmVzb2x2ZXMgLiBhbmQgLi4gZWxlbWVudHMgaW4gYSBwYXRoIGFycmF5IHdpdGggZGlyZWN0b3J5IG5hbWVzIHRoZXJlXG4vLyBtdXN0IGJlIG5vIHNsYXNoZXMsIGVtcHR5IGVsZW1lbnRzLCBvciBkZXZpY2UgbmFtZXMgKGM6XFwpIGluIHRoZSBhcnJheVxuLy8gKHNvIGFsc28gbm8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcyAtIGl0IGRvZXMgbm90IGRpc3Rpbmd1aXNoXG4vLyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcGF0aHMpXG5mdW5jdGlvbiBub3JtYWxpemVBcnJheShwYXJ0cywgYWxsb3dBYm92ZVJvb3QpIHtcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGxhc3QgPSBwYXJ0c1tpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxuLy8gJ3Jvb3QnIGlzIGp1c3QgYSBzbGFzaCwgb3Igbm90aGluZy5cbnZhciBzcGxpdFBhdGhSZSA9XG4gICAgL14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSkoPzpbXFwvXSopJC87XG52YXIgc3BsaXRQYXRoID0gZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpO1xufTtcblxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZXNvbHZlID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNvbHZlZFBhdGggPSAnJyxcbiAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgIHZhciBwYXRoID0gKGkgPj0gMCkgPyBhcmd1bWVudHNbaV0gOiBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgLy8gU2tpcCBlbXB0eSBhbmQgaW52YWxpZCBlbnRyaWVzXG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXNvbHZlZFBhdGggPSBwYXRoICsgJy8nICsgcmVzb2x2ZWRQYXRoO1xuICAgIHJlc29sdmVkQWJzb2x1dGUgPSBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xuICB9XG5cbiAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxuICAvLyBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKSBmYWlscylcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHJlc29sdmVkUGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFyZXNvbHZlZEFic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgcmV0dXJuICgocmVzb2x2ZWRBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHJlc29sdmVkUGF0aCkgfHwgJy4nO1xufTtcblxuLy8gcGF0aC5ub3JtYWxpemUocGF0aClcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMubm9ybWFsaXplID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgaXNBYnNvbHV0ZSA9IGV4cG9ydHMuaXNBYnNvbHV0ZShwYXRoKSxcbiAgICAgIHRyYWlsaW5nU2xhc2ggPSBzdWJzdHIocGF0aCwgLTEpID09PSAnLyc7XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFpc0Fic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgaWYgKCFwYXRoICYmICFpc0Fic29sdXRlKSB7XG4gICAgcGF0aCA9ICcuJztcbiAgfVxuICBpZiAocGF0aCAmJiB0cmFpbGluZ1NsYXNoKSB7XG4gICAgcGF0aCArPSAnLyc7XG4gIH1cblxuICByZXR1cm4gKGlzQWJzb2x1dGUgPyAnLycgOiAnJykgKyBwYXRoO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5pc0Fic29sdXRlID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuam9pbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcGF0aHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gZXhwb3J0cy5ub3JtYWxpemUoZmlsdGVyKHBhdGhzLCBmdW5jdGlvbihwLCBpbmRleCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLmpvaW4gbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9KS5qb2luKCcvJykpO1xufTtcblxuXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZWxhdGl2ZSA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7XG4gIGZyb20gPSBleHBvcnRzLnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO1xuICB0byA9IGV4cG9ydHMucmVzb2x2ZSh0bykuc3Vic3RyKDEpO1xuXG4gIGZ1bmN0aW9uIHRyaW0oYXJyKSB7XG4gICAgdmFyIHN0YXJ0ID0gMDtcbiAgICBmb3IgKDsgc3RhcnQgPCBhcnIubGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgICBpZiAoYXJyW3N0YXJ0XSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBlbmQgPSBhcnIubGVuZ3RoIC0gMTtcbiAgICBmb3IgKDsgZW5kID49IDA7IGVuZC0tKSB7XG4gICAgICBpZiAoYXJyW2VuZF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpO1xuICB9XG5cbiAgdmFyIGZyb21QYXJ0cyA9IHRyaW0oZnJvbS5zcGxpdCgnLycpKTtcbiAgdmFyIHRvUGFydHMgPSB0cmltKHRvLnNwbGl0KCcvJykpO1xuXG4gIHZhciBsZW5ndGggPSBNYXRoLm1pbihmcm9tUGFydHMubGVuZ3RoLCB0b1BhcnRzLmxlbmd0aCk7XG4gIHZhciBzYW1lUGFydHNMZW5ndGggPSBsZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZnJvbVBhcnRzW2ldICE9PSB0b1BhcnRzW2ldKSB7XG4gICAgICBzYW1lUGFydHNMZW5ndGggPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG91dHB1dFBhcnRzID0gW107XG4gIGZvciAodmFyIGkgPSBzYW1lUGFydHNMZW5ndGg7IGkgPCBmcm9tUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICBvdXRwdXRQYXJ0cy5wdXNoKCcuLicpO1xuICB9XG5cbiAgb3V0cHV0UGFydHMgPSBvdXRwdXRQYXJ0cy5jb25jYXQodG9QYXJ0cy5zbGljZShzYW1lUGFydHNMZW5ndGgpKTtcblxuICByZXR1cm4gb3V0cHV0UGFydHMuam9pbignLycpO1xufTtcblxuZXhwb3J0cy5zZXAgPSAnLyc7XG5leHBvcnRzLmRlbGltaXRlciA9ICc6JztcblxuZXhwb3J0cy5kaXJuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgcmVzdWx0ID0gc3BsaXRQYXRoKHBhdGgpLFxuICAgICAgcm9vdCA9IHJlc3VsdFswXSxcbiAgICAgIGRpciA9IHJlc3VsdFsxXTtcblxuICBpZiAoIXJvb3QgJiYgIWRpcikge1xuICAgIC8vIE5vIGRpcm5hbWUgd2hhdHNvZXZlclxuICAgIHJldHVybiAnLic7XG4gIH1cblxuICBpZiAoZGlyKSB7XG4gICAgLy8gSXQgaGFzIGEgZGlybmFtZSwgc3RyaXAgdHJhaWxpbmcgc2xhc2hcbiAgICBkaXIgPSBkaXIuc3Vic3RyKDAsIGRpci5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHJldHVybiByb290ICsgZGlyO1xufTtcblxuXG5leHBvcnRzLmJhc2VuYW1lID0gZnVuY3Rpb24ocGF0aCwgZXh0KSB7XG4gIHZhciBmID0gc3BsaXRQYXRoKHBhdGgpWzJdO1xuICAvLyBUT0RPOiBtYWtlIHRoaXMgY29tcGFyaXNvbiBjYXNlLWluc2Vuc2l0aXZlIG9uIHdpbmRvd3M/XG4gIGlmIChleHQgJiYgZi5zdWJzdHIoLTEgKiBleHQubGVuZ3RoKSA9PT0gZXh0KSB7XG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIGY7XG59O1xuXG5cbmV4cG9ydHMuZXh0bmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aChwYXRoKVszXTtcbn07XG5cbmZ1bmN0aW9uIGZpbHRlciAoeHMsIGYpIHtcbiAgICBpZiAoeHMuZmlsdGVyKSByZXR1cm4geHMuZmlsdGVyKGYpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChmKHhzW2ldLCBpLCB4cykpIHJlcy5wdXNoKHhzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuLy8gU3RyaW5nLnByb3RvdHlwZS5zdWJzdHIgLSBuZWdhdGl2ZSBpbmRleCBkb24ndCB3b3JrIGluIElFOFxudmFyIHN1YnN0ciA9ICdhYicuc3Vic3RyKC0xKSA9PT0gJ2InXG4gICAgPyBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7IHJldHVybiBzdHIuc3Vic3RyKHN0YXJ0LCBsZW4pIH1cbiAgICA6IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSBzdHIubGVuZ3RoICsgc3RhcnQ7XG4gICAgICAgIHJldHVybiBzdHIuc3Vic3RyKHN0YXJ0LCBsZW4pO1xuICAgIH1cbjtcbiIsIi8qXG4gKiBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgSmVyZW15IFdoaXRsb2NrXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXRpbGl0eSB0aGF0IHByb3ZpZGVzIGEgc2luZ2xlIEFQSSBmb3IgbG9hZGluZyB0aGUgY29udGVudCBvZiBhIHBhdGgvVVJMLlxuICpcbiAqIEBtb2R1bGUgUGF0aExvYWRlclxuICovXG5cbnZhciBzdXBwb3J0ZWRMb2FkZXJzID0ge1xuICBmaWxlOiByZXF1aXJlKCcuL2xpYi9sb2FkZXJzL2ZpbGUnKSxcbiAgaHR0cDogcmVxdWlyZSgnLi9saWIvbG9hZGVycy9odHRwJyksXG4gIGh0dHBzOiByZXF1aXJlKCcuL2xpYi9sb2FkZXJzL2h0dHAnKVxufTtcbnZhciBkZWZhdWx0TG9hZGVyID0gdHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGltcG9ydFNjcmlwdHMgPT09ICdmdW5jdGlvbicgP1xuICAgICAgc3VwcG9ydGVkTG9hZGVycy5odHRwIDpcbiAgICAgIHN1cHBvcnRlZExvYWRlcnMuZmlsZTtcblxuLy8gTG9hZCBwcm9taXNlcyBwb2x5ZmlsbCBpZiBuZWNlc3Nhcnlcbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJykge1xuICByZXF1aXJlKCduYXRpdmUtcHJvbWlzZS1vbmx5Jyk7XG59XG5cbmZ1bmN0aW9uIGdldFNjaGVtZSAobG9jYXRpb24pIHtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBsb2NhdGlvbiA9IGxvY2F0aW9uLmluZGV4T2YoJzovLycpID09PSAtMSA/ICcnIDogbG9jYXRpb24uc3BsaXQoJzovLycpWzBdO1xuICB9XG5cbiAgcmV0dXJuIGxvY2F0aW9uO1xufVxuXG4vKipcbiAqIENhbGxiYWNrIHVzZWQgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gYWx0ZXJpbmcgYSByZW1vdGUgcmVxdWVzdCBwcmlvciB0byB0aGUgcmVxdWVzdCBiZWluZyBtYWRlLlxuICpcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbn0gUHJlcGFyZVJlcXVlc3RDYWxsYmFja1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXEgLSBUaGUgU3VwZXJhZ2VudCByZXF1ZXN0IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIC0gVGhlIGxvY2F0aW9uIGJlaW5nIHJldHJpZXZlZFxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBGaXJzdCBjYWxsYmFja1xuICpcbiAqIEBhbGlhcyBtb2R1bGU6UGF0aExvYWRlcn5QcmVwYXJlUmVxdWVzdENhbGxiYWNrXG4gKi9cblxuIC8qKlxuICAqIENhbGxiYWNrIHVzZWQgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gcHJvY2Vzc2luZyB0aGUgcmF3IHJlc3BvbnNlIG9mIHRoZSByZXF1ZXN0IGJlaW5nIG1hZGUuICooSFRUUCBsb2FkZXIgb25seSkqXG4gICpcbiAgKiBAdHlwZWRlZiB7ZnVuY3Rpb259IFByb2Nlc3NSZXNwb25zZUNhbGxiYWNrXG4gICpcbiAgKiBAcGFyYW0ge29iamVjdH0gcmVzIC0gVGhlIFN1cGVyYWdlbnQgcmVzcG9uc2Ugb2JqZWN0ICooRm9yIG5vbi1IVFRQIGxvYWRlcnMsIHRoaXMgb2JqZWN0IHdpbGwgYmUgbGlrZSB0aGUgU3VwZXJhZ2VudFxuICAqIG9iamVjdCBpbiB0aGF0IGl0IHdpbGwgaGF2ZSBhIGB0ZXh0YCBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyB0aGUgcmF3IHN0cmluZyB2YWx1ZSBiZWluZyBwcm9jZXNzZWQuICBUaGlzIHdhcyBkb25lXG4gICogZm9yIGNvbnNpc3RlbmN5LikqXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBFcnJvci1maXJzdCBjYWxsYmFja1xuICAqXG4gICogQHJldHVybnMgeyp9IHRoZSByZXN1bHQgb2YgcHJvY2Vzc2luZyB0aGUgcmVzcG9uc2V4c1xuICAqXG4gICogQGFsaWFzIG1vZHVsZTpQYXRoTG9hZGVyflByb2Nlc3NSZXNwb25zZUNhbGxiYWNrXG4gICovXG5cbmZ1bmN0aW9uIGdldExvYWRlciAobG9jYXRpb24pIHtcbiAgdmFyIHNjaGVtZSA9IGdldFNjaGVtZShsb2NhdGlvbik7XG4gIHZhciBsb2FkZXIgPSBzdXBwb3J0ZWRMb2FkZXJzW3NjaGVtZV07XG5cbiAgaWYgKHR5cGVvZiBsb2FkZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHNjaGVtZSA9PT0gJycpIHtcbiAgICAgIGxvYWRlciA9IGRlZmF1bHRMb2FkZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgc2NoZW1lOiAnICsgc2NoZW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbG9hZGVyO1xufVxuXG4vKipcbiAqIExvYWRzIGEgZG9jdW1lbnQgYXQgdGhlIHByb3ZpZGVkIGxvY2F0aW9uIGFuZCByZXR1cm5zIGEgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGxvY2F0aW9uIC0gVGhlIGxvY2F0aW9uIHRvIHRoZSBkb2N1bWVudFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZW5jb2Rpbmc9J3V0Zi04J10gLSBUaGUgZW5jb2RpbmcgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgZmlsZSAqKEZpbGUgbG9hZGVyIG9ubHkpKlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1ldGhvZD1nZXRdIC0gVGhlIEhUVFAgbWV0aG9kIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QgKihIVFRQIGxvYWRlciBvbmx5KSpcbiAqIEBwYXJhbSB7bW9kdWxlOlBhdGhMb2FkZXJ+UHJlcGFyZVJlcXVlc3RDYWxsYmFja30gW29wdGlvbnMucHJlcGFyZVJlcXVlc3RdIC0gVGhlIGNhbGxiYWNrIHVzZWQgdG8gcHJlcGFyZSB0aGUgcmVxdWVzdFxuICogKihIVFRQIGxvYWRlciBvbmx5KSpcbiAqIEBwYXJhbSB7bW9kdWxlOlBhdGhMb2FkZXJ+UHJvY2Vzc1Jlc3BvbnNlQ2FsbGJhY2t9IFtvcHRpb25zLnByb2Nlc3NDb250ZW50XSAtIFRoZSBjYWxsYmFjayB1c2VkIHRvIHByb2Nlc3MgdGhlXG4gKiByZXNwb25zZVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBbHdheXMgcmV0dXJucyBhIHByb21pc2UgZXZlbiBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrIHByb3ZpZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgdXNpbmcgUHJvbWlzZXNcbiAqXG4gKiBQYXRoTG9hZGVyXG4gKiAgIC5sb2FkKCcuL3BhY2thZ2UuanNvbicpXG4gKiAgIC50aGVuKEpTT04ucGFyc2UpXG4gKiAgIC50aGVuKGZ1bmN0aW9uIChkb2N1bWVudCkge1xuICogICAgIGNvbnNvbGUubG9nKGRvY3VtZW50Lm5hbWUgKyAnICgnICsgZG9jdW1lbnQudmVyc2lvbiArICcpOiAnICsgZG9jdW1lbnQuZGVzY3JpcHRpb24pO1xuICogICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICogICB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSB1c2luZyBvcHRpb25zLnByZXBhcmVSZXF1ZXN0IHRvIHByb3ZpZGUgYXV0aGVudGljYXRpb24gZGV0YWlscyBmb3IgYSByZW1vdGVseSBzZWN1cmUgVVJMXG4gKlxuICogUGF0aExvYWRlclxuICogICAubG9hZCgnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy93aGl0bG9ja2pjL3BhdGgtbG9hZGVyJywge1xuICogICAgIHByZXBhcmVSZXF1ZXN0OiBmdW5jdGlvbiAocmVxLCBjYWxsYmFjaykge1xuICogICAgICAgcmVxLmF1dGgoJ215LXVzZXJuYW1lJywgJ215LXBhc3N3b3JkJyk7XG4gKiAgICAgICBjYWxsYmFjayh1bmRlZmluZWQsIHJlcSk7XG4gKiAgICAgfVxuICogICB9KVxuICogICAudGhlbihKU09OLnBhcnNlKVxuICogICAudGhlbihmdW5jdGlvbiAoZG9jdW1lbnQpIHtcbiAqICAgICBjb25zb2xlLmxvZyhkb2N1bWVudC5mdWxsX25hbWUgKyAnOiAnICsgZG9jdW1lbnQuZGVzY3JpcHRpb24pO1xuICogICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICogICB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBsb2FkaW5nIGEgWUFNTCBmaWxlXG4gKlxuICogUGF0aExvYWRlclxuICogICAubG9hZCgnL1VzZXJzL25vdC15b3UvcHJvamVjdHMvcGF0aC1sb2FkZXIvLnRyYXZpcy55bWwnKVxuICogICAudGhlbihZQU1MLnNhZmVMb2FkKVxuICogICAudGhlbihmdW5jdGlvbiAoZG9jdW1lbnQpIHtcbiAqICAgICBjb25zb2xlLmxvZygncGF0aC1sb2FkZXIgdXNlcyB0aGUnLCBkb2N1bWVudC5sYW5ndWFnZSwgJ2xhbmd1YWdlLicpO1xuICogICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICogICB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBsb2FkaW5nIGEgWUFNTCBmaWxlIHdpdGggb3B0aW9ucy5wcm9jZXNzQ29udGVudCAoVXNlZnVsIGlmIHlvdSBuZWVkIGluZm9ybWF0aW9uIGluIHRoZSByYXcgcmVzcG9uc2UpXG4gKlxuICogUGF0aExvYWRlclxuICogICAubG9hZCgnL1VzZXJzL25vdC15b3UvcHJvamVjdHMvcGF0aC1sb2FkZXIvLnRyYXZpcy55bWwnLCB7XG4gKiAgICAgcHJvY2Vzc0NvbnRlbnQ6IGZ1bmN0aW9uIChyZXMsIGNhbGxiYWNrKSB7XG4gKiAgICAgICBjYWxsYmFjayhZQU1MLnNhZmVMb2FkKHJlcy50ZXh0KSk7XG4gKiAgICAgfVxuICogICB9KVxuICogICAudGhlbihmdW5jdGlvbiAoZG9jdW1lbnQpIHtcbiAqICAgICBjb25zb2xlLmxvZygncGF0aC1sb2FkZXIgdXNlcyB0aGUnLCBkb2N1bWVudC5sYW5ndWFnZSwgJ2xhbmd1YWdlLicpO1xuICogICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICogICB9KTtcbiAqL1xubW9kdWxlLmV4cG9ydHMubG9hZCA9IGZ1bmN0aW9uIChsb2NhdGlvbiwgb3B0aW9ucykge1xuICB2YXIgYWxsVGFza3MgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAvLyBEZWZhdWx0IG9wdGlvbnMgdG8gZW1wdHkgb2JqZWN0XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBhcmd1bWVudHNcbiAgYWxsVGFza3MgPSBhbGxUYXNrcy50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbG9jYXRpb24gaXMgcmVxdWlyZWQnKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2xvY2F0aW9uIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMucHJvY2Vzc0NvbnRlbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLnByb2Nlc3NDb250ZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMucHJvY2Vzc0NvbnRlbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBMb2FkIHRoZSBkb2N1bWVudCBmcm9tIHRoZSBwcm92aWRlZCBsb2NhdGlvbiBhbmQgcHJvY2VzcyBpdFxuICBhbGxUYXNrcyA9IGFsbFRhc2tzXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGxvYWRlciA9IGdldExvYWRlcihsb2NhdGlvbik7XG5cbiAgICAgICAgbG9hZGVyLmxvYWQobG9jYXRpb24sIG9wdGlvbnMgfHwge30sIGZ1bmN0aW9uIChlcnIsIGRvY3VtZW50KSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUoZG9jdW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGlmIChvcHRpb25zLnByb2Nlc3NDb250ZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgLy8gRm9yIGNvbnNpc3RlbmN5IGJldHdlZW4gZmlsZSBhbmQgaHR0cCwgYWx3YXlzIHNlbmQgYW4gb2JqZWN0IHdpdGggYSAndGV4dCcgcHJvcGVydHkgY29udGFpbmluZyB0aGUgcmF3XG4gICAgICAgICAgLy8gc3RyaW5nIHZhbHVlIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgICAgICBvcHRpb25zLnByb2Nlc3NDb250ZW50KHR5cGVvZiByZXMgPT09ICdvYmplY3QnID8gcmVzIDoge3RleHQ6IHJlc30sIGZ1bmN0aW9uIChlcnIsIHByb2Nlc3NlZCkge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUocHJvY2Vzc2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGVyZSB3YXMgbm8gY29udGVudCBwcm9jZXNzb3IsIHdlIHdpbGwgYXNzdW1lIHRoYXQgZm9yIGFsbCBvYmplY3RzIHRoYXQgaXQgaXMgYSBTdXBlcmFnZW50IHJlc3BvbnNlXG4gICAgICAgIC8vIGFuZCB3aWxsIHJldHVybiBpdHMgYHRleHRgIHByb3BlcnR5IHZhbHVlLiAgT3RoZXJ3aXNlLCB3ZSB3aWxsIHJldHVybiB0aGUgcmF3IHJlc3BvbnNlLlxuICAgICAgICByZXR1cm4gdHlwZW9mIHJlcyA9PT0gJ29iamVjdCcgPyByZXMudGV4dCA6IHJlcztcbiAgICAgIH1cbiAgICB9KTtcblxuICByZXR1cm4gYWxsVGFza3M7XG59O1xuIiwiLypcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNSBKZXJlbXkgV2hpdGxvY2tcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHVuc3VwcG9ydGVkRXJyb3IgPSBuZXcgVHlwZUVycm9yKCdUaGUgXFwnZmlsZVxcJyBzY2hlbWUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlcicpO1xuXG4vKipcbiAqIFRoZSBmaWxlIGxvYWRlciBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyLlxuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSB0aGUgZmlsZSBsb2FkZXIgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlclxuICovXG5tb2R1bGUuZXhwb3J0cy5nZXRCYXNlID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyB1bnN1cHBvcnRlZEVycm9yO1xufTtcblxuLyoqXG4gKiBUaGUgZmlsZSBsb2FkZXIgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3Nlci5cbiAqL1xubW9kdWxlLmV4cG9ydHMubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZuID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcblxuICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm4odW5zdXBwb3J0ZWRFcnJvcik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgdW5zdXBwb3J0ZWRFcnJvcjtcbiAgfVxufTtcbiIsIi8qIGVzbGludC1lbnYgbm9kZSwgYnJvd3NlciAqL1xuXG4vKlxuICogVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IEplcmVteSBXaGl0bG9ja1xuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVxdWVzdCA9IHJlcXVpcmUoJ3N1cGVyYWdlbnQnKTtcblxudmFyIHN1cHBvcnRlZEh0dHBNZXRob2RzID0gWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncGF0Y2gnLCAncG9zdCcsICdwdXQnXTtcblxuLyoqXG4gKiBMb2FkcyBhIGZpbGUgZnJvbSBhbiBodHRwIG9yIGh0dHBzIFVSTC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gLSBUaGUgZG9jdW1lbnQgVVJMIChJZiByZWxhdGl2ZSwgbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gd2luZG93LmxvY2F0aW9uLm9yaWdpbikuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFRoZSBsb2FkZXIgb3B0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1ldGhvZD1nZXRdIC0gVGhlIEhUVFAgbWV0aG9kIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3RcbiAqIEBwYXJhbSB7bW9kdWxlOlBhdGhMb2FkZXJ+UHJlcGFyZVJlcXVlc3RDYWxsYmFja30gW29wdGlvbnMucHJlcGFyZVJlcXVlc3RdIC0gVGhlIGNhbGxiYWNrIHVzZWQgdG8gcHJlcGFyZSBhIHJlcXVlc3RcbiAqIEBwYXJhbSB7bW9kdWxlOlBhdGhMb2FkZXJ+UHJvY2Vzc1Jlc3BvbnNlQ2FsbGJhY2t9IFtvcHRpb25zLnByb2Nlc3NDb250ZW50XSAtIFRoZSBjYWxsYmFjayB1c2VkIHRvIHByb2Nlc3MgdGhlXG4gKiByZXNwb25zZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgZXJyb3ItZmlyc3QgY2FsbGJhY2tcbiAqL1xubW9kdWxlLmV4cG9ydHMubG9hZCA9IGZ1bmN0aW9uIChsb2NhdGlvbiwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIHJlYWxNZXRob2QgPSBvcHRpb25zLm1ldGhvZCA/IG9wdGlvbnMubWV0aG9kLnRvTG93ZXJDYXNlKCkgOiAnZ2V0JztcbiAgdmFyIGVycjtcbiAgdmFyIHJlYWxSZXF1ZXN0O1xuXG4gIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0IChlcnIsIHJlcSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGJ1ZmZlcigpIGlzIG9ubHkgYXZhaWxhYmxlIGluIE5vZGUuanNcbiAgICAgIGlmICh0eXBlb2YgcmVxLmJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXEuYnVmZmVyKHRydWUpO1xuICAgICAgfVxuXG4gICAgICByZXFcbiAgICAgICAgLmVuZChmdW5jdGlvbiAoZXJyMiwgcmVzKSB7XG4gICAgICAgICAgaWYgKGVycjIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycjIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjayh1bmRlZmluZWQsIHJlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMubWV0aG9kICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5tZXRob2QgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnIgPSBuZXcgVHlwZUVycm9yKCdvcHRpb25zLm1ldGhvZCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0ZWRIdHRwTWV0aG9kcy5pbmRleE9mKG9wdGlvbnMubWV0aG9kKSA9PT0gLTEpIHtcbiAgICAgIGVyciA9IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMubWV0aG9kIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6ICcgK1xuICAgICAgICBzdXBwb3J0ZWRIdHRwTWV0aG9kcy5zbGljZSgwLCBzdXBwb3J0ZWRIdHRwTWV0aG9kcy5sZW5ndGggLSAxKS5qb2luKCcsICcpICsgJyBvciAnICtcbiAgICAgICAgc3VwcG9ydGVkSHR0cE1ldGhvZHNbc3VwcG9ydGVkSHR0cE1ldGhvZHMubGVuZ3RoIC0gMV0pO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucy5wcmVwYXJlUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMucHJlcGFyZVJlcXVlc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICBlcnIgPSBuZXcgVHlwZUVycm9yKCdvcHRpb25zLnByZXBhcmVSZXF1ZXN0IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKCFlcnIpIHtcbiAgICByZWFsUmVxdWVzdCA9IHJlcXVlc3RbcmVhbE1ldGhvZCA9PT0gJ2RlbGV0ZScgPyAnZGVsJyA6IHJlYWxNZXRob2RdKGxvY2F0aW9uKTtcblxuICAgIGlmIChvcHRpb25zLnByZXBhcmVSZXF1ZXN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBvcHRpb25zLnByZXBhcmVSZXF1ZXN0KHJlYWxSZXF1ZXN0LCBtYWtlUmVxdWVzdCk7XG4gICAgICB9IGNhdGNoIChlcnIyKSB7XG4gICAgICAgIGNhbGxiYWNrKGVycjIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtYWtlUmVxdWVzdCh1bmRlZmluZWQsIHJlYWxSZXF1ZXN0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY2FsbGJhY2soZXJyKTtcbiAgfVxufTtcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBzZXRUaW1lb3V0KGRyYWluUXVldWUsIDApO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gSWYgb2JqLmhhc093blByb3BlcnR5IGhhcyBiZWVuIG92ZXJyaWRkZW4sIHRoZW4gY2FsbGluZ1xuLy8gb2JqLmhhc093blByb3BlcnR5KHByb3ApIHdpbGwgYnJlYWsuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcwN1xuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihxcywgc2VwLCBlcSwgb3B0aW9ucykge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgcXMgIT09ICdzdHJpbmcnIHx8IHFzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIgcmVnZXhwID0gL1xcKy9nO1xuICBxcyA9IHFzLnNwbGl0KHNlcCk7XG5cbiAgdmFyIG1heEtleXMgPSAxMDAwO1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5tYXhLZXlzID09PSAnbnVtYmVyJykge1xuICAgIG1heEtleXMgPSBvcHRpb25zLm1heEtleXM7XG4gIH1cblxuICB2YXIgbGVuID0gcXMubGVuZ3RoO1xuICAvLyBtYXhLZXlzIDw9IDAgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbm90IGxpbWl0IGtleXMgY291bnRcbiAgaWYgKG1heEtleXMgPiAwICYmIGxlbiA+IG1heEtleXMpIHtcbiAgICBsZW4gPSBtYXhLZXlzO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciB4ID0gcXNbaV0ucmVwbGFjZShyZWdleHAsICclMjAnKSxcbiAgICAgICAgaWR4ID0geC5pbmRleE9mKGVxKSxcbiAgICAgICAga3N0ciwgdnN0ciwgaywgdjtcblxuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAga3N0ciA9IHguc3Vic3RyKDAsIGlkeCk7XG4gICAgICB2c3RyID0geC5zdWJzdHIoaWR4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtzdHIgPSB4O1xuICAgICAgdnN0ciA9ICcnO1xuICAgIH1cblxuICAgIGsgPSBkZWNvZGVVUklDb21wb25lbnQoa3N0cik7XG4gICAgdiA9IGRlY29kZVVSSUNvbXBvbmVudCh2c3RyKTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkob2JqLCBrKSkge1xuICAgICAgb2JqW2tdID0gdjtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgb2JqW2tdLnB1c2godik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtrXSA9IFtvYmpba10sIHZdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnlQcmltaXRpdmUgPSBmdW5jdGlvbih2KSB7XG4gIHN3aXRjaCAodHlwZW9mIHYpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHY7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB2ID8gJ3RydWUnIDogJ2ZhbHNlJztcblxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gaXNGaW5pdGUodikgPyB2IDogJyc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iaiwgc2VwLCBlcSwgbmFtZSkge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIG9iaiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBtYXAob2JqZWN0S2V5cyhvYmopLCBmdW5jdGlvbihrKSB7XG4gICAgICB2YXIga3MgPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKGspKSArIGVxO1xuICAgICAgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgICByZXR1cm4gbWFwKG9ialtrXSwgZnVuY3Rpb24odikge1xuICAgICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUodikpO1xuICAgICAgICB9KS5qb2luKHNlcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9ialtrXSkpO1xuICAgICAgfVxuICAgIH0pLmpvaW4oc2VwKTtcblxuICB9XG5cbiAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG5hbWUpKSArIGVxICtcbiAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqKSk7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuZnVuY3Rpb24gbWFwICh4cywgZikge1xuICBpZiAoeHMubWFwKSByZXR1cm4geHMubWFwKGYpO1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICByZXMucHVzaChmKHhzW2ldLCBpKSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSByZXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMucGFyc2UgPSByZXF1aXJlKCcuL2RlY29kZScpO1xuZXhwb3J0cy5lbmNvZGUgPSBleHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vZW5jb2RlJyk7XG4iLCJcbi8qKlxuICogUmVkdWNlIGBhcnJgIHdpdGggYGZuYC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge01peGVkfSBpbml0aWFsXG4gKlxuICogVE9ETzogY29tYmF0aWJsZSBlcnJvciBoYW5kbGluZz9cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFyciwgZm4sIGluaXRpYWwpeyAgXG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcbiAgdmFyIGN1cnIgPSBhcmd1bWVudHMubGVuZ3RoID09IDNcbiAgICA/IGluaXRpYWxcbiAgICA6IGFycltpZHgrK107XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGN1cnIgPSBmbi5jYWxsKG51bGwsIGN1cnIsIGFycltpZHhdLCArK2lkeCwgYXJyKTtcbiAgfVxuICBcbiAgcmV0dXJuIGN1cnI7XG59OyIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0cikge1xuXHR2YXIgaXNFeHRlbmRlZExlbmd0aFBhdGggPSAvXlxcXFxcXFxcXFw/XFxcXC8udGVzdChzdHIpO1xuXHR2YXIgaGFzTm9uQXNjaWkgPSAvW15cXHgwMC1cXHg4MF0rLy50ZXN0KHN0cik7XG5cblx0aWYgKGlzRXh0ZW5kZWRMZW5ndGhQYXRoIHx8IGhhc05vbkFzY2lpKSB7XG5cdFx0cmV0dXJuIHN0cjtcblx0fVxuXG5cdHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xufTtcbiIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgRW1pdHRlciA9IHJlcXVpcmUoJ2VtaXR0ZXInKTtcbnZhciByZWR1Y2UgPSByZXF1aXJlKCdyZWR1Y2UnKTtcbnZhciByZXF1ZXN0QmFzZSA9IHJlcXVpcmUoJy4vcmVxdWVzdC1iYXNlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzLW9iamVjdCcpO1xuXG4vKipcbiAqIFJvb3QgcmVmZXJlbmNlIGZvciBpZnJhbWVzLlxuICovXG5cbnZhciByb290O1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7IC8vIEJyb3dzZXIgd2luZG93XG4gIHJvb3QgPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykgeyAvLyBXZWIgV29ya2VyXG4gIHJvb3QgPSBzZWxmO1xufSBlbHNlIHsgLy8gT3RoZXIgZW52aXJvbm1lbnRzXG4gIHJvb3QgPSB0aGlzO1xufVxuXG4vKipcbiAqIE5vb3AuXG4gKi9cblxuZnVuY3Rpb24gbm9vcCgpe307XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYSBob3N0IG9iamVjdCxcbiAqIHdlIGRvbid0IHdhbnQgdG8gc2VyaWFsaXplIHRoZXNlIDopXG4gKlxuICogVE9ETzogZnV0dXJlIHByb29mLCBtb3ZlIHRvIGNvbXBvZW50IGxhbmRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNIb3N0KG9iaikge1xuICB2YXIgc3RyID0ge30udG9TdHJpbmcuY2FsbChvYmopO1xuXG4gIHN3aXRjaCAoc3RyKSB7XG4gICAgY2FzZSAnW29iamVjdCBGaWxlXSc6XG4gICAgY2FzZSAnW29iamVjdCBCbG9iXSc6XG4gICAgY2FzZSAnW29iamVjdCBGb3JtRGF0YV0nOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEV4cG9zZSBgcmVxdWVzdGAuXG4gKi9cblxudmFyIHJlcXVlc3QgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vcmVxdWVzdCcpLmJpbmQobnVsbCwgUmVxdWVzdCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIFhIUi5cbiAqL1xuXG5yZXF1ZXN0LmdldFhIUiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHJvb3QuWE1MSHR0cFJlcXVlc3RcbiAgICAgICYmICghcm9vdC5sb2NhdGlvbiB8fCAnZmlsZTonICE9IHJvb3QubG9jYXRpb24ucHJvdG9jb2xcbiAgICAgICAgICB8fCAhcm9vdC5BY3RpdmVYT2JqZWN0KSkge1xuICAgIHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3Q7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpOyB9IGNhdGNoKGUpIHt9XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUC42LjAnKTsgfSBjYXRjaChlKSB7fVxuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAuMy4wJyk7IH0gY2F0Y2goZSkge31cbiAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyk7IH0gY2F0Y2goZSkge31cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgYWRkZWQgdG8gc3VwcG9ydCBJRS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxudmFyIHRyaW0gPSAnJy50cmltXG4gID8gZnVuY3Rpb24ocykgeyByZXR1cm4gcy50cmltKCk7IH1cbiAgOiBmdW5jdGlvbihzKSB7IHJldHVybiBzLnJlcGxhY2UoLyheXFxzKnxcXHMqJCkvZywgJycpOyB9O1xuXG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gYG9iamAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2VyaWFsaXplKG9iaikge1xuICBpZiAoIWlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7XG4gIHZhciBwYWlycyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKG51bGwgIT0gb2JqW2tleV0pIHtcbiAgICAgIHB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyKHBhaXJzLCBrZXksIG9ialtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICByZXR1cm4gcGFpcnMuam9pbignJicpO1xufVxuXG4vKipcbiAqIEhlbHBzICdzZXJpYWxpemUnIHdpdGggc2VyaWFsaXppbmcgYXJyYXlzLlxuICogTXV0YXRlcyB0aGUgcGFpcnMgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcGFpcnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICovXG5cbmZ1bmN0aW9uIHB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyKHBhaXJzLCBrZXksIHZhbCkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgcmV0dXJuIHZhbC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICAgIHB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyKHBhaXJzLCBrZXksIHYpO1xuICAgIH0pO1xuICB9XG4gIHBhaXJzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGtleSlcbiAgICArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpKTtcbn1cblxuLyoqXG4gKiBFeHBvc2Ugc2VyaWFsaXphdGlvbiBtZXRob2QuXG4gKi9cblxuIHJlcXVlc3Quc2VyaWFsaXplT2JqZWN0ID0gc2VyaWFsaXplO1xuXG4gLyoqXG4gICogUGFyc2UgdGhlIGdpdmVuIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCBgc3RyYC5cbiAgKlxuICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICogQGFwaSBwcml2YXRlXG4gICovXG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHN0cikge1xuICB2YXIgb2JqID0ge307XG4gIHZhciBwYWlycyA9IHN0ci5zcGxpdCgnJicpO1xuICB2YXIgcGFydHM7XG4gIHZhciBwYWlyO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYWlycy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIHBhaXIgPSBwYWlyc1tpXTtcbiAgICBwYXJ0cyA9IHBhaXIuc3BsaXQoJz0nKTtcbiAgICBvYmpbZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzBdKV0gPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMV0pO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBFeHBvc2UgcGFyc2VyLlxuICovXG5cbnJlcXVlc3QucGFyc2VTdHJpbmcgPSBwYXJzZVN0cmluZztcblxuLyoqXG4gKiBEZWZhdWx0IE1JTUUgdHlwZSBtYXAuXG4gKlxuICogICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gKlxuICovXG5cbnJlcXVlc3QudHlwZXMgPSB7XG4gIGh0bWw6ICd0ZXh0L2h0bWwnLFxuICBqc29uOiAnYXBwbGljYXRpb24vanNvbicsXG4gIHhtbDogJ2FwcGxpY2F0aW9uL3htbCcsXG4gIHVybGVuY29kZWQ6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAnZm9ybSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAnZm9ybS1kYXRhJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbn07XG5cbi8qKlxuICogRGVmYXVsdCBzZXJpYWxpemF0aW9uIG1hcC5cbiAqXG4gKiAgICAgc3VwZXJhZ2VudC5zZXJpYWxpemVbJ2FwcGxpY2F0aW9uL3htbCddID0gZnVuY3Rpb24ob2JqKXtcbiAqICAgICAgIHJldHVybiAnZ2VuZXJhdGVkIHhtbCBoZXJlJztcbiAqICAgICB9O1xuICpcbiAqL1xuXG4gcmVxdWVzdC5zZXJpYWxpemUgPSB7XG4gICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogc2VyaWFsaXplLFxuICAgJ2FwcGxpY2F0aW9uL2pzb24nOiBKU09OLnN0cmluZ2lmeVxuIH07XG5cbiAvKipcbiAgKiBEZWZhdWx0IHBhcnNlcnMuXG4gICpcbiAgKiAgICAgc3VwZXJhZ2VudC5wYXJzZVsnYXBwbGljYXRpb24veG1sJ10gPSBmdW5jdGlvbihzdHIpe1xuICAqICAgICAgIHJldHVybiB7IG9iamVjdCBwYXJzZWQgZnJvbSBzdHIgfTtcbiAgKiAgICAgfTtcbiAgKlxuICAqL1xuXG5yZXF1ZXN0LnBhcnNlID0ge1xuICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogcGFyc2VTdHJpbmcsXG4gICdhcHBsaWNhdGlvbi9qc29uJzogSlNPTi5wYXJzZVxufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gaGVhZGVyIGBzdHJgIGludG9cbiAqIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXBwZWQgZmllbGRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVyKHN0cikge1xuICB2YXIgbGluZXMgPSBzdHIuc3BsaXQoL1xccj9cXG4vKTtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICB2YXIgaW5kZXg7XG4gIHZhciBsaW5lO1xuICB2YXIgZmllbGQ7XG4gIHZhciB2YWw7XG5cbiAgbGluZXMucG9wKCk7IC8vIHRyYWlsaW5nIENSTEZcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBsaW5lID0gbGluZXNbaV07XG4gICAgaW5kZXggPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBmaWVsZCA9IGxpbmUuc2xpY2UoMCwgaW5kZXgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gdHJpbShsaW5lLnNsaWNlKGluZGV4ICsgMSkpO1xuICAgIGZpZWxkc1tmaWVsZF0gPSB2YWw7XG4gIH1cblxuICByZXR1cm4gZmllbGRzO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBtaW1lYCBpcyBqc29uIG9yIGhhcyAranNvbiBzdHJ1Y3R1cmVkIHN5bnRheCBzdWZmaXguXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc0pTT04obWltZSkge1xuICByZXR1cm4gL1tcXC8rXWpzb25cXGIvLnRlc3QobWltZSk7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBtaW1lIHR5cGUgZm9yIHRoZSBnaXZlbiBgc3RyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB0eXBlKHN0cil7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAqOyAqLykuc2hpZnQoKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhlYWRlciBmaWVsZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcmFtcyhzdHIpe1xuICByZXR1cm4gcmVkdWNlKHN0ci5zcGxpdCgvICo7ICovKSwgZnVuY3Rpb24ob2JqLCBzdHIpe1xuICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgvICo9ICovKVxuICAgICAgLCBrZXkgPSBwYXJ0cy5zaGlmdCgpXG4gICAgICAsIHZhbCA9IHBhcnRzLnNoaWZ0KCk7XG5cbiAgICBpZiAoa2V5ICYmIHZhbCkgb2JqW2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xufTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXNwb25zZWAgd2l0aCB0aGUgZ2l2ZW4gYHhocmAuXG4gKlxuICogIC0gc2V0IGZsYWdzICgub2ssIC5lcnJvciwgZXRjKVxuICogIC0gcGFyc2UgaGVhZGVyXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogIEFsaWFzaW5nIGBzdXBlcmFnZW50YCBhcyBgcmVxdWVzdGAgaXMgbmljZTpcbiAqXG4gKiAgICAgIHJlcXVlc3QgPSBzdXBlcmFnZW50O1xuICpcbiAqICBXZSBjYW4gdXNlIHRoZSBwcm9taXNlLWxpa2UgQVBJLCBvciBwYXNzIGNhbGxiYWNrczpcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvJykuZW5kKGZ1bmN0aW9uKHJlcyl7fSk7XG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvJywgZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiAgU2VuZGluZyBkYXRhIGNhbiBiZSBjaGFpbmVkOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgLmVuZChmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqICBPciBwYXNzZWQgdG8gYC5zZW5kKClgOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0sIGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogIE9yIHBhc3NlZCB0byBgLnBvc3QoKWA6XG4gKlxuICogICAgICByZXF1ZXN0XG4gKiAgICAgICAgLnBvc3QoJy91c2VyJywgeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgLmVuZChmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqIE9yIGZ1cnRoZXIgcmVkdWNlZCB0byBhIHNpbmdsZSBjYWxsIGZvciBzaW1wbGUgY2FzZXM6XG4gKlxuICogICAgICByZXF1ZXN0XG4gKiAgICAgICAgLnBvc3QoJy91c2VyJywgeyBuYW1lOiAndGonIH0sIGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogQHBhcmFtIHtYTUxIVFRQUmVxdWVzdH0geGhyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gUmVzcG9uc2UocmVxLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB0aGlzLnJlcSA9IHJlcTtcbiAgdGhpcy54aHIgPSB0aGlzLnJlcS54aHI7XG4gIC8vIHJlc3BvbnNlVGV4dCBpcyBhY2Nlc3NpYmxlIG9ubHkgaWYgcmVzcG9uc2VUeXBlIGlzICcnIG9yICd0ZXh0JyBhbmQgb24gb2xkZXIgYnJvd3NlcnNcbiAgdGhpcy50ZXh0ID0gKCh0aGlzLnJlcS5tZXRob2QgIT0nSEVBRCcgJiYgKHRoaXMueGhyLnJlc3BvbnNlVHlwZSA9PT0gJycgfHwgdGhpcy54aHIucmVzcG9uc2VUeXBlID09PSAndGV4dCcpKSB8fCB0eXBlb2YgdGhpcy54aHIucmVzcG9uc2VUeXBlID09PSAndW5kZWZpbmVkJylcbiAgICAgPyB0aGlzLnhoci5yZXNwb25zZVRleHRcbiAgICAgOiBudWxsO1xuICB0aGlzLnN0YXR1c1RleHQgPSB0aGlzLnJlcS54aHIuc3RhdHVzVGV4dDtcbiAgdGhpcy5zZXRTdGF0dXNQcm9wZXJ0aWVzKHRoaXMueGhyLnN0YXR1cyk7XG4gIHRoaXMuaGVhZGVyID0gdGhpcy5oZWFkZXJzID0gcGFyc2VIZWFkZXIodGhpcy54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpO1xuICAvLyBnZXRBbGxSZXNwb25zZUhlYWRlcnMgc29tZXRpbWVzIGZhbHNlbHkgcmV0dXJucyBcIlwiIGZvciBDT1JTIHJlcXVlc3RzLCBidXRcbiAgLy8gZ2V0UmVzcG9uc2VIZWFkZXIgc3RpbGwgd29ya3MuIHNvIHdlIGdldCBjb250ZW50LXR5cGUgZXZlbiBpZiBnZXR0aW5nXG4gIC8vIG90aGVyIGhlYWRlcnMgZmFpbHMuXG4gIHRoaXMuaGVhZGVyWydjb250ZW50LXR5cGUnXSA9IHRoaXMueGhyLmdldFJlc3BvbnNlSGVhZGVyKCdjb250ZW50LXR5cGUnKTtcbiAgdGhpcy5zZXRIZWFkZXJQcm9wZXJ0aWVzKHRoaXMuaGVhZGVyKTtcbiAgdGhpcy5ib2R5ID0gdGhpcy5yZXEubWV0aG9kICE9ICdIRUFEJ1xuICAgID8gdGhpcy5wYXJzZUJvZHkodGhpcy50ZXh0ID8gdGhpcy50ZXh0IDogdGhpcy54aHIucmVzcG9uc2UpXG4gICAgOiBudWxsO1xufVxuXG4vKipcbiAqIEdldCBjYXNlLWluc2Vuc2l0aXZlIGBmaWVsZGAgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlc3BvbnNlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihmaWVsZCl7XG4gIHJldHVybiB0aGlzLmhlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXTtcbn07XG5cbi8qKlxuICogU2V0IGhlYWRlciByZWxhdGVkIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGAudHlwZWAgdGhlIGNvbnRlbnQgdHlwZSB3aXRob3V0IHBhcmFtc1xuICpcbiAqIEEgcmVzcG9uc2Ugb2YgXCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIlxuICogd2lsbCBwcm92aWRlIHlvdSB3aXRoIGEgYC50eXBlYCBvZiBcInRleHQvcGxhaW5cIi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaGVhZGVyXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZS5wcm90b3R5cGUuc2V0SGVhZGVyUHJvcGVydGllcyA9IGZ1bmN0aW9uKGhlYWRlcil7XG4gIC8vIGNvbnRlbnQtdHlwZVxuICB2YXIgY3QgPSB0aGlzLmhlYWRlclsnY29udGVudC10eXBlJ10gfHwgJyc7XG4gIHRoaXMudHlwZSA9IHR5cGUoY3QpO1xuXG4gIC8vIHBhcmFtc1xuICB2YXIgb2JqID0gcGFyYW1zKGN0KTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikgdGhpc1trZXldID0gb2JqW2tleV07XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBib2R5IGBzdHJgLlxuICpcbiAqIFVzZWQgZm9yIGF1dG8tcGFyc2luZyBvZiBib2RpZXMuIFBhcnNlcnNcbiAqIGFyZSBkZWZpbmVkIG9uIHRoZSBgc3VwZXJhZ2VudC5wYXJzZWAgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge01peGVkfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVzcG9uc2UucHJvdG90eXBlLnBhcnNlQm9keSA9IGZ1bmN0aW9uKHN0cil7XG4gIHZhciBwYXJzZSA9IHJlcXVlc3QucGFyc2VbdGhpcy50eXBlXTtcbiAgaWYgKCFwYXJzZSAmJiBpc0pTT04odGhpcy50eXBlKSkge1xuICAgIHBhcnNlID0gcmVxdWVzdC5wYXJzZVsnYXBwbGljYXRpb24vanNvbiddO1xuICB9XG4gIHJldHVybiBwYXJzZSAmJiBzdHIgJiYgKHN0ci5sZW5ndGggfHwgc3RyIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgID8gcGFyc2Uoc3RyKVxuICAgIDogbnVsbDtcbn07XG5cbi8qKlxuICogU2V0IGZsYWdzIHN1Y2ggYXMgYC5va2AgYmFzZWQgb24gYHN0YXR1c2AuXG4gKlxuICogRm9yIGV4YW1wbGUgYSAyeHggcmVzcG9uc2Ugd2lsbCBnaXZlIHlvdSBhIGAub2tgIG9mIF9fdHJ1ZV9fXG4gKiB3aGVyZWFzIDV4eCB3aWxsIGJlIF9fZmFsc2VfXyBhbmQgYC5lcnJvcmAgd2lsbCBiZSBfX3RydWVfXy4gVGhlXG4gKiBgLmNsaWVudEVycm9yYCBhbmQgYC5zZXJ2ZXJFcnJvcmAgYXJlIGFsc28gYXZhaWxhYmxlIHRvIGJlIG1vcmVcbiAqIHNwZWNpZmljLCBhbmQgYC5zdGF0dXNUeXBlYCBpcyB0aGUgY2xhc3Mgb2YgZXJyb3IgcmFuZ2luZyBmcm9tIDEuLjVcbiAqIHNvbWV0aW1lcyB1c2VmdWwgZm9yIG1hcHBpbmcgcmVzcG9uZCBjb2xvcnMgZXRjLlxuICpcbiAqIFwic3VnYXJcIiBwcm9wZXJ0aWVzIGFyZSBhbHNvIGRlZmluZWQgZm9yIGNvbW1vbiBjYXNlcy4gQ3VycmVudGx5IHByb3ZpZGluZzpcbiAqXG4gKiAgIC0gLm5vQ29udGVudFxuICogICAtIC5iYWRSZXF1ZXN0XG4gKiAgIC0gLnVuYXV0aG9yaXplZFxuICogICAtIC5ub3RBY2NlcHRhYmxlXG4gKiAgIC0gLm5vdEZvdW5kXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVzcG9uc2UucHJvdG90eXBlLnNldFN0YXR1c1Byb3BlcnRpZXMgPSBmdW5jdGlvbihzdGF0dXMpe1xuICAvLyBoYW5kbGUgSUU5IGJ1ZzogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDA0Njk3Mi9tc2llLXJldHVybnMtc3RhdHVzLWNvZGUtb2YtMTIyMy1mb3ItYWpheC1yZXF1ZXN0XG4gIGlmIChzdGF0dXMgPT09IDEyMjMpIHtcbiAgICBzdGF0dXMgPSAyMDQ7XG4gIH1cblxuICB2YXIgdHlwZSA9IHN0YXR1cyAvIDEwMCB8IDA7XG5cbiAgLy8gc3RhdHVzIC8gY2xhc3NcbiAgdGhpcy5zdGF0dXMgPSB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXM7XG4gIHRoaXMuc3RhdHVzVHlwZSA9IHR5cGU7XG5cbiAgLy8gYmFzaWNzXG4gIHRoaXMuaW5mbyA9IDEgPT0gdHlwZTtcbiAgdGhpcy5vayA9IDIgPT0gdHlwZTtcbiAgdGhpcy5jbGllbnRFcnJvciA9IDQgPT0gdHlwZTtcbiAgdGhpcy5zZXJ2ZXJFcnJvciA9IDUgPT0gdHlwZTtcbiAgdGhpcy5lcnJvciA9ICg0ID09IHR5cGUgfHwgNSA9PSB0eXBlKVxuICAgID8gdGhpcy50b0Vycm9yKClcbiAgICA6IGZhbHNlO1xuXG4gIC8vIHN1Z2FyXG4gIHRoaXMuYWNjZXB0ZWQgPSAyMDIgPT0gc3RhdHVzO1xuICB0aGlzLm5vQ29udGVudCA9IDIwNCA9PSBzdGF0dXM7XG4gIHRoaXMuYmFkUmVxdWVzdCA9IDQwMCA9PSBzdGF0dXM7XG4gIHRoaXMudW5hdXRob3JpemVkID0gNDAxID09IHN0YXR1cztcbiAgdGhpcy5ub3RBY2NlcHRhYmxlID0gNDA2ID09IHN0YXR1cztcbiAgdGhpcy5ub3RGb3VuZCA9IDQwNCA9PSBzdGF0dXM7XG4gIHRoaXMuZm9yYmlkZGVuID0gNDAzID09IHN0YXR1cztcbn07XG5cbi8qKlxuICogUmV0dXJuIGFuIGBFcnJvcmAgcmVwcmVzZW50YXRpdmUgb2YgdGhpcyByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJuIHtFcnJvcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVzcG9uc2UucHJvdG90eXBlLnRvRXJyb3IgPSBmdW5jdGlvbigpe1xuICB2YXIgcmVxID0gdGhpcy5yZXE7XG4gIHZhciBtZXRob2QgPSByZXEubWV0aG9kO1xuICB2YXIgdXJsID0gcmVxLnVybDtcblxuICB2YXIgbXNnID0gJ2Nhbm5vdCAnICsgbWV0aG9kICsgJyAnICsgdXJsICsgJyAoJyArIHRoaXMuc3RhdHVzICsgJyknO1xuICB2YXIgZXJyID0gbmV3IEVycm9yKG1zZyk7XG4gIGVyci5zdGF0dXMgPSB0aGlzLnN0YXR1cztcbiAgZXJyLm1ldGhvZCA9IG1ldGhvZDtcbiAgZXJyLnVybCA9IHVybDtcblxuICByZXR1cm4gZXJyO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgYFJlc3BvbnNlYC5cbiAqL1xuXG5yZXF1ZXN0LlJlc3BvbnNlID0gUmVzcG9uc2U7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgUmVxdWVzdGAgd2l0aCB0aGUgZ2l2ZW4gYG1ldGhvZGAgYW5kIGB1cmxgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gUmVxdWVzdChtZXRob2QsIHVybCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuX3F1ZXJ5ID0gdGhpcy5fcXVlcnkgfHwgW107XG4gIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICB0aGlzLnVybCA9IHVybDtcbiAgdGhpcy5oZWFkZXIgPSB7fTsgLy8gcHJlc2VydmVzIGhlYWRlciBuYW1lIGNhc2VcbiAgdGhpcy5faGVhZGVyID0ge307IC8vIGNvZXJjZXMgaGVhZGVyIG5hbWVzIHRvIGxvd2VyY2FzZVxuICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbigpe1xuICAgIHZhciBlcnIgPSBudWxsO1xuICAgIHZhciByZXMgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IG5ldyBSZXNwb25zZShzZWxmKTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIGVyciA9IG5ldyBFcnJvcignUGFyc2VyIGlzIHVuYWJsZSB0byBwYXJzZSB0aGUgcmVzcG9uc2UnKTtcbiAgICAgIGVyci5wYXJzZSA9IHRydWU7XG4gICAgICBlcnIub3JpZ2luYWwgPSBlO1xuICAgICAgLy8gaXNzdWUgIzY3NTogcmV0dXJuIHRoZSByYXcgcmVzcG9uc2UgaWYgdGhlIHJlc3BvbnNlIHBhcnNpbmcgZmFpbHNcbiAgICAgIGVyci5yYXdSZXNwb25zZSA9IHNlbGYueGhyICYmIHNlbGYueGhyLnJlc3BvbnNlVGV4dCA/IHNlbGYueGhyLnJlc3BvbnNlVGV4dCA6IG51bGw7XG4gICAgICAvLyBpc3N1ZSAjODc2OiByZXR1cm4gdGhlIGh0dHAgc3RhdHVzIGNvZGUgaWYgdGhlIHJlc3BvbnNlIHBhcnNpbmcgZmFpbHNcbiAgICAgIGVyci5zdGF0dXNDb2RlID0gc2VsZi54aHIgJiYgc2VsZi54aHIuc3RhdHVzID8gc2VsZi54aHIuc3RhdHVzIDogbnVsbDtcbiAgICAgIHJldHVybiBzZWxmLmNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgc2VsZi5lbWl0KCdyZXNwb25zZScsIHJlcyk7XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gc2VsZi5jYWxsYmFjayhlcnIsIHJlcyk7XG4gICAgfVxuXG4gICAgaWYgKHJlcy5zdGF0dXMgPj0gMjAwICYmIHJlcy5zdGF0dXMgPCAzMDApIHtcbiAgICAgIHJldHVybiBzZWxmLmNhbGxiYWNrKGVyciwgcmVzKTtcbiAgICB9XG5cbiAgICB2YXIgbmV3X2VyciA9IG5ldyBFcnJvcihyZXMuc3RhdHVzVGV4dCB8fCAnVW5zdWNjZXNzZnVsIEhUVFAgcmVzcG9uc2UnKTtcbiAgICBuZXdfZXJyLm9yaWdpbmFsID0gZXJyO1xuICAgIG5ld19lcnIucmVzcG9uc2UgPSByZXM7XG4gICAgbmV3X2Vyci5zdGF0dXMgPSByZXMuc3RhdHVzO1xuXG4gICAgc2VsZi5jYWxsYmFjayhuZXdfZXJyLCByZXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBNaXhpbiBgRW1pdHRlcmAgYW5kIGByZXF1ZXN0QmFzZWAuXG4gKi9cblxuRW1pdHRlcihSZXF1ZXN0LnByb3RvdHlwZSk7XG5mb3IgKHZhciBrZXkgaW4gcmVxdWVzdEJhc2UpIHtcbiAgUmVxdWVzdC5wcm90b3R5cGVba2V5XSA9IHJlcXVlc3RCYXNlW2tleV07XG59XG5cbi8qKlxuICogQWJvcnQgdGhlIHJlcXVlc3QsIGFuZCBjbGVhciBwb3RlbnRpYWwgdGltZW91dC5cbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hYm9ydCA9IGZ1bmN0aW9uKCl7XG4gIGlmICh0aGlzLmFib3J0ZWQpIHJldHVybjtcbiAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgdGhpcy54aHIuYWJvcnQoKTtcbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgdGhpcy5lbWl0KCdhYm9ydCcpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IENvbnRlbnQtVHlwZSB0byBgdHlwZWAsIG1hcHBpbmcgdmFsdWVzIGZyb20gYHJlcXVlc3QudHlwZXNgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgc3VwZXJhZ2VudC50eXBlcy54bWwgPSAnYXBwbGljYXRpb24veG1sJztcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ3htbCcpXG4gKiAgICAgICAgLnNlbmQoeG1sc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvJylcbiAqICAgICAgICAudHlwZSgnYXBwbGljYXRpb24veG1sJylcbiAqICAgICAgICAuc2VuZCh4bWxzdHJpbmcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS50eXBlID0gZnVuY3Rpb24odHlwZSl7XG4gIHRoaXMuc2V0KCdDb250ZW50LVR5cGUnLCByZXF1ZXN0LnR5cGVzW3R5cGVdIHx8IHR5cGUpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHJlc3BvbnNlVHlwZSB0byBgdmFsYC4gUHJlc2VudGx5IHZhbGlkIHJlc3BvbnNlVHlwZXMgYXJlICdibG9iJyBhbmQgXG4gKiAnYXJyYXlidWZmZXInLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnJlc3BvbnNlVHlwZSgnYmxvYicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnJlc3BvbnNlVHlwZSA9IGZ1bmN0aW9uKHZhbCl7XG4gIHRoaXMuX3Jlc3BvbnNlVHlwZSA9IHZhbDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBY2NlcHQgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMuanNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvYWdlbnQnKVxuICogICAgICAgIC5hY2NlcHQoJ2pzb24nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpXG4gKiAgICAgICAgLmFjY2VwdCgnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2VwdFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKHR5cGUpe1xuICB0aGlzLnNldCgnQWNjZXB0JywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBdXRob3JpemF0aW9uIGZpZWxkIHZhbHVlIHdpdGggYHVzZXJgIGFuZCBgcGFzc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVzZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXNzXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB3aXRoICd0eXBlJyBwcm9wZXJ0eSAnYXV0bycgb3IgJ2Jhc2ljJyAoZGVmYXVsdCAnYmFzaWMnKVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmF1dGggPSBmdW5jdGlvbih1c2VyLCBwYXNzLCBvcHRpb25zKXtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIHR5cGU6ICdiYXNpYydcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKG9wdGlvbnMudHlwZSkge1xuICAgIGNhc2UgJ2Jhc2ljJzpcbiAgICAgIHZhciBzdHIgPSBidG9hKHVzZXIgKyAnOicgKyBwYXNzKTtcbiAgICAgIHRoaXMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBzdHIpO1xuICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYXV0byc6XG4gICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcjtcbiAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzO1xuICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4qIEFkZCBxdWVyeS1zdHJpbmcgYHZhbGAuXG4qXG4qIEV4YW1wbGVzOlxuKlxuKiAgIHJlcXVlc3QuZ2V0KCcvc2hvZXMnKVxuKiAgICAgLnF1ZXJ5KCdzaXplPTEwJylcbiogICAgIC5xdWVyeSh7IGNvbG9yOiAnYmx1ZScgfSlcbipcbiogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2YWxcbiogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4qIEBhcGkgcHVibGljXG4qL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uKHZhbCl7XG4gIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgdmFsKSB2YWwgPSBzZXJpYWxpemUodmFsKTtcbiAgaWYgKHZhbCkgdGhpcy5fcXVlcnkucHVzaCh2YWwpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUXVldWUgdGhlIGdpdmVuIGBmaWxlYCBhcyBhbiBhdHRhY2htZW50IHRvIHRoZSBzcGVjaWZpZWQgYGZpZWxkYCxcbiAqIHdpdGggb3B0aW9uYWwgYGZpbGVuYW1lYC5cbiAqXG4gKiBgYGAganNcbiAqIHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpXG4gKiAgIC5hdHRhY2gobmV3IEJsb2IoWyc8YSBpZD1cImFcIj48YiBpZD1cImJcIj5oZXkhPC9iPjwvYT4nXSwgeyB0eXBlOiBcInRleHQvaHRtbFwifSkpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcGFyYW0ge0Jsb2J8RmlsZX0gZmlsZVxuICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYXR0YWNoID0gZnVuY3Rpb24oZmllbGQsIGZpbGUsIGZpbGVuYW1lKXtcbiAgdGhpcy5fZ2V0Rm9ybURhdGEoKS5hcHBlbmQoZmllbGQsIGZpbGUsIGZpbGVuYW1lIHx8IGZpbGUubmFtZSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdC5wcm90b3R5cGUuX2dldEZvcm1EYXRhID0gZnVuY3Rpb24oKXtcbiAgaWYgKCF0aGlzLl9mb3JtRGF0YSkge1xuICAgIHRoaXMuX2Zvcm1EYXRhID0gbmV3IHJvb3QuRm9ybURhdGEoKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fZm9ybURhdGE7XG59O1xuXG4vKipcbiAqIFNlbmQgYGRhdGFgIGFzIHRoZSByZXF1ZXN0IGJvZHksIGRlZmF1bHRpbmcgdGhlIGAudHlwZSgpYCB0byBcImpzb25cIiB3aGVuXG4gKiBhbiBvYmplY3QgaXMgZ2l2ZW4uXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICAgLy8gbWFudWFsIGpzb25cbiAqICAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgICAudHlwZSgnanNvbicpXG4gKiAgICAgICAgIC5zZW5kKCd7XCJuYW1lXCI6XCJ0alwifScpXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gYXV0byBqc29uXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gbWFudWFsIHgtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC50eXBlKCdmb3JtJylcbiAqICAgICAgICAgLnNlbmQoJ25hbWU9dGonKVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIGF1dG8geC13d3ctZm9ybS11cmxlbmNvZGVkXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnR5cGUoJ2Zvcm0nKVxuICogICAgICAgICAuc2VuZCh7IG5hbWU6ICd0aicgfSlcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBkZWZhdWx0cyB0byB4LXd3dy1mb3JtLXVybGVuY29kZWRcbiAgKiAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICAqICAgICAgICAuc2VuZCgnbmFtZT10b2JpJylcbiAgKiAgICAgICAgLnNlbmQoJ3NwZWNpZXM9ZmVycmV0JylcbiAgKiAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGRhdGFcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24oZGF0YSl7XG4gIHZhciBvYmogPSBpc09iamVjdChkYXRhKTtcbiAgdmFyIHR5cGUgPSB0aGlzLl9oZWFkZXJbJ2NvbnRlbnQtdHlwZSddO1xuXG4gIC8vIG1lcmdlXG4gIGlmIChvYmogJiYgaXNPYmplY3QodGhpcy5fZGF0YSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgdGhpcy5fZGF0YVtrZXldID0gZGF0YVtrZXldO1xuICAgIH1cbiAgfSBlbHNlIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZGF0YSkge1xuICAgIGlmICghdHlwZSkgdGhpcy50eXBlKCdmb3JtJyk7XG4gICAgdHlwZSA9IHRoaXMuX2hlYWRlclsnY29udGVudC10eXBlJ107XG4gICAgaWYgKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnID09IHR5cGUpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSB0aGlzLl9kYXRhXG4gICAgICAgID8gdGhpcy5fZGF0YSArICcmJyArIGRhdGFcbiAgICAgICAgOiBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRhID0gKHRoaXMuX2RhdGEgfHwgJycpICsgZGF0YTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gIH1cblxuICBpZiAoIW9iaiB8fCBpc0hvc3QoZGF0YSkpIHJldHVybiB0aGlzO1xuICBpZiAoIXR5cGUpIHRoaXMudHlwZSgnanNvbicpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuUmVzcG9uc2UucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gc2VyaWFsaXplKGZuKXtcbiAgaWYgKHJvb3QuY29uc29sZSkge1xuICAgIGNvbnNvbGUud2FybihcIkNsaWVudC1zaWRlIHBhcnNlKCkgbWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gc2VyaWFsaXplKCkuIFRoaXMgbWV0aG9kIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggc3VwZXJhZ2VudCB2Mi4wXCIpO1xuICB9XG4gIHRoaXMuc2VyaWFsaXplKGZuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXNwb25zZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gc2VyaWFsaXplKGZuKXtcbiAgdGhpcy5fcGFyc2VyID0gZm47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBJbnZva2UgdGhlIGNhbGxiYWNrIHdpdGggYGVycmAgYW5kIGByZXNgXG4gKiBhbmQgaGFuZGxlIGFyaXR5IGNoZWNrLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHtSZXNwb25zZX0gcmVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5jYWxsYmFjayA9IGZ1bmN0aW9uKGVyciwgcmVzKXtcbiAgdmFyIGZuID0gdGhpcy5fY2FsbGJhY2s7XG4gIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gIGZuKGVyciwgcmVzKTtcbn07XG5cbi8qKlxuICogSW52b2tlIGNhbGxiYWNrIHdpdGggeC1kb21haW4gZXJyb3IuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuY3Jvc3NEb21haW5FcnJvciA9IGZ1bmN0aW9uKCl7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgaGFzIGJlZW4gdGVybWluYXRlZFxcblBvc3NpYmxlIGNhdXNlczogdGhlIG5ldHdvcmsgaXMgb2ZmbGluZSwgT3JpZ2luIGlzIG5vdCBhbGxvd2VkIGJ5IEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiwgdGhlIHBhZ2UgaXMgYmVpbmcgdW5sb2FkZWQsIGV0Yy4nKTtcbiAgZXJyLmNyb3NzRG9tYWluID0gdHJ1ZTtcblxuICBlcnIuc3RhdHVzID0gdGhpcy5zdGF0dXM7XG4gIGVyci5tZXRob2QgPSB0aGlzLm1ldGhvZDtcbiAgZXJyLnVybCA9IHRoaXMudXJsO1xuXG4gIHRoaXMuY2FsbGJhY2soZXJyKTtcbn07XG5cbi8qKlxuICogSW52b2tlIGNhbGxiYWNrIHdpdGggdGltZW91dCBlcnJvci5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS50aW1lb3V0RXJyb3IgPSBmdW5jdGlvbigpe1xuICB2YXIgdGltZW91dCA9IHRoaXMuX3RpbWVvdXQ7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IoJ3RpbWVvdXQgb2YgJyArIHRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnKTtcbiAgZXJyLnRpbWVvdXQgPSB0aW1lb3V0O1xuICB0aGlzLmNhbGxiYWNrKGVycik7XG59O1xuXG4vKipcbiAqIEVuYWJsZSB0cmFuc21pc3Npb24gb2YgY29va2llcyB3aXRoIHgtZG9tYWluIHJlcXVlc3RzLlxuICpcbiAqIE5vdGUgdGhhdCBmb3IgdGhpcyB0byB3b3JrIHRoZSBvcmlnaW4gbXVzdCBub3QgYmVcbiAqIHVzaW5nIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCIgd2l0aCBhIHdpbGRjYXJkLFxuICogYW5kIGFsc28gbXVzdCBzZXQgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFsc1wiXG4gKiB0byBcInRydWVcIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLndpdGhDcmVkZW50aWFscyA9IGZ1bmN0aW9uKCl7XG4gIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBJbml0aWF0ZSByZXF1ZXN0LCBpbnZva2luZyBjYWxsYmFjayBgZm4ocmVzKWBcbiAqIHdpdGggYW4gaW5zdGFuY2VvZiBgUmVzcG9uc2VgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oZm4pe1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB4aHIgPSB0aGlzLnhociA9IHJlcXVlc3QuZ2V0WEhSKCk7XG4gIHZhciBxdWVyeSA9IHRoaXMuX3F1ZXJ5LmpvaW4oJyYnKTtcbiAgdmFyIHRpbWVvdXQgPSB0aGlzLl90aW1lb3V0O1xuICB2YXIgZGF0YSA9IHRoaXMuX2Zvcm1EYXRhIHx8IHRoaXMuX2RhdGE7XG5cbiAgLy8gc3RvcmUgY2FsbGJhY2tcbiAgdGhpcy5fY2FsbGJhY2sgPSBmbiB8fCBub29wO1xuXG4gIC8vIHN0YXRlIGNoYW5nZVxuICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKXtcbiAgICBpZiAoNCAhPSB4aHIucmVhZHlTdGF0ZSkgcmV0dXJuO1xuXG4gICAgLy8gSW4gSUU5LCByZWFkcyB0byBhbnkgcHJvcGVydHkgKGUuZy4gc3RhdHVzKSBvZmYgb2YgYW4gYWJvcnRlZCBYSFIgd2lsbFxuICAgIC8vIHJlc3VsdCBpbiB0aGUgZXJyb3IgXCJDb3VsZCBub3QgY29tcGxldGUgdGhlIG9wZXJhdGlvbiBkdWUgdG8gZXJyb3IgYzAwYzAyM2ZcIlxuICAgIHZhciBzdGF0dXM7XG4gICAgdHJ5IHsgc3RhdHVzID0geGhyLnN0YXR1cyB9IGNhdGNoKGUpIHsgc3RhdHVzID0gMDsgfVxuXG4gICAgaWYgKDAgPT0gc3RhdHVzKSB7XG4gICAgICBpZiAoc2VsZi50aW1lZG91dCkgcmV0dXJuIHNlbGYudGltZW91dEVycm9yKCk7XG4gICAgICBpZiAoc2VsZi5hYm9ydGVkKSByZXR1cm47XG4gICAgICByZXR1cm4gc2VsZi5jcm9zc0RvbWFpbkVycm9yKCk7XG4gICAgfVxuICAgIHNlbGYuZW1pdCgnZW5kJyk7XG4gIH07XG5cbiAgLy8gcHJvZ3Jlc3NcbiAgdmFyIGhhbmRsZVByb2dyZXNzID0gZnVuY3Rpb24oZSl7XG4gICAgaWYgKGUudG90YWwgPiAwKSB7XG4gICAgICBlLnBlcmNlbnQgPSBlLmxvYWRlZCAvIGUudG90YWwgKiAxMDA7XG4gICAgfVxuICAgIGUuZGlyZWN0aW9uID0gJ2Rvd25sb2FkJztcbiAgICBzZWxmLmVtaXQoJ3Byb2dyZXNzJywgZSk7XG4gIH07XG4gIGlmICh0aGlzLmhhc0xpc3RlbmVycygncHJvZ3Jlc3MnKSkge1xuICAgIHhoci5vbnByb2dyZXNzID0gaGFuZGxlUHJvZ3Jlc3M7XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAoeGhyLnVwbG9hZCAmJiB0aGlzLmhhc0xpc3RlbmVycygncHJvZ3Jlc3MnKSkge1xuICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gaGFuZGxlUHJvZ3Jlc3M7XG4gICAgfVxuICB9IGNhdGNoKGUpIHtcbiAgICAvLyBBY2Nlc3NpbmcgeGhyLnVwbG9hZCBmYWlscyBpbiBJRSBmcm9tIGEgd2ViIHdvcmtlciwgc28ganVzdCBwcmV0ZW5kIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gUmVwb3J0ZWQgaGVyZTpcbiAgICAvLyBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFjay9kZXRhaWxzLzgzNzI0NS94bWxodHRwcmVxdWVzdC11cGxvYWQtdGhyb3dzLWludmFsaWQtYXJndW1lbnQtd2hlbi11c2VkLWZyb20td2ViLXdvcmtlci1jb250ZXh0XG4gIH1cblxuICAvLyB0aW1lb3V0XG4gIGlmICh0aW1lb3V0ICYmICF0aGlzLl90aW1lcikge1xuICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgc2VsZi50aW1lZG91dCA9IHRydWU7XG4gICAgICBzZWxmLmFib3J0KCk7XG4gICAgfSwgdGltZW91dCk7XG4gIH1cblxuICAvLyBxdWVyeXN0cmluZ1xuICBpZiAocXVlcnkpIHtcbiAgICBxdWVyeSA9IHJlcXVlc3Quc2VyaWFsaXplT2JqZWN0KHF1ZXJ5KTtcbiAgICB0aGlzLnVybCArPSB+dGhpcy51cmwuaW5kZXhPZignPycpXG4gICAgICA/ICcmJyArIHF1ZXJ5XG4gICAgICA6ICc/JyArIHF1ZXJ5O1xuICB9XG5cbiAgLy8gaW5pdGlhdGUgcmVxdWVzdFxuICBpZiAodGhpcy51c2VybmFtZSAmJiB0aGlzLnBhc3N3b3JkKSB7XG4gICAgeGhyLm9wZW4odGhpcy5tZXRob2QsIHRoaXMudXJsLCB0cnVlLCB0aGlzLnVzZXJuYW1lLCB0aGlzLnBhc3N3b3JkKTtcbiAgfSBlbHNlIHtcbiAgICB4aHIub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHRydWUpO1xuICB9XG5cbiAgLy8gQ09SU1xuICBpZiAodGhpcy5fd2l0aENyZWRlbnRpYWxzKSB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcblxuICAvLyBib2R5XG4gIGlmICgnR0VUJyAhPSB0aGlzLm1ldGhvZCAmJiAnSEVBRCcgIT0gdGhpcy5tZXRob2QgJiYgJ3N0cmluZycgIT0gdHlwZW9mIGRhdGEgJiYgIWlzSG9zdChkYXRhKSkge1xuICAgIC8vIHNlcmlhbGl6ZSBzdHVmZlxuICAgIHZhciBjb250ZW50VHlwZSA9IHRoaXMuX2hlYWRlclsnY29udGVudC10eXBlJ107XG4gICAgdmFyIHNlcmlhbGl6ZSA9IHRoaXMuX3BhcnNlciB8fCByZXF1ZXN0LnNlcmlhbGl6ZVtjb250ZW50VHlwZSA/IGNvbnRlbnRUeXBlLnNwbGl0KCc7JylbMF0gOiAnJ107XG4gICAgaWYgKCFzZXJpYWxpemUgJiYgaXNKU09OKGNvbnRlbnRUeXBlKSkgc2VyaWFsaXplID0gcmVxdWVzdC5zZXJpYWxpemVbJ2FwcGxpY2F0aW9uL2pzb24nXTtcbiAgICBpZiAoc2VyaWFsaXplKSBkYXRhID0gc2VyaWFsaXplKGRhdGEpO1xuICB9XG5cbiAgLy8gc2V0IGhlYWRlciBmaWVsZHNcbiAgZm9yICh2YXIgZmllbGQgaW4gdGhpcy5oZWFkZXIpIHtcbiAgICBpZiAobnVsbCA9PSB0aGlzLmhlYWRlcltmaWVsZF0pIGNvbnRpbnVlO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGZpZWxkLCB0aGlzLmhlYWRlcltmaWVsZF0pO1xuICB9XG5cbiAgaWYgKHRoaXMuX3Jlc3BvbnNlVHlwZSkge1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSB0aGlzLl9yZXNwb25zZVR5cGU7XG4gIH1cblxuICAvLyBzZW5kIHN0dWZmXG4gIHRoaXMuZW1pdCgncmVxdWVzdCcsIHRoaXMpO1xuXG4gIC8vIElFMTEgeGhyLnNlbmQodW5kZWZpbmVkKSBzZW5kcyAndW5kZWZpbmVkJyBzdHJpbmcgYXMgUE9TVCBwYXlsb2FkIChpbnN0ZWFkIG9mIG5vdGhpbmcpXG4gIC8vIFdlIG5lZWQgbnVsbCBoZXJlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gIHhoci5zZW5kKHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJyA/IGRhdGEgOiBudWxsKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5cbi8qKlxuICogRXhwb3NlIGBSZXF1ZXN0YC5cbiAqL1xuXG5yZXF1ZXN0LlJlcXVlc3QgPSBSZXF1ZXN0O1xuXG4vKipcbiAqIEdFVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBkYXRhIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5nZXQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ0dFVCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSBmbiA9IGRhdGEsIGRhdGEgPSBudWxsO1xuICBpZiAoZGF0YSkgcmVxLnF1ZXJ5KGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBIRUFEIGB1cmxgIHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IGRhdGEgb3IgZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LmhlYWQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ0hFQUQnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgZm4gPSBkYXRhLCBkYXRhID0gbnVsbDtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBERUxFVEUgYHVybGAgd2l0aCBvcHRpb25hbCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlbCh1cmwsIGZuKXtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ0RFTEVURScsIHVybCk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG5yZXF1ZXN0WydkZWwnXSA9IGRlbDtcbnJlcXVlc3RbJ2RlbGV0ZSddID0gZGVsO1xuXG4vKipcbiAqIFBBVENIIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZH0gZGF0YVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QucGF0Y2ggPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ1BBVENIJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIGZuID0gZGF0YSwgZGF0YSA9IG51bGw7XG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG5cbi8qKlxuICogUE9TVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR9IGRhdGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LnBvc3QgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ1BPU1QnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgZm4gPSBkYXRhLCBkYXRhID0gbnVsbDtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBQVVQgYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBkYXRhIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5wdXQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ1BVVCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSBmbiA9IGRhdGEsIGRhdGEgPSBudWxsO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuIiwiLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzT2JqZWN0KG9iaikge1xuICByZXR1cm4gbnVsbCAhPSBvYmogJiYgJ29iamVjdCcgPT0gdHlwZW9mIG9iajtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsIi8qKlxuICogTW9kdWxlIG9mIG1peGVkLWluIGZ1bmN0aW9ucyBzaGFyZWQgYmV0d2VlbiBub2RlIGFuZCBjbGllbnQgY29kZVxuICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzLW9iamVjdCcpO1xuXG4vKipcbiAqIENsZWFyIHByZXZpb3VzIHRpbWVvdXQuXG4gKlxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gX2NsZWFyVGltZW91dCgpe1xuICB0aGlzLl90aW1lb3V0ID0gMDtcbiAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEZvcmNlIGdpdmVuIHBhcnNlclxuICpcbiAqIFNldHMgdGhlIGJvZHkgcGFyc2VyIG5vIG1hdHRlciB0eXBlLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMucGFyc2UgPSBmdW5jdGlvbiBwYXJzZShmbil7XG4gIHRoaXMuX3BhcnNlciA9IGZuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRpbWVvdXQgdG8gYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLnRpbWVvdXQgPSBmdW5jdGlvbiB0aW1lb3V0KG1zKXtcbiAgdGhpcy5fdGltZW91dCA9IG1zO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRmF1eCBwcm9taXNlIHN1cHBvcnRcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3RcbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKi9cblxuZXhwb3J0cy50aGVuID0gZnVuY3Rpb24gdGhlbihmdWxmaWxsLCByZWplY3QpIHtcbiAgcmV0dXJuIHRoaXMuZW5kKGZ1bmN0aW9uKGVyciwgcmVzKSB7XG4gICAgZXJyID8gcmVqZWN0KGVycikgOiBmdWxmaWxsKHJlcyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEFsbG93IGZvciBleHRlbnNpb25cbiAqL1xuXG5leHBvcnRzLnVzZSA9IGZ1bmN0aW9uIHVzZShmbikge1xuICBmbih0aGlzKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBHZXQgcmVxdWVzdCBoZWFkZXIgYGZpZWxkYC5cbiAqIENhc2UtaW5zZW5zaXRpdmUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuZ2V0ID0gZnVuY3Rpb24oZmllbGQpe1xuICByZXR1cm4gdGhpcy5faGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldO1xufTtcblxuLyoqXG4gKiBHZXQgY2FzZS1pbnNlbnNpdGl2ZSBoZWFkZXIgYGZpZWxkYCB2YWx1ZS5cbiAqIFRoaXMgaXMgYSBkZXByZWNhdGVkIGludGVybmFsIEFQSS4gVXNlIGAuZ2V0KGZpZWxkKWAgaW5zdGVhZC5cbiAqXG4gKiAoZ2V0SGVhZGVyIGlzIG5vIGxvbmdlciB1c2VkIGludGVybmFsbHkgYnkgdGhlIHN1cGVyYWdlbnQgY29kZSBiYXNlKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5cbmV4cG9ydHMuZ2V0SGVhZGVyID0gZXhwb3J0cy5nZXQ7XG5cbi8qKlxuICogU2V0IGhlYWRlciBgZmllbGRgIHRvIGB2YWxgLCBvciBtdWx0aXBsZSBmaWVsZHMgd2l0aCBvbmUgb2JqZWN0LlxuICogQ2FzZS1pbnNlbnNpdGl2ZS5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHJlcS5nZXQoJy8nKVxuICogICAgICAgIC5zZXQoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJylcbiAqICAgICAgICAuc2V0KCdYLUFQSS1LZXknLCAnZm9vYmFyJylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcS5nZXQoJy8nKVxuICogICAgICAgIC5zZXQoeyBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJywgJ1gtQVBJLUtleSc6ICdmb29iYXInIH0pXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBmaWVsZFxuICogQHBhcmFtIHtTdHJpbmd9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuc2V0ID0gZnVuY3Rpb24oZmllbGQsIHZhbCl7XG4gIGlmIChpc09iamVjdChmaWVsZCkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZmllbGQpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgZmllbGRba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXSA9IHZhbDtcbiAgdGhpcy5oZWFkZXJbZmllbGRdID0gdmFsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGhlYWRlciBgZmllbGRgLlxuICogQ2FzZS1pbnNlbnNpdGl2ZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnVuc2V0KCdVc2VyLUFnZW50JylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqL1xuZXhwb3J0cy51bnNldCA9IGZ1bmN0aW9uKGZpZWxkKXtcbiAgZGVsZXRlIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXTtcbiAgZGVsZXRlIHRoaXMuaGVhZGVyW2ZpZWxkXTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFdyaXRlIHRoZSBmaWVsZCBgbmFtZWAgYW5kIGB2YWxgIGZvciBcIm11bHRpcGFydC9mb3JtLWRhdGFcIlxuICogcmVxdWVzdCBib2RpZXMuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICAuZmllbGQoJ2ZvbycsICdiYXInKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ3xCbG9ifEZpbGV8QnVmZmVyfGZzLlJlYWRTdHJlYW19IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmZpZWxkID0gZnVuY3Rpb24obmFtZSwgdmFsKSB7XG4gIHRoaXMuX2dldEZvcm1EYXRhKCkuYXBwZW5kKG5hbWUsIHZhbCk7XG4gIHJldHVybiB0aGlzO1xufTtcbiIsIi8vIFRoZSBub2RlIGFuZCBicm93c2VyIG1vZHVsZXMgZXhwb3NlIHZlcnNpb25zIG9mIHRoaXMgd2l0aCB0aGVcbi8vIGFwcHJvcHJpYXRlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGJvdW5kIGFzIGZpcnN0IGFyZ3VtZW50XG4vKipcbiAqIElzc3VlIGEgcmVxdWVzdDpcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICByZXF1ZXN0KCdHRVQnLCAnL3VzZXJzJykuZW5kKGNhbGxiYWNrKVxuICogICAgcmVxdWVzdCgnL3VzZXJzJykuZW5kKGNhbGxiYWNrKVxuICogICAgcmVxdWVzdCgnL3VzZXJzJywgY2FsbGJhY2spXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IHVybCBvciBjYWxsYmFja1xuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcmVxdWVzdChSZXF1ZXN0Q29uc3RydWN0b3IsIG1ldGhvZCwgdXJsKSB7XG4gIC8vIGNhbGxiYWNrXG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiB1cmwpIHtcbiAgICByZXR1cm4gbmV3IFJlcXVlc3RDb25zdHJ1Y3RvcignR0VUJywgbWV0aG9kKS5lbmQodXJsKTtcbiAgfVxuXG4gIC8vIHVybCBmaXJzdFxuICBpZiAoMiA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0Q29uc3RydWN0b3IoJ0dFVCcsIG1ldGhvZCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlcXVlc3RDb25zdHJ1Y3RvcihtZXRob2QsIHVybCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWVzdDtcbiIsIi8qISBodHRwczovL210aHMuYmUvcHVueWNvZGUgdjEuMy4yIGJ5IEBtYXRoaWFzLCBtb2RpZmllZCBmb3IgVVJJLmpzICovXHJcblxyXG52YXIgcHVueWNvZGUgPSAoZnVuY3Rpb24gKCkge1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYHB1bnljb2RlYCBvYmplY3QuXHJcblx0ICogQG5hbWUgcHVueWNvZGVcclxuXHQgKiBAdHlwZSBPYmplY3RcclxuXHQgKi9cclxuXHR2YXIgcHVueWNvZGUsXHJcblxyXG5cdC8qKiBIaWdoZXN0IHBvc2l0aXZlIHNpZ25lZCAzMi1iaXQgZmxvYXQgdmFsdWUgKi9cclxuXHRtYXhJbnQgPSAyMTQ3NDgzNjQ3LCAvLyBha2EuIDB4N0ZGRkZGRkYgb3IgMl4zMS0xXHJcblxyXG5cdC8qKiBCb290c3RyaW5nIHBhcmFtZXRlcnMgKi9cclxuXHRiYXNlID0gMzYsXHJcblx0dE1pbiA9IDEsXHJcblx0dE1heCA9IDI2LFxyXG5cdHNrZXcgPSAzOCxcclxuXHRkYW1wID0gNzAwLFxyXG5cdGluaXRpYWxCaWFzID0gNzIsXHJcblx0aW5pdGlhbE4gPSAxMjgsIC8vIDB4ODBcclxuXHRkZWxpbWl0ZXIgPSAnLScsIC8vICdcXHgyRCdcclxuXHJcblx0LyoqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgKi9cclxuXHRyZWdleFB1bnljb2RlID0gL154bi0tLyxcclxuXHRyZWdleE5vbkFTQ0lJID0gL1teXFx4MjAtXFx4N0VdLywgLy8gdW5wcmludGFibGUgQVNDSUkgY2hhcnMgKyBub24tQVNDSUkgY2hhcnNcclxuXHRyZWdleFNlcGFyYXRvcnMgPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nLCAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXHJcblxyXG5cdC8qKiBFcnJvciBtZXNzYWdlcyAqL1xyXG5cdGVycm9ycyA9IHtcclxuXHRcdCdvdmVyZmxvdyc6ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2VzcycsXHJcblx0XHQnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxyXG5cdFx0J2ludmFsaWQtaW5wdXQnOiAnSW52YWxpZCBpbnB1dCdcclxuXHR9LFxyXG5cclxuXHQvKiogQ29udmVuaWVuY2Ugc2hvcnRjdXRzICovXHJcblx0YmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluLFxyXG5cdGZsb29yID0gTWF0aC5mbG9vcixcclxuXHRzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLFxyXG5cclxuXHQvKiogVGVtcG9yYXJ5IHZhcmlhYmxlICovXHJcblx0a2V5O1xyXG5cclxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcblx0LyoqXHJcblx0ICogQSBnZW5lcmljIGVycm9yIHV0aWxpdHkgZnVuY3Rpb24uXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXJyb3IgdHlwZS5cclxuXHQgKiBAcmV0dXJucyB7RXJyb3J9IFRocm93cyBhIGBSYW5nZUVycm9yYCB3aXRoIHRoZSBhcHBsaWNhYmxlIGVycm9yIG1lc3NhZ2UuXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gZXJyb3IodHlwZSkge1xyXG5cdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgZ2VuZXJpYyBgQXJyYXkjbWFwYCB1dGlsaXR5IGZ1bmN0aW9uLlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnkgYXJyYXlcclxuXHQgKiBpdGVtLlxyXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiBtYXAoYXJyYXksIGZuKSB7XHJcblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xyXG5cdFx0dmFyIHJlc3VsdCA9IFtdO1xyXG5cdFx0d2hpbGUgKGxlbmd0aC0tKSB7XHJcblx0XHRcdHJlc3VsdFtsZW5ndGhdID0gZm4oYXJyYXlbbGVuZ3RoXSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXHJcblx0ICogYWRkcmVzc2VzLlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnlcclxuXHQgKiBjaGFyYWN0ZXIuXHJcblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcclxuXHQgKiBmdW5jdGlvbi5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiBtYXBEb21haW4oc3RyaW5nLCBmbikge1xyXG5cdFx0dmFyIHBhcnRzID0gc3RyaW5nLnNwbGl0KCdAJyk7XHJcblx0XHR2YXIgcmVzdWx0ID0gJyc7XHJcblx0XHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xyXG5cdFx0XHQvLyBJbiBlbWFpbCBhZGRyZXNzZXMsIG9ubHkgdGhlIGRvbWFpbiBuYW1lIHNob3VsZCBiZSBwdW55Y29kZWQuIExlYXZlXHJcblx0XHRcdC8vIHRoZSBsb2NhbCBwYXJ0IChpLmUuIGV2ZXJ5dGhpbmcgdXAgdG8gYEBgKSBpbnRhY3QuXHJcblx0XHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xyXG5cdFx0XHRzdHJpbmcgPSBwYXJ0c1sxXTtcclxuXHRcdH1cclxuXHRcdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cclxuXHRcdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4U2VwYXJhdG9ycywgJ1xceDJFJyk7XHJcblx0XHR2YXIgbGFiZWxzID0gc3RyaW5nLnNwbGl0KCcuJyk7XHJcblx0XHR2YXIgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGZuKS5qb2luKCcuJyk7XHJcblx0XHRyZXR1cm4gcmVzdWx0ICsgZW5jb2RlZDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBjb2RlIHBvaW50cyBvZiBlYWNoIFVuaWNvZGVcclxuXHQgKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXHJcblx0ICogdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgYSBwYWlyIG9mIHN1cnJvZ2F0ZSBoYWx2ZXMgKGVhY2ggb2Ygd2hpY2hcclxuXHQgKiBVQ1MtMiBleHBvc2VzIGFzIHNlcGFyYXRlIGNoYXJhY3RlcnMpIGludG8gYSBzaW5nbGUgY29kZSBwb2ludCxcclxuXHQgKiBtYXRjaGluZyBVVEYtMTYuXHJcblx0ICogQHNlZSBgcHVueWNvZGUudWNzMi5lbmNvZGVgXHJcblx0ICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XHJcblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcclxuXHQgKiBAbmFtZSBkZWNvZGVcclxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIFRoZSBVbmljb2RlIGlucHV0IHN0cmluZyAoVUNTLTIpLlxyXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZykge1xyXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxyXG5cdFx0ICAgIGNvdW50ZXIgPSAwLFxyXG5cdFx0ICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGgsXHJcblx0XHQgICAgdmFsdWUsXHJcblx0XHQgICAgZXh0cmE7XHJcblx0XHR3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xyXG5cdFx0XHR2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XHJcblx0XHRcdGlmICh2YWx1ZSA+PSAweEQ4MDAgJiYgdmFsdWUgPD0gMHhEQkZGICYmIGNvdW50ZXIgPCBsZW5ndGgpIHtcclxuXHRcdFx0XHQvLyBoaWdoIHN1cnJvZ2F0ZSwgYW5kIHRoZXJlIGlzIGEgbmV4dCBjaGFyYWN0ZXJcclxuXHRcdFx0XHRleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XHJcblx0XHRcdFx0aWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7IC8vIGxvdyBzdXJyb2dhdGVcclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZSBuZXh0XHJcblx0XHRcdFx0XHQvLyBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXJcclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcclxuXHRcdFx0XHRcdGNvdW50ZXItLTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gb3V0cHV0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIHN0cmluZyBiYXNlZCBvbiBhbiBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxyXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZGVjb2RlYFxyXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXHJcblx0ICogQG5hbWUgZW5jb2RlXHJcblx0ICogQHBhcmFtIHtBcnJheX0gY29kZVBvaW50cyBUaGUgYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cclxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgbmV3IFVuaWNvZGUgc3RyaW5nIChVQ1MtMikuXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkge1xyXG5cdFx0cmV0dXJuIG1hcChhcnJheSwgZnVuY3Rpb24odmFsdWUpIHtcclxuXHRcdFx0dmFyIG91dHB1dCA9ICcnO1xyXG5cdFx0XHRpZiAodmFsdWUgPiAweEZGRkYpIHtcclxuXHRcdFx0XHR2YWx1ZSAtPSAweDEwMDAwO1xyXG5cdFx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xyXG5cdFx0XHRcdHZhbHVlID0gMHhEQzAwIHwgdmFsdWUgJiAweDNGRjtcclxuXHRcdFx0fVxyXG5cdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlKTtcclxuXHRcdFx0cmV0dXJuIG91dHB1dDtcclxuXHRcdH0pLmpvaW4oJycpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgYSBiYXNpYyBjb2RlIHBvaW50IGludG8gYSBkaWdpdC9pbnRlZ2VyLlxyXG5cdCAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGNvZGVQb2ludCBUaGUgYmFzaWMgbnVtZXJpYyBjb2RlIHBvaW50IHZhbHVlLlxyXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxyXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaW4gdGhlIHJhbmdlIGAwYCB0byBgYmFzZSAtIDFgLCBvciBgYmFzZWAgaWZcclxuXHQgKiB0aGUgY29kZSBwb2ludCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWx1ZS5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiBiYXNpY1RvRGlnaXQoY29kZVBvaW50KSB7XHJcblx0XHRpZiAoY29kZVBvaW50IC0gNDggPCAxMCkge1xyXG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gMjI7XHJcblx0XHR9XHJcblx0XHRpZiAoY29kZVBvaW50IC0gNjUgPCAyNikge1xyXG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gNjU7XHJcblx0XHR9XHJcblx0XHRpZiAoY29kZVBvaW50IC0gOTcgPCAyNikge1xyXG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gOTc7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gYmFzZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cclxuXHQgKiBAc2VlIGBiYXNpY1RvRGlnaXQoKWBcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXHJcblx0ICogQHJldHVybnMge051bWJlcn0gVGhlIGJhc2ljIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgKHdoZW4gdXNlZCBmb3JcclxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGlzIGBkaWdpdGAsIHdoaWNoIG5lZWRzIHRvIGJlIGluIHRoZSByYW5nZVxyXG5cdCAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xyXG5cdCAqIHVzZWQ7IGVsc2UsIHRoZSBsb3dlcmNhc2UgZm9ybSBpcyB1c2VkLiBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkXHJcblx0ICogaWYgYGZsYWdgIGlzIG5vbi16ZXJvIGFuZCBgZGlnaXRgIGhhcyBubyB1cHBlcmNhc2UgZm9ybS5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiBkaWdpdFRvQmFzaWMoZGlnaXQsIGZsYWcpIHtcclxuXHRcdC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXHJcblx0XHQvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcclxuXHRcdHJldHVybiBkaWdpdCArIDIyICsgNzUgKiAoZGlnaXQgPCAyNikgLSAoKGZsYWcgIT0gMCkgPDwgNSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLlxyXG5cdCAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XHJcblx0ICogQHByaXZhdGVcclxuXHQgKi9cclxuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcclxuXHRcdHZhciBrID0gMDtcclxuXHRcdGRlbHRhID0gZmlyc3RUaW1lID8gZmxvb3IoZGVsdGEgLyBkYW1wKSA6IGRlbHRhID4+IDE7XHJcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XHJcblx0XHRmb3IgKC8qIG5vIGluaXRpYWxpemF0aW9uICovOyBkZWx0YSA+IGJhc2VNaW51c1RNaW4gKiB0TWF4ID4+IDE7IGsgKz0gYmFzZSkge1xyXG5cdFx0XHRkZWx0YSA9IGZsb29yKGRlbHRhIC8gYmFzZU1pbnVzVE1pbik7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scyB0byBhIHN0cmluZyBvZiBVbmljb2RlXHJcblx0ICogc3ltYm9scy5cclxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcclxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXHJcblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIGRlY29kZShpbnB1dCkge1xyXG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXHJcblx0XHR2YXIgb3V0cHV0ID0gW10sXHJcblx0XHQgICAgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgsXHJcblx0XHQgICAgb3V0LFxyXG5cdFx0ICAgIGkgPSAwLFxyXG5cdFx0ICAgIG4gPSBpbml0aWFsTixcclxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXHJcblx0XHQgICAgYmFzaWMsXHJcblx0XHQgICAgaixcclxuXHRcdCAgICBpbmRleCxcclxuXHRcdCAgICBvbGRpLFxyXG5cdFx0ICAgIHcsXHJcblx0XHQgICAgayxcclxuXHRcdCAgICBkaWdpdCxcclxuXHRcdCAgICB0LFxyXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xyXG5cdFx0ICAgIGJhc2VNaW51c1Q7XHJcblxyXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXHJcblx0XHQvLyBwb2ludHMgYmVmb3JlIHRoZSBsYXN0IGRlbGltaXRlciwgb3IgYDBgIGlmIHRoZXJlIGlzIG5vbmUsIHRoZW4gY29weVxyXG5cdFx0Ly8gdGhlIGZpcnN0IGJhc2ljIGNvZGUgcG9pbnRzIHRvIHRoZSBvdXRwdXQuXHJcblxyXG5cdFx0YmFzaWMgPSBpbnB1dC5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xyXG5cdFx0aWYgKGJhc2ljIDwgMCkge1xyXG5cdFx0XHRiYXNpYyA9IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcclxuXHRcdFx0Ly8gaWYgaXQncyBub3QgYSBiYXNpYyBjb2RlIHBvaW50XHJcblx0XHRcdGlmIChpbnB1dC5jaGFyQ29kZUF0KGopID49IDB4ODApIHtcclxuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0b3V0cHV0LnB1c2goaW5wdXQuY2hhckNvZGVBdChqKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gTWFpbiBkZWNvZGluZyBsb29wOiBzdGFydCBqdXN0IGFmdGVyIHRoZSBsYXN0IGRlbGltaXRlciBpZiBhbnkgYmFzaWMgY29kZVxyXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cclxuXHJcblx0XHRmb3IgKGluZGV4ID0gYmFzaWMgPiAwID8gYmFzaWMgKyAxIDogMDsgaW5kZXggPCBpbnB1dExlbmd0aDsgLyogbm8gZmluYWwgZXhwcmVzc2lvbiAqLykge1xyXG5cclxuXHRcdFx0Ly8gYGluZGV4YCBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIGNvbnN1bWVkLlxyXG5cdFx0XHQvLyBEZWNvZGUgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciBpbnRvIGBkZWx0YWAsXHJcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXHJcblx0XHRcdC8vIGlmIHdlIGluY3JlYXNlIGBpYCBhcyB3ZSBnbywgdGhlbiBzdWJ0cmFjdCBvZmYgaXRzIHN0YXJ0aW5nXHJcblx0XHRcdC8vIHZhbHVlIGF0IHRoZSBlbmQgdG8gb2J0YWluIGBkZWx0YWAuXHJcblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcclxuXHJcblx0XHRcdFx0aWYgKGluZGV4ID49IGlucHV0TGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XHJcblxyXG5cdFx0XHRcdGlmIChkaWdpdCA+PSBiYXNlIHx8IGRpZ2l0ID4gZmxvb3IoKG1heEludCAtIGkpIC8gdykpIHtcclxuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XHJcblx0XHRcdFx0dCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XHJcblxyXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xyXG5cdFx0XHRcdGlmICh3ID4gZmxvb3IobWF4SW50IC8gYmFzZU1pbnVzVCkpIHtcclxuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0b3V0ID0gb3V0cHV0Lmxlbmd0aCArIDE7XHJcblx0XHRcdGJpYXMgPSBhZGFwdChpIC0gb2xkaSwgb3V0LCBvbGRpID09IDApO1xyXG5cclxuXHRcdFx0Ly8gYGlgIHdhcyBzdXBwb3NlZCB0byB3cmFwIGFyb3VuZCBmcm9tIGBvdXRgIHRvIGAwYCxcclxuXHRcdFx0Ly8gaW5jcmVtZW50aW5nIGBuYCBlYWNoIHRpbWUsIHNvIHdlJ2xsIGZpeCB0aGF0IG5vdzpcclxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xyXG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRuICs9IGZsb29yKGkgLyBvdXQpO1xyXG5cdFx0XHRpICU9IG91dDtcclxuXHJcblx0XHRcdC8vIEluc2VydCBgbmAgYXQgcG9zaXRpb24gYGlgIG9mIHRoZSBvdXRwdXRcclxuXHRcdFx0b3V0cHV0LnNwbGljZShpKyssIDAsIG4pO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGFcclxuXHQgKiBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxyXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxyXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scy5cclxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gZW5jb2RlKGlucHV0KSB7XHJcblx0XHR2YXIgbixcclxuXHRcdCAgICBkZWx0YSxcclxuXHRcdCAgICBoYW5kbGVkQ1BDb3VudCxcclxuXHRcdCAgICBiYXNpY0xlbmd0aCxcclxuXHRcdCAgICBiaWFzLFxyXG5cdFx0ICAgIGosXHJcblx0XHQgICAgbSxcclxuXHRcdCAgICBxLFxyXG5cdFx0ICAgIGssXHJcblx0XHQgICAgdCxcclxuXHRcdCAgICBjdXJyZW50VmFsdWUsXHJcblx0XHQgICAgb3V0cHV0ID0gW10sXHJcblx0XHQgICAgLyoqIGBpbnB1dExlbmd0aGAgd2lsbCBob2xkIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgaW4gYGlucHV0YC4gKi9cclxuXHRcdCAgICBpbnB1dExlbmd0aCxcclxuXHRcdCAgICAvKiogQ2FjaGVkIGNhbGN1bGF0aW9uIHJlc3VsdHMgKi9cclxuXHRcdCAgICBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsXHJcblx0XHQgICAgYmFzZU1pbnVzVCxcclxuXHRcdCAgICBxTWludXNUO1xyXG5cclxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcclxuXHRcdGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XHJcblxyXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxyXG5cdFx0aW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGg7XHJcblxyXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcclxuXHRcdG4gPSBpbml0aWFsTjtcclxuXHRcdGRlbHRhID0gMDtcclxuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcclxuXHJcblx0XHQvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzXHJcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xyXG5cdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcclxuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA8IDB4ODApIHtcclxuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDtcclxuXHJcblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcclxuXHRcdC8vIGBiYXNpY0xlbmd0aGAgaXMgdGhlIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cclxuXHJcblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcclxuXHRcdGlmIChiYXNpY0xlbmd0aCkge1xyXG5cdFx0XHRvdXRwdXQucHVzaChkZWxpbWl0ZXIpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE1haW4gZW5jb2RpbmcgbG9vcDpcclxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XHJcblxyXG5cdFx0XHQvLyBBbGwgbm9uLWJhc2ljIGNvZGUgcG9pbnRzIDwgbiBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LiBGaW5kIHRoZSBuZXh0XHJcblx0XHRcdC8vIGxhcmdlciBvbmU6XHJcblx0XHRcdGZvciAobSA9IG1heEludCwgaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XHJcblx0XHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XHJcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcclxuXHRcdFx0XHRcdG0gPSBjdXJyZW50VmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBJbmNyZWFzZSBgZGVsdGFgIGVub3VnaCB0byBhZHZhbmNlIHRoZSBkZWNvZGVyJ3MgPG4saT4gc3RhdGUgdG8gPG0sMD4sXHJcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XHJcblx0XHRcdGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTtcclxuXHRcdFx0aWYgKG0gLSBuID4gZmxvb3IoKG1heEludCAtIGRlbHRhKSAvIGhhbmRsZWRDUENvdW50UGx1c09uZSkpIHtcclxuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcclxuXHRcdFx0biA9IG07XHJcblxyXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xyXG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xyXG5cclxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XHJcblx0XHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPT0gbikge1xyXG5cdFx0XHRcdFx0Ly8gUmVwcmVzZW50IGRlbHRhIGFzIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXJcclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcclxuXHRcdFx0XHRcdFx0dCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XHJcblx0XHRcdFx0XHRcdGlmIChxIDwgdCkge1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHFNaW51c1QgPSBxIC0gdDtcclxuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xyXG5cdFx0XHRcdFx0XHRvdXRwdXQucHVzaChcclxuXHRcdFx0XHRcdFx0XHRzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCwgMCkpXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdHEgPSBmbG9vcihxTWludXNUIC8gYmFzZU1pbnVzVCk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxLCAwKSkpO1xyXG5cdFx0XHRcdFx0YmlhcyA9IGFkYXB0KGRlbHRhLCBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsIGhhbmRsZWRDUENvdW50ID09IGJhc2ljTGVuZ3RoKTtcclxuXHRcdFx0XHRcdGRlbHRhID0gMDtcclxuXHRcdFx0XHRcdCsraGFuZGxlZENQQ291bnQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQrK2RlbHRhO1xyXG5cdFx0XHQrK247XHJcblxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvbWFpbiBuYW1lIG9yIGFuIGVtYWlsIGFkZHJlc3NcclxuXHQgKiB0byBVbmljb2RlLiBPbmx5IHRoZSBQdW55Y29kZWQgcGFydHMgb2YgdGhlIGlucHV0IHdpbGwgYmUgY29udmVydGVkLCBpLmUuXHJcblx0ICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXHJcblx0ICogY29udmVydGVkIHRvIFVuaWNvZGUuXHJcblx0ICogQG1lbWJlck9mIHB1bnljb2RlXHJcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xyXG5cdCAqIGNvbnZlcnQgdG8gVW5pY29kZS5cclxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgVW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gUHVueWNvZGVcclxuXHQgKiBzdHJpbmcuXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gdG9Vbmljb2RlKGlucHV0KSB7XHJcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcclxuXHRcdFx0cmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpXHJcblx0XHRcdFx0PyBkZWNvZGUoc3RyaW5nLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpXHJcblx0XHRcdFx0OiBzdHJpbmc7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIGEgVW5pY29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzcyB0b1xyXG5cdCAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxyXG5cdCAqIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0J3MgYWxyZWFkeSBpblxyXG5cdCAqIEFTQ0lJLlxyXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxyXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0LCBhcyBhXHJcblx0ICogVW5pY29kZSBzdHJpbmcuXHJcblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxyXG5cdCAqIGVtYWlsIGFkZHJlc3MuXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xyXG5cdFx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XHJcblx0XHRcdHJldHVybiByZWdleE5vbkFTQ0lJLnRlc3Qoc3RyaW5nKVxyXG5cdFx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcclxuXHRcdFx0XHQ6IHN0cmluZztcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcblxyXG5cdC8qKiBEZWZpbmUgdGhlIHB1YmxpYyBBUEkgKi9cclxuXHRwdW55Y29kZSA9IHtcclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IFB1bnljb2RlLmpzIHZlcnNpb24gbnVtYmVyLlxyXG5cdFx0ICogQG1lbWJlck9mIHB1bnljb2RlXHJcblx0XHQgKiBAdHlwZSBTdHJpbmdcclxuXHRcdCAqL1xyXG5cdFx0dmVyc2lvbjogJzEuMy4yJyxcclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcclxuXHRcdCAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXHJcblx0XHQgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cclxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxyXG5cdFx0ICogQHR5cGUgT2JqZWN0XHJcblx0XHQgKi9cclxuXHRcdHVjczI6IHtcclxuXHRcdFx0ZGVjb2RlOiB1Y3MyZGVjb2RlLFxyXG5cdFx0XHRlbmNvZGU6IHVjczJlbmNvZGVcclxuXHRcdH0sXHJcblx0XHRkZWNvZGU6IGRlY29kZSxcclxuXHRcdGVuY29kZTogZW5jb2RlLFxyXG5cdFx0dG9BU0NJSTogdG9BU0NJSSxcclxuXHRcdHRvVW5pY29kZTogdG9Vbmljb2RlXHJcblx0fTtcclxuXHJcblx0cmV0dXJuIHB1bnljb2RlO1xyXG59KCkpO1xyXG5cclxuaWYgKHR5cGVvZiBDT01QSUxFRCA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiKSBtb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlOyIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cImNvbW1vbmpzLmQudHNcIi8+XHJcbnJlcXVpcmUoXCIuL3NjaGVtZXMvaHR0cFwiKTtcclxucmVxdWlyZShcIi4vc2NoZW1lcy91cm5cIik7XHJcbnJlcXVpcmUoXCIuL3NjaGVtZXMvbWFpbHRvXCIpO1xyXG4iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCIuLi91cmkudHNcIi8+XHJcbmlmICh0eXBlb2YgQ09NUElMRUQgPT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIFVSSSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgdmFyIFVSSSA9IHJlcXVpcmUoXCIuLi91cmlcIik7XHJcblVSSS5TQ0hFTUVTW1wiaHR0cFwiXSA9IFVSSS5TQ0hFTUVTW1wiaHR0cHNcIl0gPSB7XHJcbiAgICBkb21haW5Ib3N0OiB0cnVlLFxyXG4gICAgcGFyc2U6IGZ1bmN0aW9uIChjb21wb25lbnRzLCBvcHRpb25zKSB7XHJcbiAgICAgICAgLy9yZXBvcnQgbWlzc2luZyBob3N0XHJcbiAgICAgICAgaWYgKCFjb21wb25lbnRzLmhvc3QpIHtcclxuICAgICAgICAgICAgY29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJIVFRQIFVSSXMgbXVzdCBoYXZlIGEgaG9zdC5cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XHJcbiAgICB9LFxyXG4gICAgc2VyaWFsaXplOiBmdW5jdGlvbiAoY29tcG9uZW50cywgb3B0aW9ucykge1xyXG4gICAgICAgIC8vbm9ybWFsaXplIHRoZSBkZWZhdWx0IHBvcnRcclxuICAgICAgICBpZiAoY29tcG9uZW50cy5wb3J0ID09PSAoU3RyaW5nKGNvbXBvbmVudHMuc2NoZW1lKS50b0xvd2VyQ2FzZSgpICE9PSBcImh0dHBzXCIgPyA4MCA6IDQ0MykgfHwgY29tcG9uZW50cy5wb3J0ID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudHMucG9ydCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9ub3JtYWxpemUgdGhlIGVtcHR5IHBhdGhcclxuICAgICAgICBpZiAoIWNvbXBvbmVudHMucGF0aCkge1xyXG4gICAgICAgICAgICBjb21wb25lbnRzLnBhdGggPSBcIi9cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9OT1RFOiBXZSBkbyBub3QgcGFyc2UgcXVlcnkgc3RyaW5ncyBmb3IgSFRUUCBVUklzXHJcbiAgICAgICAgLy9hcyBXV1cgRm9ybSBVcmwgRW5jb2RlZCBxdWVyeSBzdHJpbmdzIGFyZSBwYXJ0IG9mIHRoZSBIVE1MNCsgc3BlYyxcclxuICAgICAgICAvL2FuZCBub3QgdGhlIEhUVFAgc3BlYy4gXHJcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XHJcbiAgICB9XHJcbn07XHJcbiIsIi8vLzxyZWZlcmVuY2UgcGF0aD1cIi4uL3VyaS50c1wiLz5cclxuaWYgKHR5cGVvZiBDT01QSUxFRCA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgVVJJID09PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiByZXF1aXJlID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgIHZhciBVUkkgPSByZXF1aXJlKFwiLi4vdXJpXCIpLCBwdW55Y29kZSA9IHJlcXVpcmUoXCIuLi9wdW55Y29kZVwiKTtcclxufVxyXG4oZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gbWVyZ2UoKSB7XHJcbiAgICAgICAgdmFyIHNldHMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBzZXRzW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2V0cy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHNldHNbMF0gPSBzZXRzWzBdLnNsaWNlKDAsIC0xKTtcclxuICAgICAgICAgICAgdmFyIHhsID0gc2V0cy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICBmb3IgKHZhciB4ID0gMTsgeCA8IHhsOyArK3gpIHtcclxuICAgICAgICAgICAgICAgIHNldHNbeF0gPSBzZXRzW3hdLnNsaWNlKDEsIC0xKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRzW3hsXSA9IHNldHNbeGxdLnNsaWNlKDEpO1xyXG4gICAgICAgICAgICByZXR1cm4gc2V0cy5qb2luKCcnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRzWzBdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHN1YmV4cChzdHIpIHtcclxuICAgICAgICByZXR1cm4gXCIoPzpcIiArIHN0ciArIFwiKVwiO1xyXG4gICAgfVxyXG4gICAgdmFyIE8gPSB7fSwgaXNJUkkgPSBVUkkuSVJJX1NVUFBPUlQsIFxyXG4gICAgLy9SRkMgMzk4NlxyXG4gICAgVU5SRVNFUlZFRCQkID0gXCJbQS1aYS16MC05XFxcXC1cXFxcLlxcXFxfXFxcXH5cIiArIChpc0lSSSA/IFwiXFxcXHhBMC1cXFxcdTIwMERcXFxcdTIwMTAtXFxcXHUyMDI5XFxcXHUyMDJGLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkVGXCIgOiBcIlwiKSArIFwiXVwiLCBIRVhESUckJCA9IFwiWzAtOUEtRmEtZl1cIiwgUENUX0VOQ09ERUQkID0gc3ViZXhwKHN1YmV4cChcIiVbRUZlZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVs4OUEtRmEtZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVwiICsgSEVYRElHJCQgKyBIRVhESUckJCkpLCBcclxuICAgIC8vUkZDIDUzMjIsIGV4Y2VwdCB0aGVzZSBzeW1ib2xzIGFzIHBlciBSRkMgNjA2ODogQCA6IC8gPyAjIFsgXSAmIDsgPSBcclxuICAgIC8vQVRFWFQkJCA9IFwiW0EtWmEtejAtOVxcXFwhXFxcXCNcXFxcJFxcXFwlXFxcXCZcXFxcJ1xcXFwqXFxcXCtcXFxcLVxcXFwvXFxcXD1cXFxcP1xcXFxeXFxcXF9cXFxcYFxcXFx7XFxcXHxcXFxcfVxcXFx+XVwiLFxyXG4gICAgLy9XU1AkJCA9IFwiW1xcXFx4MjBcXFxceDA5XVwiLFxyXG4gICAgLy9PQlNfUVRFWFQkJCA9IFwiW1xcXFx4MDEtXFxcXHgwOFxcXFx4MEJcXFxceDBDXFxcXHgwRS1cXFxceDFGXFxcXHg3Rl1cIiwgIC8vKCVkMS04IC8gJWQxMS0xMiAvICVkMTQtMzEgLyAlZDEyNylcclxuICAgIC8vUVRFWFQkJCA9IG1lcmdlKFwiW1xcXFx4MjFcXFxceDIzLVxcXFx4NUJcXFxceDVELVxcXFx4N0VdXCIsIE9CU19RVEVYVCQkKSwgIC8vJWQzMyAvICVkMzUtOTEgLyAlZDkzLTEyNiAvIG9icy1xdGV4dFxyXG4gICAgLy9WQ0hBUiQkID0gXCJbXFxcXHgyMS1cXFxceDdFXVwiLFxyXG4gICAgLy9XU1AkJCA9IFwiW1xcXFx4MjBcXFxceDA5XVwiLFxyXG4gICAgLy9PQlNfUVAkID0gc3ViZXhwKFwiXFxcXFxcXFxcIiArIG1lcmdlKFwiW1xcXFx4MDBcXFxceDBEXFxcXHgwQV1cIiwgT0JTX1FURVhUJCQpKSwgIC8vJWQwIC8gQ1IgLyBMRiAvIG9icy1xdGV4dFxyXG4gICAgLy9GV1MkID0gc3ViZXhwKHN1YmV4cChXU1AkJCArIFwiKlwiICsgXCJcXFxceDBEXFxcXHgwQVwiKSArIFwiP1wiICsgV1NQJCQgKyBcIitcIiksXHJcbiAgICAvL1FVT1RFRF9QQUlSJCA9IHN1YmV4cChzdWJleHAoXCJcXFxcXFxcXFwiICsgc3ViZXhwKFZDSEFSJCQgKyBcInxcIiArIFdTUCQkKSkgKyBcInxcIiArIE9CU19RUCQpLFxyXG4gICAgLy9RVU9URURfU1RSSU5HJCA9IHN1YmV4cCgnXFxcXFwiJyArIHN1YmV4cChGV1MkICsgXCI/XCIgKyBRQ09OVEVOVCQpICsgXCIqXCIgKyBGV1MkICsgXCI/XCIgKyAnXFxcXFwiJyksXHJcbiAgICBBVEVYVCQkID0gXCJbQS1aYS16MC05XFxcXCFcXFxcJFxcXFwlXFxcXCdcXFxcKlxcXFwrXFxcXC1cXFxcXlxcXFxfXFxcXGBcXFxce1xcXFx8XFxcXH1cXFxcfl1cIiwgUVRFWFQkJCA9IFwiW1xcXFwhXFxcXCRcXFxcJVxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFwtXFxcXC4wLTlcXFxcPFxcXFw+QS1aXFxcXHg1RS1cXFxceDdFXVwiLCBWQ0hBUiQkID0gbWVyZ2UoUVRFWFQkJCwgXCJbXFxcXFxcXCJcXFxcXFxcXF1cIiksIERPVF9BVE9NX1RFWFQkID0gc3ViZXhwKEFURVhUJCQgKyBcIitcIiArIHN1YmV4cChcIlxcXFwuXCIgKyBBVEVYVCQkICsgXCIrXCIpICsgXCIqXCIpLCBRVU9URURfUEFJUiQgPSBzdWJleHAoXCJcXFxcXFxcXFwiICsgVkNIQVIkJCksIFFDT05URU5UJCA9IHN1YmV4cChRVEVYVCQkICsgXCJ8XCIgKyBRVU9URURfUEFJUiQpLCBRVU9URURfU1RSSU5HJCA9IHN1YmV4cCgnXFxcXFwiJyArIFFDT05URU5UJCArIFwiKlwiICsgJ1xcXFxcIicpLCBcclxuICAgIC8vUkZDIDYwNjhcclxuICAgIERURVhUX05PX09CUyQkID0gXCJbXFxcXHgyMS1cXFxceDVBXFxcXHg1RS1cXFxceDdFXVwiLCBTT01FX0RFTElNUyQkID0gXCJbXFxcXCFcXFxcJFxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFw7XFxcXDpcXFxcQF1cIiwgUUNIQVIkID0gc3ViZXhwKFVOUkVTRVJWRUQkJCArIFwifFwiICsgUENUX0VOQ09ERUQkICsgXCJ8XCIgKyBTT01FX0RFTElNUyQkKSwgRE9NQUlOJCA9IHN1YmV4cChET1RfQVRPTV9URVhUJCArIFwifFwiICsgXCJcXFxcW1wiICsgRFRFWFRfTk9fT0JTJCQgKyBcIipcIiArIFwiXFxcXF1cIiksIExPQ0FMX1BBUlQkID0gc3ViZXhwKERPVF9BVE9NX1RFWFQkICsgXCJ8XCIgKyBRVU9URURfU1RSSU5HJCksIEFERFJfU1BFQyQgPSBzdWJleHAoTE9DQUxfUEFSVCQgKyBcIlxcXFxAXCIgKyBET01BSU4kKSwgVE8kID0gc3ViZXhwKEFERFJfU1BFQyQgKyBzdWJleHAoXCJcXFxcLFwiICsgQUREUl9TUEVDJCkgKyBcIipcIiksIEhGTkFNRSQgPSBzdWJleHAoUUNIQVIkICsgXCIqXCIpLCBIRlZBTFVFJCA9IEhGTkFNRSQsIEhGSUVMRCQgPSBzdWJleHAoSEZOQU1FJCArIFwiXFxcXD1cIiArIEhGVkFMVUUkKSwgSEZJRUxEUzIkID0gc3ViZXhwKEhGSUVMRCQgKyBzdWJleHAoXCJcXFxcJlwiICsgSEZJRUxEJCkgKyBcIipcIiksIEhGSUVMRFMkID0gc3ViZXhwKFwiXFxcXD9cIiArIEhGSUVMRFMyJCksIE1BSUxUT19VUkkgPSBVUkkuVkFMSURBVEVfU1VQUE9SVCAmJiBuZXcgUmVnRXhwKFwiXm1haWx0b1xcXFw6XCIgKyBUTyQgKyBcIj9cIiArIEhGSUVMRFMkICsgXCI/JFwiKSwgVU5SRVNFUlZFRCA9IG5ldyBSZWdFeHAoVU5SRVNFUlZFRCQkLCBcImdcIiksIFBDVF9FTkNPREVEID0gbmV3IFJlZ0V4cChQQ1RfRU5DT0RFRCQsIFwiZ1wiKSwgTk9UX0xPQ0FMX1BBUlQgPSBuZXcgUmVnRXhwKG1lcmdlKFwiW15dXCIsIEFURVhUJCQsIFwiW1xcXFwuXVwiLCAnW1xcXFxcIl0nLCBWQ0hBUiQkKSwgXCJnXCIpLCBOT1RfRE9NQUlOID0gbmV3IFJlZ0V4cChtZXJnZShcIlteXVwiLCBBVEVYVCQkLCBcIltcXFxcLl1cIiwgXCJbXFxcXFtdXCIsIERURVhUX05PX09CUyQkLCBcIltcXFxcXV1cIiksIFwiZ1wiKSwgTk9UX0hGTkFNRSA9IG5ldyBSZWdFeHAobWVyZ2UoXCJbXl1cIiwgVU5SRVNFUlZFRCQkLCBTT01FX0RFTElNUyQkKSwgXCJnXCIpLCBOT1RfSEZWQUxVRSA9IE5PVF9IRk5BTUUsIFRPID0gVVJJLlZBTElEQVRFX1NVUFBPUlQgJiYgbmV3IFJlZ0V4cChcIl5cIiArIFRPJCArIFwiJFwiKSwgSEZJRUxEUyA9IFVSSS5WQUxJREFURV9TVVBQT1JUICYmIG5ldyBSZWdFeHAoXCJeXCIgKyBIRklFTERTMiQgKyBcIiRcIik7XHJcbiAgICBmdW5jdGlvbiB0b1VwcGVyQ2FzZShzdHIpIHtcclxuICAgICAgICByZXR1cm4gc3RyLnRvVXBwZXJDYXNlKCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBkZWNvZGVVbnJlc2VydmVkKHN0cikge1xyXG4gICAgICAgIHZhciBkZWNTdHIgPSBVUkkucGN0RGVjQ2hhcnMoc3RyKTtcclxuICAgICAgICByZXR1cm4gKCFkZWNTdHIubWF0Y2goVU5SRVNFUlZFRCkgPyBzdHIgOiBkZWNTdHIpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdG9BcnJheShvYmopIHtcclxuICAgICAgICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gKG9iaiBpbnN0YW5jZW9mIEFycmF5ICYmICFvYmouY2FsbGVlID8gb2JqIDogKHR5cGVvZiBvYmoubGVuZ3RoICE9PSBcIm51bWJlclwiIHx8IG9iai5zcGxpdCB8fCBvYmouc2V0SW50ZXJ2YWwgfHwgb2JqLmNhbGwgPyBbb2JqXSA6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG9iaikpKSA6IFtdO1xyXG4gICAgfVxyXG4gICAgVVJJLlNDSEVNRVNbXCJtYWlsdG9cIl0gPSB7XHJcbiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChjb21wb25lbnRzLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGlmIChVUkkuVkFMSURBVEVfU1VQUE9SVCAmJiAhY29tcG9uZW50cy5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMucGF0aCAmJiAhVE8udGVzdChjb21wb25lbnRzLnBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5lcnJvciA9IFwiRW1haWwgYWRkcmVzcyBpcyBub3QgdmFsaWRcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBvbmVudHMucXVlcnkgJiYgIUhGSUVMRFMudGVzdChjb21wb25lbnRzLnF1ZXJ5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuZXJyb3IgPSBcIkhlYWRlciBmaWVsZHMgYXJlIGludmFsaWRcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdG8gPSBjb21wb25lbnRzLnRvID0gKGNvbXBvbmVudHMucGF0aCA/IGNvbXBvbmVudHMucGF0aC5zcGxpdChcIixcIikgOiBbXSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudHMucGF0aCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMucXVlcnkpIHtcclxuICAgICAgICAgICAgICAgIHZhciB1bmtub3duSGVhZGVycyA9IGZhbHNlLCBoZWFkZXJzID0ge307XHJcbiAgICAgICAgICAgICAgICB2YXIgaGZpZWxkcyA9IGNvbXBvbmVudHMucXVlcnkuc3BsaXQoXCImXCIpO1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDAsIHhsID0gaGZpZWxkcy5sZW5ndGg7IHggPCB4bDsgKyt4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhmaWVsZCA9IGhmaWVsZHNbeF0uc3BsaXQoXCI9XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaGZpZWxkWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0b1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvQWRkcnMgPSBoZmllbGRbMV0uc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeF8xID0gMCwgeGxfMSA9IHRvQWRkcnMubGVuZ3RoOyB4XzEgPCB4bF8xOyArK3hfMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvLnB1c2godG9BZGRyc1t4XzFdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3ViamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5zdWJqZWN0ID0gVVJJLnVuZXNjYXBlQ29tcG9uZW50KGhmaWVsZFsxXSwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImJvZHlcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYm9keSA9IFVSSS51bmVzY2FwZUNvbXBvbmVudChoZmllbGRbMV0sIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duSGVhZGVycyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzW1VSSS51bmVzY2FwZUNvbXBvbmVudChoZmllbGRbMF0sIG9wdGlvbnMpXSA9IFVSSS51bmVzY2FwZUNvbXBvbmVudChoZmllbGRbMV0sIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHVua25vd25IZWFkZXJzKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuaGVhZGVycyA9IGhlYWRlcnM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29tcG9uZW50cy5xdWVyeSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgZm9yICh2YXIgeCA9IDAsIHhsID0gdG8ubGVuZ3RoOyB4IDwgeGw7ICsreCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFkZHIgPSB0b1t4XS5zcGxpdChcIkBcIik7XHJcbiAgICAgICAgICAgICAgICBhZGRyWzBdID0gVVJJLnVuZXNjYXBlQ29tcG9uZW50KGFkZHJbMF0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwdW55Y29kZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhb3B0aW9ucy51bmljb2RlU3VwcG9ydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29udmVydCBVbmljb2RlIElETiAtPiBBU0NJSSBJRE5cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyWzFdID0gcHVueWNvZGUudG9BU0NJSShVUkkudW5lc2NhcGVDb21wb25lbnQoYWRkclsxXSwgb3B0aW9ucykudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuZXJyb3IgPSBjb21wb25lbnRzLmVycm9yIHx8IFwiRW1haWwgYWRkcmVzcydzIGRvbWFpbiBuYW1lIGNhbiBub3QgYmUgY29udmVydGVkIHRvIEFTQ0lJIHZpYSBwdW55Y29kZTogXCIgKyBlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZHJbMV0gPSBVUkkudW5lc2NhcGVDb21wb25lbnQoYWRkclsxXSwgb3B0aW9ucykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRvW3hdID0gYWRkci5qb2luKFwiQFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50cztcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24gKGNvbXBvbmVudHMsIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdmFyIHRvID0gdG9BcnJheShjb21wb25lbnRzLnRvKTtcclxuICAgICAgICAgICAgaWYgKHRvKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMCwgeGwgPSB0by5sZW5ndGg7IHggPCB4bDsgKyt4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRvQWRkciA9IFN0cmluZyh0b1t4XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0SWR4ID0gdG9BZGRyLmxhc3RJbmRleE9mKFwiQFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYWxQYXJ0ID0gdG9BZGRyLnNsaWNlKDAsIGF0SWR4KTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZG9tYWluID0gdG9BZGRyLnNsaWNlKGF0SWR4ICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxQYXJ0ID0gbG9jYWxQYXJ0LnJlcGxhY2UoUENUX0VOQ09ERUQsIGRlY29kZVVucmVzZXJ2ZWQpLnJlcGxhY2UoUENUX0VOQ09ERUQsIHRvVXBwZXJDYXNlKS5yZXBsYWNlKE5PVF9MT0NBTF9QQVJULCBVUkkucGN0RW5jQ2hhcik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwdW55Y29kZSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnZlcnQgSUROIHZpYSBwdW55Y29kZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluID0gKCFvcHRpb25zLmlyaSA/IHB1bnljb2RlLnRvQVNDSUkoVVJJLnVuZXNjYXBlQ29tcG9uZW50KGRvbWFpbiwgb3B0aW9ucykudG9Mb3dlckNhc2UoKSkgOiBwdW55Y29kZS50b1VuaWNvZGUoZG9tYWluKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuZXJyb3IgPSBjb21wb25lbnRzLmVycm9yIHx8IFwiRW1haWwgYWRkcmVzcydzIGRvbWFpbiBuYW1lIGNhbiBub3QgYmUgY29udmVydGVkIHRvIFwiICsgKCFvcHRpb25zLmlyaSA/IFwiQVNDSUlcIiA6IFwiVW5pY29kZVwiKSArIFwiIHZpYSBwdW55Y29kZTogXCIgKyBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb21haW4gPSBkb21haW4ucmVwbGFjZShQQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKFBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSkucmVwbGFjZShOT1RfRE9NQUlOLCBVUkkucGN0RW5jQ2hhcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRvW3hdID0gbG9jYWxQYXJ0ICsgXCJAXCIgKyBkb21haW47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnBhdGggPSB0by5qb2luKFwiLFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgaGVhZGVycyA9IGNvbXBvbmVudHMuaGVhZGVycyA9IGNvbXBvbmVudHMuaGVhZGVycyB8fCB7fTtcclxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMuc3ViamVjdClcclxuICAgICAgICAgICAgICAgIGhlYWRlcnNbXCJzdWJqZWN0XCJdID0gY29tcG9uZW50cy5zdWJqZWN0O1xyXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50cy5ib2R5KVxyXG4gICAgICAgICAgICAgICAgaGVhZGVyc1tcImJvZHlcIl0gPSBjb21wb25lbnRzLmJvZHk7XHJcbiAgICAgICAgICAgIHZhciBmaWVsZHMgPSBbXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgbmFtZV8xIGluIGhlYWRlcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChoZWFkZXJzW25hbWVfMV0gIT09IE9bbmFtZV8xXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKG5hbWVfMS5yZXBsYWNlKFBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKFBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSkucmVwbGFjZShOT1RfSEZOQU1FLCBVUkkucGN0RW5jQ2hhcikgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIj1cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNbbmFtZV8xXS5yZXBsYWNlKFBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKFBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSkucmVwbGFjZShOT1RfSEZWQUxVRSwgVVJJLnBjdEVuY0NoYXIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5xdWVyeSA9IGZpZWxkcy5qb2luKFwiJlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50cztcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59KSgpO1xyXG4iLCIvLy88cmVmZXJlbmNlIHBhdGg9XCIuLi91cmkudHNcIi8+XHJcbmlmICh0eXBlb2YgQ09NUElMRUQgPT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIFVSSSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgdmFyIFVSSSA9IHJlcXVpcmUoXCIuLi91cmlcIik7XHJcbihmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgcGN0RW5jQ2hhciA9IFVSSS5wY3RFbmNDaGFyLCBOSUQkID0gXCIoPzpbMC05QS1aYS16XVswLTlBLVphLXpcXFxcLV17MSwzMX0pXCIsIFBDVF9FTkNPREVEJCA9IFwiKD86XFxcXCVbMC05QS1GYS1mXXsyfSlcIiwgVFJBTlMkJCA9IFwiWzAtOUEtWmEtelxcXFwoXFxcXClcXFxcK1xcXFwsXFxcXC1cXFxcLlxcXFw6XFxcXD1cXFxcQFxcXFw7XFxcXCRcXFxcX1xcXFwhXFxcXCpcXFxcJ1xcXFwvXFxcXD9cXFxcI11cIiwgTlNTJCA9IFwiKD86KD86XCIgKyBQQ1RfRU5DT0RFRCQgKyBcInxcIiArIFRSQU5TJCQgKyBcIikrKVwiLCBVUk5fU0NIRU1FID0gbmV3IFJlZ0V4cChcIl51cm5cXFxcOihcIiArIE5JRCQgKyBcIikkXCIpLCBVUk5fUEFUSCA9IG5ldyBSZWdFeHAoXCJeKFwiICsgTklEJCArIFwiKVxcXFw6KFwiICsgTlNTJCArIFwiKSRcIiksIFVSTl9QQVJTRSA9IC9eKFteXFw6XSspXFw6KC4qKS8sIFVSTl9FWENMVURFRCA9IC9bXFx4MDAtXFx4MjBcXFxcXFxcIlxcJlxcPFxcPlxcW1xcXVxcXlxcYFxce1xcfFxcfVxcflxceDdGLVxceEZGXS9nLCBVVUlEID0gL15bMC05QS1GYS1mXXs4fSg/OlxcLVswLTlBLUZhLWZdezR9KXszfVxcLVswLTlBLUZhLWZdezEyfSQvO1xyXG4gICAgLy9SRkMgMjE0MVxyXG4gICAgVVJJLlNDSEVNRVNbXCJ1cm5cIl0gPSB7XHJcbiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChjb21wb25lbnRzLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gY29tcG9uZW50cy5wYXRoLm1hdGNoKFVSTl9QQVRIKSwgc2NoZW1lLCBzY2hlbWVIYW5kbGVyO1xyXG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy50b2xlcmFudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuZXJyb3IgPSBjb21wb25lbnRzLmVycm9yIHx8IFwiVVJOIGlzIG5vdCBzdHJpY3RseSB2YWxpZC5cIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG1hdGNoZXMgPSBjb21wb25lbnRzLnBhdGgubWF0Y2goVVJOX1BBUlNFKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWF0Y2hlcykge1xyXG4gICAgICAgICAgICAgICAgc2NoZW1lID0gXCJ1cm46XCIgKyBtYXRjaGVzWzFdLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICBzY2hlbWVIYW5kbGVyID0gVVJJLlNDSEVNRVNbc2NoZW1lXTtcclxuICAgICAgICAgICAgICAgIC8vaW4gb3JkZXIgdG8gc2VyaWFsaXplIHByb3Blcmx5LCBcclxuICAgICAgICAgICAgICAgIC8vZXZlcnkgVVJOIG11c3QgaGF2ZSBhIHNlcmlhbGl6ZXIgdGhhdCBjYWxscyB0aGUgVVJOIHNlcmlhbGl6ZXIgXHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtZUhhbmRsZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2NyZWF0ZSBmYWtlIHNjaGVtZSBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1lSGFuZGxlciA9IFVSSS5TQ0hFTUVTW3NjaGVtZV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoY29tcG9uZW50cywgb3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZTogVVJJLlNDSEVNRVNbXCJ1cm5cIl0uc2VyaWFsaXplXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuc2NoZW1lID0gc2NoZW1lO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wYXRoID0gbWF0Y2hlc1syXTtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMgPSBzY2hlbWVIYW5kbGVyLnBhcnNlKGNvbXBvbmVudHMsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJVUk4gY2FuIG5vdCBiZSBwYXJzZWQuXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZXJpYWxpemU6IGZ1bmN0aW9uIChjb21wb25lbnRzLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHZhciBzY2hlbWUgPSBjb21wb25lbnRzLnNjaGVtZSB8fCBvcHRpb25zLnNjaGVtZSwgbWF0Y2hlcztcclxuICAgICAgICAgICAgaWYgKHNjaGVtZSAmJiBzY2hlbWUgIT09IFwidXJuXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gc2NoZW1lLm1hdGNoKFVSTl9TQ0hFTUUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IFtcInVybjpcIiArIHNjaGVtZSwgc2NoZW1lXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuc2NoZW1lID0gXCJ1cm5cIjtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucGF0aCA9IG1hdGNoZXNbMV0gKyBcIjpcIiArIChjb21wb25lbnRzLnBhdGggPyBjb21wb25lbnRzLnBhdGgucmVwbGFjZShVUk5fRVhDTFVERUQsIHBjdEVuY0NoYXIpIDogXCJcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8vUkZDIDQxMjJcclxuICAgIFVSSS5TQ0hFTUVTW1widXJuOnV1aWRcIl0gPSB7XHJcbiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChjb21wb25lbnRzLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy50b2xlcmFudCAmJiAoIWNvbXBvbmVudHMucGF0aCB8fCAhY29tcG9uZW50cy5wYXRoLm1hdGNoKFVVSUQpKSkge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJVVUlEIGlzIG5vdCB2YWxpZC5cIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50cztcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24gKGNvbXBvbmVudHMsIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgLy9lbnN1cmUgVVVJRCBpcyB2YWxpZFxyXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMudG9sZXJhbnQgJiYgKCFjb21wb25lbnRzLnBhdGggfHwgIWNvbXBvbmVudHMucGF0aC5tYXRjaChVVUlEKSkpIHtcclxuICAgICAgICAgICAgICAgIC8vaW52YWxpZCBVVUlEcyBjYW4gbm90IGhhdmUgdGhpcyBzY2hlbWVcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuc2NoZW1lID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9ub3JtYWxpemUgVVVJRFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wYXRoID0gKGNvbXBvbmVudHMucGF0aCB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBVUkkuU0NIRU1FU1tcInVyblwiXS5zZXJpYWxpemUoY29tcG9uZW50cywgb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufSgpKTtcclxuIiwiLyoqXHJcbiAqIFVSSS5qc1xyXG4gKlxyXG4gKiBAZmlsZW92ZXJ2aWV3IEFuIFJGQyAzOTg2IGNvbXBsaWFudCwgc2NoZW1lIGV4dGVuZGFibGUgVVJJIHBhcnNpbmcvdmFsaWRhdGluZy9yZXNvbHZpbmcgbGlicmFyeSBmb3IgSmF2YVNjcmlwdC5cclxuICogQGF1dGhvciA8YSBocmVmPVwibWFpbHRvOmdhcnkuY291cnRAZ21haWwuY29tXCI+R2FyeSBDb3VydDwvYT5cclxuICogQHZlcnNpb24gMi4wLjBcclxuICogQHNlZSBodHRwOi8vZ2l0aHViLmNvbS9nYXJ5Y291cnQvdXJpLWpzXHJcbiAqIEBsaWNlbnNlIFVSSS5qcyB2Mi4wLjAgKGMpIDIwMTEgR2FyeSBDb3VydC4gTGljZW5zZTogaHR0cDovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L3VyaS1qc1xyXG4gKi9cclxuLyoqXHJcbiAqIENvcHlyaWdodCAyMDExIEdhcnkgQ291cnQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqXHJcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZVxyXG4gKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcclxuICpcclxuICogICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2ZcclxuICogICAgICAgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxyXG4gKlxyXG4gKiAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdFxyXG4gKiAgICAgICBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFsc1xyXG4gKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgR0FSWSBDT1VSVCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRURcclxuICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORFxyXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgR0FSWSBDT1VSVCBPUlxyXG4gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxyXG4gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXHJcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cclxuICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUZcclxuICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqXHJcbiAqIFRoZSB2aWV3cyBhbmQgY29uY2x1c2lvbnMgY29udGFpbmVkIGluIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBhcmUgdGhvc2Ugb2YgdGhlXHJcbiAqIGF1dGhvcnMgYW5kIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgcmVwcmVzZW50aW5nIG9mZmljaWFsIHBvbGljaWVzLCBlaXRoZXIgZXhwcmVzc2VkXHJcbiAqIG9yIGltcGxpZWQsIG9mIEdhcnkgQ291cnQuXHJcbiAqL1xyXG4vLy88cmVmZXJlbmNlIHBhdGg9XCJwdW55Y29kZS5kLnRzXCIvPlxyXG4vLy88cmVmZXJlbmNlIHBhdGg9XCJjb21tb25qcy5kLnRzXCIvPlxyXG4vKipcclxuICogQ29tcGlsZXIgc3dpdGNoIGZvciBpbmRpY2F0aW5nIGNvZGUgaXMgY29tcGlsZWRcclxuICogQGRlZmluZSB7Ym9vbGVhbn1cclxuICovXHJcbnZhciBDT01QSUxFRCA9IGZhbHNlO1xyXG4vKipcclxuICogQ29tcGlsZXIgc3dpdGNoIGZvciBzdXBwb3J0aW5nIElSSSBVUklzXHJcbiAqIEBkZWZpbmUge2Jvb2xlYW59XHJcbiAqL1xyXG52YXIgVVJJX19JUklfU1VQUE9SVCA9IHRydWU7XHJcbi8qKlxyXG4gKiBDb21waWxlciBzd2l0Y2ggZm9yIHN1cHBvcnRpbmcgVVJJIHZhbGlkYXRpb25cclxuICogQGRlZmluZSB7Ym9vbGVhbn1cclxuICovXHJcbnZhciBVUklfX1ZBTElEQVRFX1NVUFBPUlQgPSB0cnVlO1xyXG52YXIgVVJJID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIG1lcmdlKCkge1xyXG4gICAgICAgIHZhciBzZXRzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgc2V0c1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNldHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICBzZXRzWzBdID0gc2V0c1swXS5zbGljZSgwLCAtMSk7XHJcbiAgICAgICAgICAgIHZhciB4bCA9IHNldHMubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgZm9yICh2YXIgeCA9IDE7IHggPCB4bDsgKyt4KSB7XHJcbiAgICAgICAgICAgICAgICBzZXRzW3hdID0gc2V0c1t4XS5zbGljZSgxLCAtMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0c1t4bF0gPSBzZXRzW3hsXS5zbGljZSgxKTtcclxuICAgICAgICAgICAgcmV0dXJuIHNldHMuam9pbignJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gc2V0c1swXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzdWJleHAoc3RyKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiKD86XCIgKyBzdHIgKyBcIilcIjtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGJ1aWxkRXhwcyhpc0lSSSkge1xyXG4gICAgICAgIHZhciBBTFBIQSQkID0gXCJbQS1aYS16XVwiLCBDUiQgPSBcIltcXFxceDBEXVwiLCBESUdJVCQkID0gXCJbMC05XVwiLCBEUVVPVEUkJCA9IFwiW1xcXFx4MjJdXCIsIEhFWERJRyQkID0gbWVyZ2UoRElHSVQkJCwgXCJbQS1GYS1mXVwiKSwgTEYkJCA9IFwiW1xcXFx4MEFdXCIsIFNQJCQgPSBcIltcXFxceDIwXVwiLCBQQ1RfRU5DT0RFRCQgPSBzdWJleHAoc3ViZXhwKFwiJVtFRmVmXVwiICsgSEVYRElHJCQgKyBcIiVcIiArIEhFWERJRyQkICsgSEVYRElHJCQgKyBcIiVcIiArIEhFWERJRyQkICsgSEVYRElHJCQpICsgXCJ8XCIgKyBzdWJleHAoXCIlWzg5QS1GYS1mXVwiICsgSEVYRElHJCQgKyBcIiVcIiArIEhFWERJRyQkICsgSEVYRElHJCQpICsgXCJ8XCIgKyBzdWJleHAoXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSksIEdFTl9ERUxJTVMkJCA9IFwiW1xcXFw6XFxcXC9cXFxcP1xcXFwjXFxcXFtcXFxcXVxcXFxAXVwiLCBTVUJfREVMSU1TJCQgPSBcIltcXFxcIVxcXFwkXFxcXCZcXFxcJ1xcXFwoXFxcXClcXFxcKlxcXFwrXFxcXCxcXFxcO1xcXFw9XVwiLCBSRVNFUlZFRCQkID0gbWVyZ2UoR0VOX0RFTElNUyQkLCBTVUJfREVMSU1TJCQpLCBVQ1NDSEFSJCQgPSBpc0lSSSA/IFwiW1xcXFx4QTAtXFxcXHUyMDBEXFxcXHUyMDEwLVxcXFx1MjAyOVxcXFx1MjAyRi1cXFxcdUQ3RkZcXFxcdUY5MDAtXFxcXHVGRENGXFxcXHVGREYwLVxcXFx1RkZFRl1cIiA6IFwiW11cIiwgSVBSSVZBVEUkJCA9IGlzSVJJID8gXCJbXFxcXHVFMDAwLVxcXFx1RjhGRl1cIiA6IFwiW11cIiwgVU5SRVNFUlZFRCQkID0gbWVyZ2UoQUxQSEEkJCwgRElHSVQkJCwgXCJbXFxcXC1cXFxcLlxcXFxfXFxcXH5dXCIsIFVDU0NIQVIkJCksIFNDSEVNRSQgPSBzdWJleHAoQUxQSEEkJCArIG1lcmdlKEFMUEhBJCQsIERJR0lUJCQsIFwiW1xcXFwrXFxcXC1cXFxcLl1cIikgKyBcIipcIiksIFVTRVJJTkZPJCA9IHN1YmV4cChzdWJleHAoUENUX0VOQ09ERUQkICsgXCJ8XCIgKyBtZXJnZShVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCwgXCJbXFxcXDpdXCIpKSArIFwiKlwiKSwgREVDX09DVEVUJCA9IHN1YmV4cChzdWJleHAoXCIyNVswLTVdXCIpICsgXCJ8XCIgKyBzdWJleHAoXCIyWzAtNF1cIiArIERJR0lUJCQpICsgXCJ8XCIgKyBzdWJleHAoXCIxXCIgKyBESUdJVCQkICsgRElHSVQkJCkgKyBcInxcIiArIHN1YmV4cChcIlsxLTldXCIgKyBESUdJVCQkKSArIFwifFwiICsgRElHSVQkJCksIElQVjRBRERSRVNTJCA9IHN1YmV4cChERUNfT0NURVQkICsgXCJcXFxcLlwiICsgREVDX09DVEVUJCArIFwiXFxcXC5cIiArIERFQ19PQ1RFVCQgKyBcIlxcXFwuXCIgKyBERUNfT0NURVQkKSwgSDE2JCA9IHN1YmV4cChIRVhESUckJCArIFwiezEsNH1cIiksIExTMzIkID0gc3ViZXhwKHN1YmV4cChIMTYkICsgXCJcXFxcOlwiICsgSDE2JCkgKyBcInxcIiArIElQVjRBRERSRVNTJCksIElQVjZBRERSRVNTJCA9IHN1YmV4cChtZXJnZShVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCwgXCJbXFxcXDpdXCIpICsgXCIrXCIpLCBJUFZGVVRVUkUkID0gc3ViZXhwKFwidlwiICsgSEVYRElHJCQgKyBcIitcXFxcLlwiICsgbWVyZ2UoVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQsIFwiW1xcXFw6XVwiKSArIFwiK1wiKSwgSVBfTElURVJBTCQgPSBzdWJleHAoXCJcXFxcW1wiICsgc3ViZXhwKElQVjZBRERSRVNTJCArIFwifFwiICsgSVBWRlVUVVJFJCkgKyBcIlxcXFxdXCIpLCBSRUdfTkFNRSQgPSBzdWJleHAoc3ViZXhwKFBDVF9FTkNPREVEJCArIFwifFwiICsgbWVyZ2UoVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQpKSArIFwiKlwiKSwgSE9TVCQgPSBzdWJleHAoSVBfTElURVJBTCQgKyBcInxcIiArIElQVjRBRERSRVNTJCArIFwiKD8hXCIgKyBSRUdfTkFNRSQgKyBcIilcIiArIFwifFwiICsgUkVHX05BTUUkKSwgUE9SVCQgPSBzdWJleHAoRElHSVQkJCArIFwiKlwiKSwgQVVUSE9SSVRZJCA9IHN1YmV4cChzdWJleHAoVVNFUklORk8kICsgXCJAXCIpICsgXCI/XCIgKyBIT1NUJCArIHN1YmV4cChcIlxcXFw6XCIgKyBQT1JUJCkgKyBcIj9cIiksIFBDSEFSJCA9IHN1YmV4cChQQ1RfRU5DT0RFRCQgKyBcInxcIiArIG1lcmdlKFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkLCBcIltcXFxcOlxcXFxAXVwiKSksIFNFR01FTlQkID0gc3ViZXhwKFBDSEFSJCArIFwiKlwiKSwgU0VHTUVOVF9OWiQgPSBzdWJleHAoUENIQVIkICsgXCIrXCIpLCBTRUdNRU5UX05aX05DJCA9IHN1YmV4cChzdWJleHAoUENUX0VOQ09ERUQkICsgXCJ8XCIgKyBtZXJnZShVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCwgXCJbXFxcXEBdXCIpKSArIFwiK1wiKSwgUEFUSF9BQkVNUFRZJCA9IHN1YmV4cChzdWJleHAoXCJcXFxcL1wiICsgU0VHTUVOVCQpICsgXCIqXCIpLCBQQVRIX0FCU09MVVRFJCA9IHN1YmV4cChcIlxcXFwvXCIgKyBzdWJleHAoU0VHTUVOVF9OWiQgKyBQQVRIX0FCRU1QVFkkKSArIFwiP1wiKSwgUEFUSF9OT1NDSEVNRSQgPSBzdWJleHAoU0VHTUVOVF9OWl9OQyQgKyBQQVRIX0FCRU1QVFkkKSwgUEFUSF9ST09UTEVTUyQgPSBzdWJleHAoU0VHTUVOVF9OWiQgKyBQQVRIX0FCRU1QVFkkKSwgUEFUSF9FTVBUWSQgPSBcIig/IVwiICsgUENIQVIkICsgXCIpXCIsIFBBVEgkID0gc3ViZXhwKFBBVEhfQUJFTVBUWSQgKyBcInxcIiArIFBBVEhfQUJTT0xVVEUkICsgXCJ8XCIgKyBQQVRIX05PU0NIRU1FJCArIFwifFwiICsgUEFUSF9ST09UTEVTUyQgKyBcInxcIiArIFBBVEhfRU1QVFkkKSwgUVVFUlkkID0gc3ViZXhwKHN1YmV4cChQQ0hBUiQgKyBcInxcIiArIG1lcmdlKFwiW1xcXFwvXFxcXD9dXCIsIElQUklWQVRFJCQpKSArIFwiKlwiKSwgRlJBR01FTlQkID0gc3ViZXhwKHN1YmV4cChQQ0hBUiQgKyBcInxbXFxcXC9cXFxcP11cIikgKyBcIipcIiksIEhJRVJfUEFSVCQgPSBzdWJleHAoc3ViZXhwKFwiXFxcXC9cXFxcL1wiICsgQVVUSE9SSVRZJCArIFBBVEhfQUJFTVBUWSQpICsgXCJ8XCIgKyBQQVRIX0FCU09MVVRFJCArIFwifFwiICsgUEFUSF9ST09UTEVTUyQgKyBcInxcIiArIFBBVEhfRU1QVFkkKSwgVVJJJCA9IHN1YmV4cChTQ0hFTUUkICsgXCJcXFxcOlwiICsgSElFUl9QQVJUJCArIHN1YmV4cChcIlxcXFw/XCIgKyBRVUVSWSQpICsgXCI/XCIgKyBzdWJleHAoXCJcXFxcI1wiICsgRlJBR01FTlQkKSArIFwiP1wiKSwgUkVMQVRJVkVfUEFSVCQgPSBzdWJleHAoc3ViZXhwKFwiXFxcXC9cXFxcL1wiICsgQVVUSE9SSVRZJCArIFBBVEhfQUJFTVBUWSQpICsgXCJ8XCIgKyBQQVRIX0FCU09MVVRFJCArIFwifFwiICsgUEFUSF9OT1NDSEVNRSQgKyBcInxcIiArIFBBVEhfRU1QVFkkKSwgUkVMQVRJVkUkID0gc3ViZXhwKFJFTEFUSVZFX1BBUlQkICsgc3ViZXhwKFwiXFxcXD9cIiArIFFVRVJZJCkgKyBcIj9cIiArIHN1YmV4cChcIlxcXFwjXCIgKyBGUkFHTUVOVCQpICsgXCI/XCIpLCBVUklfUkVGRVJFTkNFJCA9IHN1YmV4cChVUkkkICsgXCJ8XCIgKyBSRUxBVElWRSQpLCBBQlNPTFVURV9VUkkkID0gc3ViZXhwKFNDSEVNRSQgKyBcIlxcXFw6XCIgKyBISUVSX1BBUlQkICsgc3ViZXhwKFwiXFxcXD9cIiArIFFVRVJZJCkgKyBcIj9cIiksIEdFTkVSSUNfUkVGJCA9IFwiXihcIiArIFNDSEVNRSQgKyBcIilcXFxcOlwiICsgc3ViZXhwKHN1YmV4cChcIlxcXFwvXFxcXC8oXCIgKyBzdWJleHAoXCIoXCIgKyBVU0VSSU5GTyQgKyBcIilAXCIpICsgXCI/KFwiICsgSE9TVCQgKyBcIilcIiArIHN1YmV4cChcIlxcXFw6KFwiICsgUE9SVCQgKyBcIilcIikgKyBcIj8pXCIpICsgXCI/KFwiICsgUEFUSF9BQkVNUFRZJCArIFwifFwiICsgUEFUSF9BQlNPTFVURSQgKyBcInxcIiArIFBBVEhfUk9PVExFU1MkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCArIFwiKVwiKSArIHN1YmV4cChcIlxcXFw/KFwiICsgUVVFUlkkICsgXCIpXCIpICsgXCI/XCIgKyBzdWJleHAoXCJcXFxcIyhcIiArIEZSQUdNRU5UJCArIFwiKVwiKSArIFwiPyRcIiwgUkVMQVRJVkVfUkVGJCA9IFwiXigpezB9XCIgKyBzdWJleHAoc3ViZXhwKFwiXFxcXC9cXFxcLyhcIiArIHN1YmV4cChcIihcIiArIFVTRVJJTkZPJCArIFwiKUBcIikgKyBcIj8oXCIgKyBIT1NUJCArIFwiKVwiICsgc3ViZXhwKFwiXFxcXDooXCIgKyBQT1JUJCArIFwiKVwiKSArIFwiPylcIikgKyBcIj8oXCIgKyBQQVRIX0FCRU1QVFkkICsgXCJ8XCIgKyBQQVRIX0FCU09MVVRFJCArIFwifFwiICsgUEFUSF9OT1NDSEVNRSQgKyBcInxcIiArIFBBVEhfRU1QVFkkICsgXCIpXCIpICsgc3ViZXhwKFwiXFxcXD8oXCIgKyBRVUVSWSQgKyBcIilcIikgKyBcIj9cIiArIHN1YmV4cChcIlxcXFwjKFwiICsgRlJBR01FTlQkICsgXCIpXCIpICsgXCI/JFwiLCBBQlNPTFVURV9SRUYkID0gXCJeKFwiICsgU0NIRU1FJCArIFwiKVxcXFw6XCIgKyBzdWJleHAoc3ViZXhwKFwiXFxcXC9cXFxcLyhcIiArIHN1YmV4cChcIihcIiArIFVTRVJJTkZPJCArIFwiKUBcIikgKyBcIj8oXCIgKyBIT1NUJCArIFwiKVwiICsgc3ViZXhwKFwiXFxcXDooXCIgKyBQT1JUJCArIFwiKVwiKSArIFwiPylcIikgKyBcIj8oXCIgKyBQQVRIX0FCRU1QVFkkICsgXCJ8XCIgKyBQQVRIX0FCU09MVVRFJCArIFwifFwiICsgUEFUSF9ST09UTEVTUyQgKyBcInxcIiArIFBBVEhfRU1QVFkkICsgXCIpXCIpICsgc3ViZXhwKFwiXFxcXD8oXCIgKyBRVUVSWSQgKyBcIilcIikgKyBcIj8kXCIsIFNBTUVET0NfUkVGJCA9IFwiXlwiICsgc3ViZXhwKFwiXFxcXCMoXCIgKyBGUkFHTUVOVCQgKyBcIilcIikgKyBcIj8kXCIsIEFVVEhPUklUWV9SRUYkID0gXCJeXCIgKyBzdWJleHAoXCIoXCIgKyBVU0VSSU5GTyQgKyBcIilAXCIpICsgXCI/KFwiICsgSE9TVCQgKyBcIilcIiArIHN1YmV4cChcIlxcXFw6KFwiICsgUE9SVCQgKyBcIilcIikgKyBcIj8kXCI7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgVVJJX1JFRjogVVJJX19WQUxJREFURV9TVVBQT1JUICYmIG5ldyBSZWdFeHAoXCIoXCIgKyBHRU5FUklDX1JFRiQgKyBcIil8KFwiICsgUkVMQVRJVkVfUkVGJCArIFwiKVwiKSxcclxuICAgICAgICAgICAgTk9UX1NDSEVNRTogbmV3IFJlZ0V4cChtZXJnZShcIlteXVwiLCBBTFBIQSQkLCBESUdJVCQkLCBcIltcXFxcK1xcXFwtXFxcXC5dXCIpLCBcImdcIiksXHJcbiAgICAgICAgICAgIE5PVF9VU0VSSU5GTzogbmV3IFJlZ0V4cChtZXJnZShcIlteXFxcXCVcXFxcOl1cIiwgVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQpLCBcImdcIiksXHJcbiAgICAgICAgICAgIE5PVF9IT1NUOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15cXFxcJV1cIiwgVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQpLCBcImdcIiksXHJcbiAgICAgICAgICAgIE5PVF9QQVRIOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15cXFxcJVxcXFwvXFxcXDpcXFxcQF1cIiwgVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQpLCBcImdcIiksXHJcbiAgICAgICAgICAgIE5PVF9QQVRIX05PU0NIRU1FOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15cXFxcJVxcXFwvXFxcXEBdXCIsIFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkKSwgXCJnXCIpLFxyXG4gICAgICAgICAgICBOT1RfUVVFUlk6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXlxcXFwlXVwiLCBVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCwgXCJbXFxcXDpcXFxcQFxcXFwvXFxcXD9dXCIsIElQUklWQVRFJCQpLCBcImdcIiksXHJcbiAgICAgICAgICAgIE5PVF9GUkFHTUVOVDogbmV3IFJlZ0V4cChtZXJnZShcIlteXFxcXCVdXCIsIFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkLCBcIltcXFxcOlxcXFxAXFxcXC9cXFxcP11cIiksIFwiZ1wiKSxcclxuICAgICAgICAgICAgRVNDQVBFOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15dXCIsIFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkKSwgXCJnXCIpLFxyXG4gICAgICAgICAgICBVTlJFU0VSVkVEOiBuZXcgUmVnRXhwKFVOUkVTRVJWRUQkJCwgXCJnXCIpLFxyXG4gICAgICAgICAgICBPVEhFUl9DSEFSUzogbmV3IFJlZ0V4cChtZXJnZShcIlteXFxcXCVdXCIsIFVOUkVTRVJWRUQkJCwgUkVTRVJWRUQkJCksIFwiZ1wiKSxcclxuICAgICAgICAgICAgUENUX0VOQ09ERUQ6IG5ldyBSZWdFeHAoUENUX0VOQ09ERUQkLCBcImdcIilcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgdmFyIFVSSV9QUk9UT0NPTCA9IGJ1aWxkRXhwcyhmYWxzZSksIElSSV9QUk9UT0NPTCA9IFVSSV9fSVJJX1NVUFBPUlQgPyBidWlsZEV4cHModHJ1ZSkgOiB1bmRlZmluZWQsIFVSSV9QQVJTRSA9IC9eKD86KFteOlxcLz8jXSspOik/KD86XFwvXFwvKCg/OihbXlxcLz8jQF0qKUApPyhbXlxcLz8jOl0qKSg/OlxcOihcXGQqKSk/KSk/KFtePyNdKikoPzpcXD8oW14jXSopKT8oPzojKCg/Oi58XFxuKSopKT8vaSwgUkRTMSA9IC9eXFwuXFwuP1xcLy8sIFJEUzIgPSAvXlxcL1xcLihcXC98JCkvLCBSRFMzID0gL15cXC9cXC5cXC4oXFwvfCQpLywgUkRTNCA9IC9eXFwuXFwuPyQvLCBSRFM1ID0gL15cXC8/KD86LnxcXG4pKj8oPz1cXC98JCkvLCBOT19NQVRDSF9JU19VTkRFRklORUQgPSAoXCJcIikubWF0Y2goLygpezB9LylbMV0gPT09IHVuZGVmaW5lZDtcclxuICAgIGZ1bmN0aW9uIHBjdEVuY0NoYXIoY2hyKSB7XHJcbiAgICAgICAgdmFyIGMgPSBjaHIuY2hhckNvZGVBdCgwKSwgZTtcclxuICAgICAgICBpZiAoYyA8IDE2KVxyXG4gICAgICAgICAgICBlID0gXCIlMFwiICsgYy50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcclxuICAgICAgICBlbHNlIGlmIChjIDwgMTI4KVxyXG4gICAgICAgICAgICBlID0gXCIlXCIgKyBjLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIGVsc2UgaWYgKGMgPCAyMDQ4KVxyXG4gICAgICAgICAgICBlID0gXCIlXCIgKyAoKGMgPj4gNikgfCAxOTIpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgXCIlXCIgKyAoKGMgJiA2MykgfCAxMjgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgZSA9IFwiJVwiICsgKChjID4+IDEyKSB8IDIyNCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgKyBcIiVcIiArICgoKGMgPj4gNikgJiA2MykgfCAxMjgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgXCIlXCIgKyAoKGMgJiA2MykgfCAxMjgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIHJldHVybiBlO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcGN0RGVjQ2hhcnMoc3RyKSB7XHJcbiAgICAgICAgdmFyIG5ld1N0ciA9IFwiXCIsIGkgPSAwLCBpbCA9IHN0ci5sZW5ndGgsIGMsIGMyLCBjMztcclxuICAgICAgICB3aGlsZSAoaSA8IGlsKSB7XHJcbiAgICAgICAgICAgIGMgPSBwYXJzZUludChzdHIuc3Vic3RyKGkgKyAxLCAyKSwgMTYpO1xyXG4gICAgICAgICAgICBpZiAoYyA8IDEyOCkge1xyXG4gICAgICAgICAgICAgICAgbmV3U3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XHJcbiAgICAgICAgICAgICAgICBpICs9IDM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoYyA+PSAxOTQgJiYgYyA8IDIyNCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKChpbCAtIGkpID49IDYpIHtcclxuICAgICAgICAgICAgICAgICAgICBjMiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoaSArIDQsIDIpLCAxNik7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3U3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMzEpIDw8IDYpIHwgKGMyICYgNjMpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld1N0ciArPSBzdHIuc3Vic3RyKGksIDYpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaSArPSA2O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGMgPj0gMjI0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKGlsIC0gaSkgPj0gOSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGMyID0gcGFyc2VJbnQoc3RyLnN1YnN0cihpICsgNCwgMiksIDE2KTtcclxuICAgICAgICAgICAgICAgICAgICBjMyA9IHBhcnNlSW50KHN0ci5zdWJzdHIoaSArIDcsIDIpLCAxNik7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3U3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMTUpIDw8IDEyKSB8ICgoYzIgJiA2MykgPDwgNikgfCAoYzMgJiA2MykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3U3RyICs9IHN0ci5zdWJzdHIoaSwgOSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpICs9IDk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBuZXdTdHIgKz0gc3RyLnN1YnN0cihpLCAzKTtcclxuICAgICAgICAgICAgICAgIGkgKz0gMztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3U3RyO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdHlwZU9mKG8pIHtcclxuICAgICAgICByZXR1cm4gbyA9PT0gdW5kZWZpbmVkID8gXCJ1bmRlZmluZWRcIiA6IChvID09PSBudWxsID8gXCJudWxsXCIgOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc3BsaXQoXCIgXCIpLnBvcCgpLnNwbGl0KFwiXVwiKS5zaGlmdCgpLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdG9VcHBlckNhc2Uoc3RyKSB7XHJcbiAgICAgICAgcmV0dXJuIHN0ci50b1VwcGVyQ2FzZSgpO1xyXG4gICAgfVxyXG4gICAgdmFyIFNDSEVNRVMgPSB7fTtcclxuICAgIGZ1bmN0aW9uIF9ub3JtYWxpemVDb21wb25lbnRFbmNvZGluZyhjb21wb25lbnRzLCBwcm90b2NvbCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGRlY29kZVVucmVzZXJ2ZWQoc3RyKSB7XHJcbiAgICAgICAgICAgIHZhciBkZWNTdHIgPSBwY3REZWNDaGFycyhzdHIpO1xyXG4gICAgICAgICAgICByZXR1cm4gKCFkZWNTdHIubWF0Y2gocHJvdG9jb2wuVU5SRVNFUlZFRCkgPyBzdHIgOiBkZWNTdHIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29tcG9uZW50cy5zY2hlbWUpXHJcbiAgICAgICAgICAgIGNvbXBvbmVudHMuc2NoZW1lID0gU3RyaW5nKGNvbXBvbmVudHMuc2NoZW1lKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UocHJvdG9jb2wuTk9UX1NDSEVNRSwgXCJcIik7XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudHMudXNlcmluZm8gIT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgY29tcG9uZW50cy51c2VyaW5mbyA9IFN0cmluZyhjb21wb25lbnRzLnVzZXJpbmZvKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKHByb3RvY29sLk5PVF9VU0VSSU5GTywgcGN0RW5jQ2hhcikucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgdG9VcHBlckNhc2UpO1xyXG4gICAgICAgIGlmIChjb21wb25lbnRzLmhvc3QgIT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgY29tcG9uZW50cy5ob3N0ID0gU3RyaW5nKGNvbXBvbmVudHMuaG9zdCkucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKHByb3RvY29sLk5PVF9IT1NULCBwY3RFbmNDaGFyKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSk7XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudHMucGF0aCAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICBjb21wb25lbnRzLnBhdGggPSBTdHJpbmcoY29tcG9uZW50cy5wYXRoKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKChjb21wb25lbnRzLnNjaGVtZSA/IHByb3RvY29sLk5PVF9QQVRIIDogcHJvdG9jb2wuTk9UX1BBVEhfTk9TQ0hFTUUpLCBwY3RFbmNDaGFyKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSk7XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudHMucXVlcnkgIT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgY29tcG9uZW50cy5xdWVyeSA9IFN0cmluZyhjb21wb25lbnRzLnF1ZXJ5KS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKHByb3RvY29sLk5PVF9RVUVSWSwgcGN0RW5jQ2hhcikucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgdG9VcHBlckNhc2UpO1xyXG4gICAgICAgIGlmIChjb21wb25lbnRzLmZyYWdtZW50ICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIGNvbXBvbmVudHMuZnJhZ21lbnQgPSBTdHJpbmcoY29tcG9uZW50cy5mcmFnbWVudCkucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkucmVwbGFjZShwcm90b2NvbC5OT1RfRlJBR01FTlQsIHBjdEVuY0NoYXIpLnJlcGxhY2UocHJvdG9jb2wuUENUX0VOQ09ERUQsIHRvVXBwZXJDYXNlKTtcclxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcclxuICAgIH1cclxuICAgIDtcclxuICAgIGZ1bmN0aW9uIHBhcnNlKHVyaVN0cmluZywgb3B0aW9ucykge1xyXG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XHJcbiAgICAgICAgdmFyIHByb3RvY29sID0gKFVSSV9fSVJJX1NVUFBPUlQgJiYgb3B0aW9ucy5pcmkgIT09IGZhbHNlID8gSVJJX1BST1RPQ09MIDogVVJJX1BST1RPQ09MKSwgbWF0Y2hlcywgcGFyc2VFcnJvciA9IGZhbHNlLCBjb21wb25lbnRzID0ge30sIHNjaGVtZUhhbmRsZXI7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMucmVmZXJlbmNlID09PSBcInN1ZmZpeFwiKVxyXG4gICAgICAgICAgICB1cmlTdHJpbmcgPSAob3B0aW9ucy5zY2hlbWUgPyBvcHRpb25zLnNjaGVtZSArIFwiOlwiIDogXCJcIikgKyBcIi8vXCIgKyB1cmlTdHJpbmc7XHJcbiAgICAgICAgaWYgKFVSSV9fVkFMSURBVEVfU1VQUE9SVCkge1xyXG4gICAgICAgICAgICBtYXRjaGVzID0gdXJpU3RyaW5nLm1hdGNoKHByb3RvY29sLlVSSV9SRUYpO1xyXG4gICAgICAgICAgICBpZiAobWF0Y2hlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXNbMV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2dlbmVyaWMgVVJJXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IG1hdGNoZXMuc2xpY2UoMSwgMTApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZWxhdGl2ZSBVUklcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gbWF0Y2hlcy5zbGljZSgxMCwgMTkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcykge1xyXG4gICAgICAgICAgICAgICAgcGFyc2VFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMudG9sZXJhbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJVUkkgaXMgbm90IHN0cmljdGx5IHZhbGlkLlwiO1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hlcyA9IHVyaVN0cmluZy5tYXRjaChVUklfUEFSU0UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBtYXRjaGVzID0gdXJpU3RyaW5nLm1hdGNoKFVSSV9QQVJTRSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXRjaGVzKSB7XHJcbiAgICAgICAgICAgIGlmIChOT19NQVRDSF9JU19VTkRFRklORUQpIHtcclxuICAgICAgICAgICAgICAgIC8vc3RvcmUgZWFjaCBjb21wb25lbnRcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuc2NoZW1lID0gbWF0Y2hlc1sxXTtcclxuICAgICAgICAgICAgICAgIC8vY29tcG9uZW50cy5hdXRob3JpdHkgPSBtYXRjaGVzWzJdO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy51c2VyaW5mbyA9IG1hdGNoZXNbM107XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLmhvc3QgPSBtYXRjaGVzWzRdO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wb3J0ID0gcGFyc2VJbnQobWF0Y2hlc1s1XSwgMTApO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wYXRoID0gbWF0Y2hlc1s2XSB8fCBcIlwiO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5xdWVyeSA9IG1hdGNoZXNbN107XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLmZyYWdtZW50ID0gbWF0Y2hlc1s4XTtcclxuICAgICAgICAgICAgICAgIC8vZml4IHBvcnQgbnVtYmVyXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4oY29tcG9uZW50cy5wb3J0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucG9ydCA9IG1hdGNoZXNbNV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL3N0b3JlIGVhY2ggY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnNjaGVtZSA9IG1hdGNoZXNbMV0gfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgLy9jb21wb25lbnRzLmF1dGhvcml0eSA9ICh1cmlTdHJpbmcuaW5kZXhPZihcIi8vXCIpICE9PSAtMSA/IG1hdGNoZXNbMl0gOiB1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy51c2VyaW5mbyA9ICh1cmlTdHJpbmcuaW5kZXhPZihcIkBcIikgIT09IC0xID8gbWF0Y2hlc1szXSA6IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLmhvc3QgPSAodXJpU3RyaW5nLmluZGV4T2YoXCIvL1wiKSAhPT0gLTEgPyBtYXRjaGVzWzRdIDogdW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucG9ydCA9IHBhcnNlSW50KG1hdGNoZXNbNV0sIDEwKTtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucGF0aCA9IG1hdGNoZXNbNl0gfHwgXCJcIjtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucXVlcnkgPSAodXJpU3RyaW5nLmluZGV4T2YoXCI/XCIpICE9PSAtMSA/IG1hdGNoZXNbN10gOiB1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5mcmFnbWVudCA9ICh1cmlTdHJpbmcuaW5kZXhPZihcIiNcIikgIT09IC0xID8gbWF0Y2hlc1s4XSA6IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICAvL2ZpeCBwb3J0IG51bWJlclxyXG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKGNvbXBvbmVudHMucG9ydCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLnBvcnQgPSAodXJpU3RyaW5nLm1hdGNoKC9cXC9cXC8oPzoufFxcbikqXFw6KD86XFwvfFxcP3xcXCN8JCkvKSA/IG1hdGNoZXNbNF0gOiB1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vZGV0ZXJtaW5lIHJlZmVyZW5jZSB0eXBlXHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRzLnNjaGVtZSA9PT0gdW5kZWZpbmVkICYmIGNvbXBvbmVudHMudXNlcmluZm8gPT09IHVuZGVmaW5lZCAmJiBjb21wb25lbnRzLmhvc3QgPT09IHVuZGVmaW5lZCAmJiBjb21wb25lbnRzLnBvcnQgPT09IHVuZGVmaW5lZCAmJiAhY29tcG9uZW50cy5wYXRoICYmIGNvbXBvbmVudHMucXVlcnkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5yZWZlcmVuY2UgPSBcInNhbWUtZG9jdW1lbnRcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjb21wb25lbnRzLnNjaGVtZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnJlZmVyZW5jZSA9IFwicmVsYXRpdmVcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjb21wb25lbnRzLmZyYWdtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucmVmZXJlbmNlID0gXCJhYnNvbHV0ZVwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5yZWZlcmVuY2UgPSBcInVyaVwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vY2hlY2sgZm9yIHJlZmVyZW5jZSBlcnJvcnNcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVmZXJlbmNlICYmIG9wdGlvbnMucmVmZXJlbmNlICE9PSBcInN1ZmZpeFwiICYmIG9wdGlvbnMucmVmZXJlbmNlICE9PSBjb21wb25lbnRzLnJlZmVyZW5jZSkge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJVUkkgaXMgbm90IGEgXCIgKyBvcHRpb25zLnJlZmVyZW5jZSArIFwiIHJlZmVyZW5jZS5cIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL2ZpbmQgc2NoZW1lIGhhbmRsZXJcclxuICAgICAgICAgICAgc2NoZW1lSGFuZGxlciA9IFNDSEVNRVNbKG9wdGlvbnMuc2NoZW1lIHx8IGNvbXBvbmVudHMuc2NoZW1lIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCldO1xyXG4gICAgICAgICAgICAvL2NoZWNrIGlmIHNjaGVtZSBjYW4ndCBoYW5kbGUgSVJJc1xyXG4gICAgICAgICAgICBpZiAoVVJJX19JUklfU1VQUE9SVCAmJiB0eXBlb2YgcHVueWNvZGUgIT09IFwidW5kZWZpbmVkXCIgJiYgIW9wdGlvbnMudW5pY29kZVN1cHBvcnQgJiYgKCFzY2hlbWVIYW5kbGVyIHx8ICFzY2hlbWVIYW5kbGVyLnVuaWNvZGVTdXBwb3J0KSkge1xyXG4gICAgICAgICAgICAgICAgLy9pZiBob3N0IGNvbXBvbmVudCBpcyBhIGRvbWFpbiBuYW1lXHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50cy5ob3N0ICYmIChvcHRpb25zLmRvbWFpbkhvc3QgfHwgKHNjaGVtZUhhbmRsZXIgJiYgc2NoZW1lSGFuZGxlci5kb21haW5Ib3N0KSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnZlcnQgVW5pY29kZSBJRE4gLT4gQVNDSUkgSUROXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5ob3N0ID0gcHVueWNvZGUudG9BU0NJSShjb21wb25lbnRzLmhvc3QucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgcGN0RGVjQ2hhcnMpLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmVycm9yID0gY29tcG9uZW50cy5lcnJvciB8fCBcIkhvc3QncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBBU0NJSSB2aWEgcHVueWNvZGU6IFwiICsgZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL2NvbnZlcnQgSVJJIC0+IFVSSVxyXG4gICAgICAgICAgICAgICAgX25vcm1hbGl6ZUNvbXBvbmVudEVuY29kaW5nKGNvbXBvbmVudHMsIFVSSV9QUk9UT0NPTCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL25vcm1hbGl6ZSBlbmNvZGluZ3NcclxuICAgICAgICAgICAgICAgIF9ub3JtYWxpemVDb21wb25lbnRFbmNvZGluZyhjb21wb25lbnRzLCBwcm90b2NvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9wZXJmb3JtIHNjaGVtZSBzcGVjaWZpYyBwYXJzaW5nXHJcbiAgICAgICAgICAgIGlmIChzY2hlbWVIYW5kbGVyICYmIHNjaGVtZUhhbmRsZXIucGFyc2UpIHtcclxuICAgICAgICAgICAgICAgIHNjaGVtZUhhbmRsZXIucGFyc2UoY29tcG9uZW50cywgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHBhcnNlRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb21wb25lbnRzLmVycm9yID0gY29tcG9uZW50cy5lcnJvciB8fCBcIlVSSSBjYW4gbm90IGJlIHBhcnNlZC5cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XHJcbiAgICB9XHJcbiAgICA7XHJcbiAgICBmdW5jdGlvbiBfcmVjb21wb3NlQXV0aG9yaXR5KGNvbXBvbmVudHMsIG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgdXJpVG9rZW5zID0gW107XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudHMudXNlcmluZm8gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB1cmlUb2tlbnMucHVzaChjb21wb25lbnRzLnVzZXJpbmZvKTtcclxuICAgICAgICAgICAgdXJpVG9rZW5zLnB1c2goXCJAXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29tcG9uZW50cy5ob3N0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdXJpVG9rZW5zLnB1c2goY29tcG9uZW50cy5ob3N0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnRzLnBvcnQgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgdXJpVG9rZW5zLnB1c2goXCI6XCIpO1xyXG4gICAgICAgICAgICB1cmlUb2tlbnMucHVzaChjb21wb25lbnRzLnBvcnQudG9TdHJpbmcoMTApKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVyaVRva2Vucy5sZW5ndGggPyB1cmlUb2tlbnMuam9pbihcIlwiKSA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIDtcclxuICAgIGZ1bmN0aW9uIHJlbW92ZURvdFNlZ21lbnRzKGlucHV0KSB7XHJcbiAgICAgICAgdmFyIG91dHB1dCA9IFtdLCBzO1xyXG4gICAgICAgIHdoaWxlIChpbnB1dC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaWYgKGlucHV0Lm1hdGNoKFJEUzEpKSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoUkRTMSwgXCJcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXQubWF0Y2goUkRTMikpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZShSRFMyLCBcIi9cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXQubWF0Y2goUkRTMykpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZShSRFMzLCBcIi9cIik7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXQucG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXQgPT09IFwiLlwiIHx8IGlucHV0ID09PSBcIi4uXCIpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0ID0gXCJcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHMgPSBpbnB1dC5tYXRjaChSRFM1KVswXTtcclxuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2Uocy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gocyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG91dHB1dC5qb2luKFwiXCIpO1xyXG4gICAgfVxyXG4gICAgO1xyXG4gICAgZnVuY3Rpb24gc2VyaWFsaXplKGNvbXBvbmVudHMsIG9wdGlvbnMpIHtcclxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG4gICAgICAgIHZhciBwcm90b2NvbCA9IChVUklfX0lSSV9TVVBQT1JUICYmIG9wdGlvbnMuaXJpID8gSVJJX1BST1RPQ09MIDogVVJJX1BST1RPQ09MKSwgdXJpVG9rZW5zID0gW10sIHNjaGVtZUhhbmRsZXIsIGF1dGhvcml0eSwgcztcclxuICAgICAgICAvL2ZpbmQgc2NoZW1lIGhhbmRsZXJcclxuICAgICAgICBzY2hlbWVIYW5kbGVyID0gU0NIRU1FU1sob3B0aW9ucy5zY2hlbWUgfHwgY29tcG9uZW50cy5zY2hlbWUgfHwgXCJcIikudG9Mb3dlckNhc2UoKV07XHJcbiAgICAgICAgLy9wZXJmb3JtIHNjaGVtZSBzcGVjaWZpYyBzZXJpYWxpemF0aW9uXHJcbiAgICAgICAgaWYgKHNjaGVtZUhhbmRsZXIgJiYgc2NoZW1lSGFuZGxlci5zZXJpYWxpemUpXHJcbiAgICAgICAgICAgIHNjaGVtZUhhbmRsZXIuc2VyaWFsaXplKGNvbXBvbmVudHMsIG9wdGlvbnMpO1xyXG4gICAgICAgIC8vaWYgaG9zdCBjb21wb25lbnQgaXMgYSBkb21haW4gbmFtZVxyXG4gICAgICAgIGlmIChVUklfX0lSSV9TVVBQT1JUICYmIHR5cGVvZiBwdW55Y29kZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb21wb25lbnRzLmhvc3QgJiYgKG9wdGlvbnMuZG9tYWluSG9zdCB8fCAoc2NoZW1lSGFuZGxlciAmJiBzY2hlbWVIYW5kbGVyLmRvbWFpbkhvc3QpKSkge1xyXG4gICAgICAgICAgICAvL2NvbnZlcnQgSUROIHZpYSBwdW55Y29kZVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5ob3N0ID0gKCFvcHRpb25zLmlyaSA/IHB1bnljb2RlLnRvQVNDSUkoY29tcG9uZW50cy5ob3N0LnJlcGxhY2UocHJvdG9jb2wuUENUX0VOQ09ERUQsIHBjdERlY0NoYXJzKS50b0xvd2VyQ2FzZSgpKSA6IHB1bnljb2RlLnRvVW5pY29kZShjb21wb25lbnRzLmhvc3QpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJIb3N0J3MgZG9tYWluIG5hbWUgY2FuIG5vdCBiZSBjb252ZXJ0ZWQgdG8gXCIgKyAoIW9wdGlvbnMuaXJpID8gXCJBU0NJSVwiIDogXCJVbmljb2RlXCIpICsgXCIgdmlhIHB1bnljb2RlOiBcIiArIGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9ub3JtYWxpemUgZW5jb2RpbmdcclxuICAgICAgICBfbm9ybWFsaXplQ29tcG9uZW50RW5jb2RpbmcoY29tcG9uZW50cywgcHJvdG9jb2wpO1xyXG4gICAgICAgIGlmIChvcHRpb25zLnJlZmVyZW5jZSAhPT0gXCJzdWZmaXhcIiAmJiBjb21wb25lbnRzLnNjaGVtZSkge1xyXG4gICAgICAgICAgICB1cmlUb2tlbnMucHVzaChjb21wb25lbnRzLnNjaGVtZSk7XHJcbiAgICAgICAgICAgIHVyaVRva2Vucy5wdXNoKFwiOlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXV0aG9yaXR5ID0gX3JlY29tcG9zZUF1dGhvcml0eShjb21wb25lbnRzLCBvcHRpb25zKTtcclxuICAgICAgICBpZiAoYXV0aG9yaXR5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVmZXJlbmNlICE9PSBcInN1ZmZpeFwiKSB7XHJcbiAgICAgICAgICAgICAgICB1cmlUb2tlbnMucHVzaChcIi8vXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHVyaVRva2Vucy5wdXNoKGF1dGhvcml0eSk7XHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRzLnBhdGggJiYgY29tcG9uZW50cy5wYXRoLmNoYXJBdCgwKSAhPT0gXCIvXCIpIHtcclxuICAgICAgICAgICAgICAgIHVyaVRva2Vucy5wdXNoKFwiL1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29tcG9uZW50cy5wYXRoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcyA9IGNvbXBvbmVudHMucGF0aDtcclxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFic29sdXRlUGF0aCAmJiAoIXNjaGVtZUhhbmRsZXIgfHwgIXNjaGVtZUhhbmRsZXIuYWJzb2x1dGVQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgcyA9IHJlbW92ZURvdFNlZ21lbnRzKHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhdXRob3JpdHkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgvXlxcL1xcLy8sIFwiLyUyRlwiKTsgLy9kb24ndCBhbGxvdyB0aGUgcGF0aCB0byBzdGFydCB3aXRoIFwiLy9cIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHVyaVRva2Vucy5wdXNoKHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29tcG9uZW50cy5xdWVyeSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHVyaVRva2Vucy5wdXNoKFwiP1wiKTtcclxuICAgICAgICAgICAgdXJpVG9rZW5zLnB1c2goY29tcG9uZW50cy5xdWVyeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb21wb25lbnRzLmZyYWdtZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdXJpVG9rZW5zLnB1c2goXCIjXCIpO1xyXG4gICAgICAgICAgICB1cmlUb2tlbnMucHVzaChjb21wb25lbnRzLmZyYWdtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVyaVRva2Vucy5qb2luKCcnKTsgLy9tZXJnZSB0b2tlbnMgaW50byBhIHN0cmluZ1xyXG4gICAgfVxyXG4gICAgO1xyXG4gICAgZnVuY3Rpb24gcmVzb2x2ZUNvbXBvbmVudHMoYmFzZSwgcmVsYXRpdmUsIG9wdGlvbnMsIHNraXBOb3JtYWxpemF0aW9uKSB7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cclxuICAgICAgICB2YXIgdGFyZ2V0ID0ge307XHJcbiAgICAgICAgaWYgKCFza2lwTm9ybWFsaXphdGlvbikge1xyXG4gICAgICAgICAgICBiYXNlID0gcGFyc2Uoc2VyaWFsaXplKGJhc2UsIG9wdGlvbnMpLCBvcHRpb25zKTsgLy9ub3JtYWxpemUgYmFzZSBjb21wb25lbnRzXHJcbiAgICAgICAgICAgIHJlbGF0aXZlID0gcGFyc2Uoc2VyaWFsaXplKHJlbGF0aXZlLCBvcHRpb25zKSwgb3B0aW9ucyk7IC8vbm9ybWFsaXplIHJlbGF0aXZlIGNvbXBvbmVudHNcclxuICAgICAgICB9XHJcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcbiAgICAgICAgaWYgKCFvcHRpb25zLnRvbGVyYW50ICYmIHJlbGF0aXZlLnNjaGVtZSkge1xyXG4gICAgICAgICAgICB0YXJnZXQuc2NoZW1lID0gcmVsYXRpdmUuc2NoZW1lO1xyXG4gICAgICAgICAgICAvL3RhcmdldC5hdXRob3JpdHkgPSByZWxhdGl2ZS5hdXRob3JpdHk7XHJcbiAgICAgICAgICAgIHRhcmdldC51c2VyaW5mbyA9IHJlbGF0aXZlLnVzZXJpbmZvO1xyXG4gICAgICAgICAgICB0YXJnZXQuaG9zdCA9IHJlbGF0aXZlLmhvc3Q7XHJcbiAgICAgICAgICAgIHRhcmdldC5wb3J0ID0gcmVsYXRpdmUucG9ydDtcclxuICAgICAgICAgICAgdGFyZ2V0LnBhdGggPSByZW1vdmVEb3RTZWdtZW50cyhyZWxhdGl2ZS5wYXRoKTtcclxuICAgICAgICAgICAgdGFyZ2V0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocmVsYXRpdmUudXNlcmluZm8gIT09IHVuZGVmaW5lZCB8fCByZWxhdGl2ZS5ob3N0ICE9PSB1bmRlZmluZWQgfHwgcmVsYXRpdmUucG9ydCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvL3RhcmdldC5hdXRob3JpdHkgPSByZWxhdGl2ZS5hdXRob3JpdHk7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQudXNlcmluZm8gPSByZWxhdGl2ZS51c2VyaW5mbztcclxuICAgICAgICAgICAgICAgIHRhcmdldC5ob3N0ID0gcmVsYXRpdmUuaG9zdDtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5wb3J0ID0gcmVsYXRpdmUucG9ydDtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5wYXRoID0gcmVtb3ZlRG90U2VnbWVudHMocmVsYXRpdmUucGF0aCk7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghcmVsYXRpdmUucGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wYXRoID0gYmFzZS5wYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZS5xdWVyeSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnF1ZXJ5ID0gYmFzZS5xdWVyeTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpdmUucGF0aC5jaGFyQXQoMCkgPT09IFwiL1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5wYXRoID0gcmVtb3ZlRG90U2VnbWVudHMocmVsYXRpdmUucGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJhc2UudXNlcmluZm8gIT09IHVuZGVmaW5lZCB8fCBiYXNlLmhvc3QgIT09IHVuZGVmaW5lZCB8fCBiYXNlLnBvcnQgIT09IHVuZGVmaW5lZCkgJiYgIWJhc2UucGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnBhdGggPSBcIi9cIiArIHJlbGF0aXZlLnBhdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWJhc2UucGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnBhdGggPSByZWxhdGl2ZS5wYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnBhdGggPSBiYXNlLnBhdGguc2xpY2UoMCwgYmFzZS5wYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpICsgcmVsYXRpdmUucGF0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucGF0aCA9IHJlbW92ZURvdFNlZ21lbnRzKHRhcmdldC5wYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL3RhcmdldC5hdXRob3JpdHkgPSBiYXNlLmF1dGhvcml0eTtcclxuICAgICAgICAgICAgICAgIHRhcmdldC51c2VyaW5mbyA9IGJhc2UudXNlcmluZm87XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQuaG9zdCA9IGJhc2UuaG9zdDtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5wb3J0ID0gYmFzZS5wb3J0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRhcmdldC5zY2hlbWUgPSBiYXNlLnNjaGVtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGFyZ2V0LmZyYWdtZW50ID0gcmVsYXRpdmUuZnJhZ21lbnQ7XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcclxuICAgIH1cclxuICAgIDtcclxuICAgIGZ1bmN0aW9uIHJlc29sdmUoYmFzZVVSSSwgcmVsYXRpdmVVUkksIG9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gc2VyaWFsaXplKHJlc29sdmVDb21wb25lbnRzKHBhcnNlKGJhc2VVUkksIG9wdGlvbnMpLCBwYXJzZShyZWxhdGl2ZVVSSSwgb3B0aW9ucyksIG9wdGlvbnMsIHRydWUpLCBvcHRpb25zKTtcclxuICAgIH1cclxuICAgIDtcclxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZSh1cmksIG9wdGlvbnMpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHVyaSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICB1cmkgPSBzZXJpYWxpemUocGFyc2UodXJpLCBvcHRpb25zKSwgb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVPZih1cmkpID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgIHVyaSA9IHBhcnNlKHNlcmlhbGl6ZSh1cmksIG9wdGlvbnMpLCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVyaTtcclxuICAgIH1cclxuICAgIDtcclxuICAgIGZ1bmN0aW9uIGVxdWFsKHVyaUEsIHVyaUIsIG9wdGlvbnMpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHVyaUEgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgdXJpQSA9IHNlcmlhbGl6ZShwYXJzZSh1cmlBLCBvcHRpb25zKSwgb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVPZih1cmlBKSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICB1cmlBID0gc2VyaWFsaXplKHVyaUEsIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHVyaUIgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgdXJpQiA9IHNlcmlhbGl6ZShwYXJzZSh1cmlCLCBvcHRpb25zKSwgb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVPZih1cmlCKSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICB1cmlCID0gc2VyaWFsaXplKHVyaUIsIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdXJpQSA9PT0gdXJpQjtcclxuICAgIH1cclxuICAgIDtcclxuICAgIGZ1bmN0aW9uIGVzY2FwZUNvbXBvbmVudChzdHIsIG9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gc3RyICYmIHN0ci50b1N0cmluZygpLnJlcGxhY2UoKCFVUklfX0lSSV9TVVBQT1JUIHx8ICFvcHRpb25zIHx8ICFvcHRpb25zLmlyaSA/IFVSSV9QUk9UT0NPTC5FU0NBUEUgOiBJUklfUFJPVE9DT0wuRVNDQVBFKSwgcGN0RW5jQ2hhcik7XHJcbiAgICB9XHJcbiAgICA7XHJcbiAgICBmdW5jdGlvbiB1bmVzY2FwZUNvbXBvbmVudChzdHIsIG9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gc3RyICYmIHN0ci50b1N0cmluZygpLnJlcGxhY2UoKCFVUklfX0lSSV9TVVBQT1JUIHx8ICFvcHRpb25zIHx8ICFvcHRpb25zLmlyaSA/IFVSSV9QUk9UT0NPTC5QQ1RfRU5DT0RFRCA6IElSSV9QUk9UT0NPTC5QQ1RfRU5DT0RFRCksIHBjdERlY0NoYXJzKTtcclxuICAgIH1cclxuICAgIDtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgSVJJX1NVUFBPUlQ6IFVSSV9fSVJJX1NVUFBPUlQsXHJcbiAgICAgICAgVkFMSURBVEVfU1VQUE9SVDogVVJJX19WQUxJREFURV9TVVBQT1JULFxyXG4gICAgICAgIHBjdEVuY0NoYXI6IHBjdEVuY0NoYXIsXHJcbiAgICAgICAgcGN0RGVjQ2hhcnM6IHBjdERlY0NoYXJzLFxyXG4gICAgICAgIFNDSEVNRVM6IFNDSEVNRVMsXHJcbiAgICAgICAgcGFyc2U6IHBhcnNlLFxyXG4gICAgICAgIF9yZWNvbXBvc2VBdXRob3JpdHk6IF9yZWNvbXBvc2VBdXRob3JpdHksXHJcbiAgICAgICAgcmVtb3ZlRG90U2VnbWVudHM6IHJlbW92ZURvdFNlZ21lbnRzLFxyXG4gICAgICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplLFxyXG4gICAgICAgIHJlc29sdmVDb21wb25lbnRzOiByZXNvbHZlQ29tcG9uZW50cyxcclxuICAgICAgICByZXNvbHZlOiByZXNvbHZlLFxyXG4gICAgICAgIG5vcm1hbGl6ZTogbm9ybWFsaXplLFxyXG4gICAgICAgIGVxdWFsOiBlcXVhbCxcclxuICAgICAgICBlc2NhcGVDb21wb25lbnQ6IGVzY2FwZUNvbXBvbmVudCxcclxuICAgICAgICB1bmVzY2FwZUNvbXBvbmVudDogdW5lc2NhcGVDb21wb25lbnRcclxuICAgIH07XHJcbn0pKCk7XHJcbmlmICghQ09NUElMRUQgJiYgdHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICB2YXIgcHVueWNvZGUgPSByZXF1aXJlKFwiLi9wdW55Y29kZVwiKTtcclxuICAgIG1vZHVsZS5leHBvcnRzID0gVVJJO1xyXG4gICAgcmVxdWlyZShcIi4vc2NoZW1lc1wiKTtcclxufVxyXG4iXX0= diff --git a/src/lib/resolve.js b/src/lib/resolve.js index 299915a..7e984b3 100644 --- a/src/lib/resolve.js +++ b/src/lib/resolve.js @@ -1,13 +1,13 @@ -import * as JsonRefs from './../../lib/json-refs-standalone-min'; +import * as JsonRefs from './../../lib/json-refs-standalone'; export function jsonref(schema, callBack) { let promise = new Promise( function(resolve, reject) { JsonRefs.resolveRefs(schema, { - "filter": [ 'relative', 'local' ] + "filter": [ 'relative', 'local', 'remote' ] }) - .then(function(res) { resolve(res.resolved); }) - .catch(function(err) { reject(new Error(err)); }); + .then((res) => { resolve(res.resolved); }) + .catch((err) => { reject(new Error(err)); }); } ); diff --git a/src/lib/resolve.spec.js b/src/lib/resolve.spec.js index b67508c..9b3a4be 100644 --- a/src/lib/resolve.spec.js +++ b/src/lib/resolve.spec.js @@ -79,13 +79,23 @@ describe('resolve.js', () => { } }; + const remote = { + "id": "http://some.site.somewhere/entry-schema#", + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "test remote schema resolution", + "type": "object", + "properties": { + "relative": { "$ref": "https://raw.githubusercontent.com/json-schema-org/json-schema-org.github.io/master/geo" } + } + }; + it('should contain a function for resolving relative & local references', () => { jsonref.should.be.an('function'); }) describe('jsonref', () => { - it('should resolve json-ref via promise', (done) => { + it('should resolve relative json-ref via promise', (done) => { jsonref(schema) .then((resolved) => { resolved.properties.storage.oneOf[0].properties.should.have.property('device'); @@ -102,12 +112,21 @@ describe('resolve.js', () => { }); }); - it('should resolve json-ref via callback', (done) => { + it('should resolve relative json-ref via callback', (done) => { jsonref(schema, function(error, resolved) { if (error) done(error); resolved.properties.storage.oneOf[0].properties.should.have.property('device'); done(); }); }); + + //I believe this only fails in phantomjs due to https://github.com/ariya/phantomjs/issues/11195 + it('should resolve remote json-ref via callback', (done) => { + jsonref(remote, function(error, resolved) { + if (error) done(error); + //resolved.properties.relative.latitude.type.should.equal('number'); + done(); + }); + }); }); });